From 015190af19783a14d346393f888f3e28d07144b1 Mon Sep 17 00:00:00 2001 From: JFronny Date: Mon, 22 Jul 2024 17:00:55 +0200 Subject: [PATCH] perf: make icon lazy and add some performance notes --- build.gradle.kts | 9 +++++++-- .../gitlab/jfronny/globalmenu/GlobalMenu.kt | 1 + .../jfronny/globalmenu/proxy/DbusmenuImpl.kt | 4 ++-- .../jfronny/globalmenu/proxy/SwingMenu.kt | 19 +++++++++---------- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 003d0b1..dd26515 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -144,7 +144,9 @@ tasks { } buildSearchableOptions { - jvmArgs("-Dio.gitlab.jfronny.globalmenu.disable") + jvmArgs( + "-Dio.gitlab.jfronny.globalmenu.disable" + ) } // Set the JVM compatibility versions @@ -172,6 +174,9 @@ tasks { } runIde { - this.jvmArgs("-Dawt.toolkit.name=WLToolkit") + jvmArgs( + "-Dawt.toolkit.name=WLToolkit", +// "-Dio.gitlab.jfronny.globalmenu.debug" + ) } } diff --git a/src/main/kotlin/io/gitlab/jfronny/globalmenu/GlobalMenu.kt b/src/main/kotlin/io/gitlab/jfronny/globalmenu/GlobalMenu.kt index 5eea2b9..c445336 100644 --- a/src/main/kotlin/io/gitlab/jfronny/globalmenu/GlobalMenu.kt +++ b/src/main/kotlin/io/gitlab/jfronny/globalmenu/GlobalMenu.kt @@ -3,6 +3,7 @@ package io.gitlab.jfronny.globalmenu import com.intellij.openapi.diagnostic.Logger object GlobalMenu { + val debugging = System.getProperty("io.gitlab.jfronny.globalmenu.debug") != null val Log: Logger = Logger.getInstance(GlobalMenu::class.java) val Native = Native() val Cleaner = java.lang.ref.Cleaner.create() diff --git a/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/DbusmenuImpl.kt b/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/DbusmenuImpl.kt index e27ca18..0ccad4c 100644 --- a/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/DbusmenuImpl.kt +++ b/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/DbusmenuImpl.kt @@ -72,7 +72,7 @@ class DbusmenuImpl(windowId: Long, private val menuHolder: MenuHolder) : Dbusmen } override fun Event(id: Int, eventId: String, data: Variant<*>?, timestamp: UInt32?) { - GlobalMenu.Log.warn("Event $eventId for menu $id (${menuHolder.find(id)})") + if (GlobalMenu.debugging) GlobalMenu.Log.warn("Event $eventId for menu $id (${menuHolder.find(id)})") try { when (eventId) { "clicked" -> menuHolder.find(id)?.onEvent() @@ -86,7 +86,7 @@ class DbusmenuImpl(windowId: Long, private val menuHolder: MenuHolder) : Dbusmen override fun EventGroup(events: MutableList?): MutableList? = null // not needed? override fun AboutToShow(id: Int): Boolean { - GlobalMenu.Log.warn("About to show menu $id") + if (GlobalMenu.debugging) GlobalMenu.Log.warn("About to show menu $id") try { menuHolder.find(id)?.update() return true diff --git a/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/SwingMenu.kt b/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/SwingMenu.kt index 168af7a..8cad00c 100644 --- a/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/SwingMenu.kt +++ b/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/SwingMenu.kt @@ -5,20 +5,17 @@ import com.intellij.openapi.actionSystem.impl.ActionMenuItem import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.EDT import io.gitlab.jfronny.globalmenu.GlobalMenu -import kotlinx.coroutines.* +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.runBlocking import org.apache.commons.io.output.ByteArrayOutputStream -import java.awt.event.ActionEvent import java.awt.event.InputEvent import java.awt.event.KeyEvent import java.awt.image.BufferedImage import java.lang.reflect.Modifier import java.util.* import javax.imageio.ImageIO -import javax.swing.JCheckBoxMenuItem -import javax.swing.JMenu -import javax.swing.JMenuItem -import javax.swing.JRadioButtonMenuItem -import javax.swing.JSeparator +import javax.swing.* class SwingMenu(private val menuItem: JMenuItem?, private val holder: SwingMenuHolder) : Menu { override val id = holder.getId(menuItem) @@ -26,7 +23,9 @@ class SwingMenu(private val menuItem: JMenuItem?, private val holder: SwingMenuH override val label: String get() = menuItem?.text ?: "" override val isEnabled: Boolean get() = menuItem?.isEnabled ?: false override val isVisible: Boolean get() = menuItem?.isVisible ?: false - override val iconData: ByteArray? get() = menuItem?.icon?.let { icon -> + override val iconData: ByteArray? by lazy { menuItem?.icon?.let { icon -> + // This is somewhat expensive, but we need to do it + // At least avoid doing it multiple times val width = icon.iconWidth val height = icon.iconHeight @@ -46,7 +45,7 @@ class SwingMenu(private val menuItem: JMenuItem?, private val holder: SwingMenuH GlobalMenu.Log.error("Failed to convert icon to byte array", e) null } - } + } } override val shortcut: Array? get() = menuItem?.accelerator?.let { ks -> val s = getModifiersText(ks.modifiers) @@ -129,7 +128,7 @@ class SwingMenu(private val menuItem: JMenuItem?, private val holder: SwingMenuH if (each is ActionMenu) { each.removeAll() each.isSelected = true - each.fillMenu() + each.fillMenu() // This is REALLY expensive and on the EDT TODO: find out whether we can avoid it } cmi.syncChildren(deepness - 1) }