diff --git a/build.gradle.kts b/build.gradle.kts index 737698c..94783fe 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -34,6 +34,7 @@ dependencies { instrumentationTools() } extraResources(project(mapOf("path" to ":native", "configuration" to "results"))) + implementation("io.gitlab.jfronny:commons:2.0.0-SNAPSHOT") implementation("io.gitlab.jfronny:commons-unsafe:2.0.0-SNAPSHOT") // implementation("com.github.hypfvieh:dbus-java-core:5.0.0") // implementation("com.github.hypfvieh:dbus-java-transport-native-unixsocket:5.0.0") diff --git a/src/main/kotlin/io/gitlab/jfronny/globalmenu/Utils.kt b/src/main/kotlin/io/gitlab/jfronny/globalmenu/Utils.kt new file mode 100644 index 0000000..21d2b46 --- /dev/null +++ b/src/main/kotlin/io/gitlab/jfronny/globalmenu/Utils.kt @@ -0,0 +1,20 @@ +package io.gitlab.jfronny.globalmenu + +import io.gitlab.jfronny.commons.MultiConsumer + +@PublishedApi internal class Node(val value: T, var next: Node? = null) +inline fun buildArray(generate: MultiConsumer.() -> Unit): Array { + var length = 0 + var head: Node? = null + MultiConsumer { value -> + head = Node(value, head) + length++ + }.generate() + val array = arrayOfNulls(length) + while (head != null) { + array[--length] = head!!.value + head = head!!.next + } + @Suppress("UNCHECKED_CAST") + return array as Array +} \ No newline at end of file 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 1778c83..ae67ae6 100644 --- a/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/SwingMenu.kt +++ b/src/main/kotlin/io/gitlab/jfronny/globalmenu/proxy/SwingMenu.kt @@ -5,6 +5,7 @@ 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 io.gitlab.jfronny.globalmenu.buildArray import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking @@ -49,23 +50,18 @@ class SwingMenu(private val menuItem: JMenuItem?, override val id: Int, private } } override val shortcut: Array? get() = menuItem?.accelerator?.let { ks -> - val s = getModifiers(ks.modifiers) - val vk = keyEvents[ks.keyCode] ?: "UNKNOWN" - val l = mutableListOf() - l.addAll(s) - l.add(vk) - l.toTypedArray() - } - - private fun getModifiers(modifiers: Int): List = buildList { - if (modifiers and InputEvent.SHIFT_DOWN_MASK != 0) add("Shift") - if (modifiers and InputEvent.CTRL_DOWN_MASK != 0) add("Ctrl") - if (modifiers and InputEvent.META_DOWN_MASK != 0) add("Meta") - if (modifiers and InputEvent.ALT_DOWN_MASK != 0) add("Alt") - if (modifiers and InputEvent.ALT_GRAPH_DOWN_MASK != 0) add("AltGraph") - if (modifiers and InputEvent.BUTTON1_DOWN_MASK != 0) add("Button1") - if (modifiers and InputEvent.BUTTON2_DOWN_MASK != 0) add("Button2") - if (modifiers and InputEvent.BUTTON3_DOWN_MASK != 0) add("Button3") + buildArray { + val modifiers = ks.modifiers + if (modifiers and InputEvent.SHIFT_DOWN_MASK != 0) accept("Shift") + if (modifiers and InputEvent.CTRL_DOWN_MASK != 0) accept("Ctrl") + if (modifiers and InputEvent.META_DOWN_MASK != 0) accept("Meta") + if (modifiers and InputEvent.ALT_DOWN_MASK != 0) accept("Alt") + if (modifiers and InputEvent.ALT_GRAPH_DOWN_MASK != 0) accept("AltGraph") + if (modifiers and InputEvent.BUTTON1_DOWN_MASK != 0) accept("Button1") + if (modifiers and InputEvent.BUTTON2_DOWN_MASK != 0) accept("Button2") + if (modifiers and InputEvent.BUTTON3_DOWN_MASK != 0) accept("Button3") + accept(keyEvents[ks.keyCode] ?: "UNKNOWN") + } } override val toggleType: String? get() = when (menuItem) {