From fa79473ecedfc9ce074022c966e84fa68cdd0ed1 Mon Sep 17 00:00:00 2001 From: hstyi Date: Sat, 25 Jan 2025 14:58:48 +0800 Subject: [PATCH] chore: optimize key encoder --- .../app/termora/terminal/KeyEncoderImpl.kt | 55 ++++++++++--------- .../app/termora/terminal/TerminalModelImpl.kt | 12 ++-- 2 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/main/kotlin/app/termora/terminal/KeyEncoderImpl.kt b/src/main/kotlin/app/termora/terminal/KeyEncoderImpl.kt index 98eeddf..88576e0 100644 --- a/src/main/kotlin/app/termora/terminal/KeyEncoderImpl.kt +++ b/src/main/kotlin/app/termora/terminal/KeyEncoderImpl.kt @@ -1,13 +1,14 @@ package app.termora.terminal import com.formdev.flatlaf.util.SystemInfo +import org.apache.commons.lang3.StringUtils import java.awt.event.KeyEvent @Suppress("MemberVisibilityCanBePrivate") open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataListener { private val mapping = mutableMapOf() - private val nothing = String() + private val nothing = StringUtils.EMPTY init { @@ -27,6 +28,7 @@ open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataList configureLeftRight() + // Ctrl + C putCode(TerminalKeyEvent(keyCode = 8), String(byteArrayOf(127))) // Enter @@ -38,15 +40,15 @@ open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataList // Page Up - putCode(TerminalKeyEvent(keyCode = 0x21), encode = "${ControlCharacters.ESC}[5~") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_PAGE_UP), encode = "${ControlCharacters.ESC}[5~") // Page Down - putCode(TerminalKeyEvent(keyCode = 0x22), encode = "${ControlCharacters.ESC}[6~") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_PAGE_DOWN), encode = "${ControlCharacters.ESC}[6~") // Insert - putCode(TerminalKeyEvent(keyCode = 0x9B), encode = "${ControlCharacters.ESC}[2~") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_INSERT), encode = "${ControlCharacters.ESC}[2~") // Delete - putCode(TerminalKeyEvent(keyCode = 0x7F), encode = "${ControlCharacters.ESC}[3~") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_DELETE), encode = "${ControlCharacters.ESC}[3~") // Function Keys putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_F1), encode = "${ControlCharacters.ESC}OP") @@ -84,26 +86,29 @@ open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataList fun arrowKeysApplicationSequences() { // Up - putCode(TerminalKeyEvent(keyCode = 0x26), encode = "${ControlCharacters.ESC}OA") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_UP), encode = "${ControlCharacters.ESC}OA") // Down - putCode(TerminalKeyEvent(keyCode = 0x28), encode = "${ControlCharacters.ESC}OB") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_DOWN), encode = "${ControlCharacters.ESC}OB") // Left - putCode(TerminalKeyEvent(keyCode = 0x25), encode = "${ControlCharacters.ESC}OD") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_LEFT), encode = "${ControlCharacters.ESC}OD") // Right - putCode(TerminalKeyEvent(keyCode = 0x27), encode = "${ControlCharacters.ESC}OC") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_RIGHT), encode = "${ControlCharacters.ESC}OC") } fun arrowKeysAnsiCursorSequences() { // Up - putCode(TerminalKeyEvent(keyCode = 0x26), encode = "${ControlCharacters.ESC}[A") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_UP), encode = "${ControlCharacters.ESC}[A") // Down - putCode(TerminalKeyEvent(keyCode = 0x28), encode = "${ControlCharacters.ESC}[B") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_DOWN), encode = "${ControlCharacters.ESC}[B") // Left - putCode(TerminalKeyEvent(keyCode = 0x25), encode = "${ControlCharacters.ESC}[D") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_LEFT), encode = "${ControlCharacters.ESC}[D") // Right - putCode(TerminalKeyEvent(keyCode = 0x27), encode = "${ControlCharacters.ESC}[C") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_RIGHT), encode = "${ControlCharacters.ESC}[C") } + /** + * Alt + Left/Right + */ fun configureLeftRight() { if (SystemInfo.isMacOS) { putCode( @@ -141,32 +146,32 @@ open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataList fun keypadApplicationSequences() { // Up - putCode(TerminalKeyEvent(keyCode = 0xE0), encode = "${ControlCharacters.ESC}OA") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_UP), encode = "${ControlCharacters.ESC}OA") // Down - putCode(TerminalKeyEvent(keyCode = 0xE1), encode = "${ControlCharacters.ESC}OB") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_DOWN), encode = "${ControlCharacters.ESC}OB") // Left - putCode(TerminalKeyEvent(keyCode = 0xE2), encode = "${ControlCharacters.ESC}OD") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_LEFT), encode = "${ControlCharacters.ESC}OD") // Right - putCode(TerminalKeyEvent(keyCode = 0xE3), encode = "${ControlCharacters.ESC}OC") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_RIGHT), encode = "${ControlCharacters.ESC}OC") // Home - putCode(TerminalKeyEvent(keyCode = 0x24), encode = "${ControlCharacters.ESC}OH") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_HOME), encode = "${ControlCharacters.ESC}OH") // End - putCode(TerminalKeyEvent(keyCode = 0x23), encode = "${ControlCharacters.ESC}OF") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_END), encode = "${ControlCharacters.ESC}OF") } fun keypadAnsiSequences() { // Up - putCode(TerminalKeyEvent(keyCode = 0xE0), encode = "${ControlCharacters.ESC}[A") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_UP), encode = "${ControlCharacters.ESC}[A") // Down - putCode(TerminalKeyEvent(keyCode = 0xE1), encode = "${ControlCharacters.ESC}[B") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_DOWN), encode = "${ControlCharacters.ESC}[B") // Left - putCode(TerminalKeyEvent(keyCode = 0xE2), encode = "${ControlCharacters.ESC}[D") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_LEFT), encode = "${ControlCharacters.ESC}[D") // Right - putCode(TerminalKeyEvent(keyCode = 0xE3), encode = "${ControlCharacters.ESC}[C") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_RIGHT), encode = "${ControlCharacters.ESC}[C") // Home - putCode(TerminalKeyEvent(keyCode = 0x24), encode = "${ControlCharacters.ESC}[H") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_HOME), encode = "${ControlCharacters.ESC}[H") // End - putCode(TerminalKeyEvent(keyCode = 0x23), encode = "${ControlCharacters.ESC}[F") + putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_END), encode = "${ControlCharacters.ESC}[F") } override fun onChanged(key: DataKey<*>, data: Any) { diff --git a/src/main/kotlin/app/termora/terminal/TerminalModelImpl.kt b/src/main/kotlin/app/termora/terminal/TerminalModelImpl.kt index 46dc063..f70a9ed 100644 --- a/src/main/kotlin/app/termora/terminal/TerminalModelImpl.kt +++ b/src/main/kotlin/app/termora/terminal/TerminalModelImpl.kt @@ -1,5 +1,6 @@ package app.termora.terminal +import org.apache.commons.lang3.ArrayUtils import org.slf4j.LoggerFactory import java.awt.Toolkit import kotlin.reflect.cast @@ -8,7 +9,7 @@ open class TerminalModelImpl(private val terminal: Terminal) : TerminalModel { private var rows: Int = 27 private var cols: Int = 80 private val data = mutableMapOf, Any>() - private val listeners = mutableListOf() + private var listeners = emptyArray() private val colorPalette = ColorPaletteImpl(terminal) companion object { @@ -92,11 +93,11 @@ open class TerminalModelImpl(private val terminal: Terminal) : TerminalModel { } override fun addDataListener(listener: DataListener) { - listeners.add(listener) + listeners = ArrayUtils.add(listeners, listener) } override fun removeDataListener(listener: DataListener) { - listeners.remove(listener) + listeners = ArrayUtils.removeElement(listeners, listener) } override fun bell() { @@ -129,9 +130,8 @@ open class TerminalModelImpl(private val terminal: Terminal) : TerminalModel { @Suppress("MemberVisibilityCanBePrivate") protected fun fireDataChanged(key: DataKey, data: T) { - val size = listeners.size - for (i in 0 until size) { - listeners.getOrNull(i)?.onChanged(key, data) + for (listener in listeners) { + listener.onChanged(key, data) } }