mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 02:12:58 +08:00
chore: optimize key encoder
This commit is contained in:
@@ -1,13 +1,14 @@
|
|||||||
package app.termora.terminal
|
package app.termora.terminal
|
||||||
|
|
||||||
import com.formdev.flatlaf.util.SystemInfo
|
import com.formdev.flatlaf.util.SystemInfo
|
||||||
|
import org.apache.commons.lang3.StringUtils
|
||||||
import java.awt.event.KeyEvent
|
import java.awt.event.KeyEvent
|
||||||
|
|
||||||
@Suppress("MemberVisibilityCanBePrivate")
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataListener {
|
open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataListener {
|
||||||
|
|
||||||
private val mapping = mutableMapOf<TerminalKeyEvent, String>()
|
private val mapping = mutableMapOf<TerminalKeyEvent, String>()
|
||||||
private val nothing = String()
|
private val nothing = StringUtils.EMPTY
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
|
||||||
@@ -27,6 +28,7 @@ open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataList
|
|||||||
|
|
||||||
configureLeftRight()
|
configureLeftRight()
|
||||||
|
|
||||||
|
// Ctrl + C
|
||||||
putCode(TerminalKeyEvent(keyCode = 8), String(byteArrayOf(127)))
|
putCode(TerminalKeyEvent(keyCode = 8), String(byteArrayOf(127)))
|
||||||
|
|
||||||
// Enter
|
// Enter
|
||||||
@@ -38,15 +40,15 @@ open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataList
|
|||||||
|
|
||||||
|
|
||||||
// Page Up
|
// Page Up
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x21), encode = "${ControlCharacters.ESC}[5~")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_PAGE_UP), encode = "${ControlCharacters.ESC}[5~")
|
||||||
// Page Down
|
// Page Down
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x22), encode = "${ControlCharacters.ESC}[6~")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_PAGE_DOWN), encode = "${ControlCharacters.ESC}[6~")
|
||||||
|
|
||||||
|
|
||||||
// Insert
|
// Insert
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x9B), encode = "${ControlCharacters.ESC}[2~")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_INSERT), encode = "${ControlCharacters.ESC}[2~")
|
||||||
// Delete
|
// Delete
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x7F), encode = "${ControlCharacters.ESC}[3~")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_DELETE), encode = "${ControlCharacters.ESC}[3~")
|
||||||
|
|
||||||
// Function Keys
|
// Function Keys
|
||||||
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_F1), encode = "${ControlCharacters.ESC}OP")
|
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() {
|
fun arrowKeysApplicationSequences() {
|
||||||
// Up
|
// Up
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x26), encode = "${ControlCharacters.ESC}OA")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_UP), encode = "${ControlCharacters.ESC}OA")
|
||||||
// Down
|
// Down
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x28), encode = "${ControlCharacters.ESC}OB")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_DOWN), encode = "${ControlCharacters.ESC}OB")
|
||||||
// Left
|
// Left
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x25), encode = "${ControlCharacters.ESC}OD")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_LEFT), encode = "${ControlCharacters.ESC}OD")
|
||||||
// Right
|
// Right
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x27), encode = "${ControlCharacters.ESC}OC")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_RIGHT), encode = "${ControlCharacters.ESC}OC")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun arrowKeysAnsiCursorSequences() {
|
fun arrowKeysAnsiCursorSequences() {
|
||||||
// Up
|
// Up
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x26), encode = "${ControlCharacters.ESC}[A")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_UP), encode = "${ControlCharacters.ESC}[A")
|
||||||
// Down
|
// Down
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x28), encode = "${ControlCharacters.ESC}[B")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_DOWN), encode = "${ControlCharacters.ESC}[B")
|
||||||
// Left
|
// Left
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x25), encode = "${ControlCharacters.ESC}[D")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_LEFT), encode = "${ControlCharacters.ESC}[D")
|
||||||
// Right
|
// Right
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x27), encode = "${ControlCharacters.ESC}[C")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_RIGHT), encode = "${ControlCharacters.ESC}[C")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Alt + Left/Right
|
||||||
|
*/
|
||||||
fun configureLeftRight() {
|
fun configureLeftRight() {
|
||||||
if (SystemInfo.isMacOS) {
|
if (SystemInfo.isMacOS) {
|
||||||
putCode(
|
putCode(
|
||||||
@@ -141,32 +146,32 @@ open class KeyEncoderImpl(private val terminal: Terminal) : KeyEncoder, DataList
|
|||||||
|
|
||||||
fun keypadApplicationSequences() {
|
fun keypadApplicationSequences() {
|
||||||
// Up
|
// Up
|
||||||
putCode(TerminalKeyEvent(keyCode = 0xE0), encode = "${ControlCharacters.ESC}OA")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_UP), encode = "${ControlCharacters.ESC}OA")
|
||||||
// Down
|
// Down
|
||||||
putCode(TerminalKeyEvent(keyCode = 0xE1), encode = "${ControlCharacters.ESC}OB")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_DOWN), encode = "${ControlCharacters.ESC}OB")
|
||||||
// Left
|
// Left
|
||||||
putCode(TerminalKeyEvent(keyCode = 0xE2), encode = "${ControlCharacters.ESC}OD")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_LEFT), encode = "${ControlCharacters.ESC}OD")
|
||||||
// Right
|
// Right
|
||||||
putCode(TerminalKeyEvent(keyCode = 0xE3), encode = "${ControlCharacters.ESC}OC")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_RIGHT), encode = "${ControlCharacters.ESC}OC")
|
||||||
// Home
|
// Home
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x24), encode = "${ControlCharacters.ESC}OH")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_HOME), encode = "${ControlCharacters.ESC}OH")
|
||||||
// End
|
// End
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x23), encode = "${ControlCharacters.ESC}OF")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_END), encode = "${ControlCharacters.ESC}OF")
|
||||||
}
|
}
|
||||||
|
|
||||||
fun keypadAnsiSequences() {
|
fun keypadAnsiSequences() {
|
||||||
// Up
|
// Up
|
||||||
putCode(TerminalKeyEvent(keyCode = 0xE0), encode = "${ControlCharacters.ESC}[A")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_UP), encode = "${ControlCharacters.ESC}[A")
|
||||||
// Down
|
// Down
|
||||||
putCode(TerminalKeyEvent(keyCode = 0xE1), encode = "${ControlCharacters.ESC}[B")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_DOWN), encode = "${ControlCharacters.ESC}[B")
|
||||||
// Left
|
// Left
|
||||||
putCode(TerminalKeyEvent(keyCode = 0xE2), encode = "${ControlCharacters.ESC}[D")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_LEFT), encode = "${ControlCharacters.ESC}[D")
|
||||||
// Right
|
// Right
|
||||||
putCode(TerminalKeyEvent(keyCode = 0xE3), encode = "${ControlCharacters.ESC}[C")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_KP_RIGHT), encode = "${ControlCharacters.ESC}[C")
|
||||||
// Home
|
// Home
|
||||||
putCode(TerminalKeyEvent(keyCode = 0x24), encode = "${ControlCharacters.ESC}[H")
|
putCode(TerminalKeyEvent(keyCode = KeyEvent.VK_HOME), encode = "${ControlCharacters.ESC}[H")
|
||||||
// End
|
// 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) {
|
override fun onChanged(key: DataKey<*>, data: Any) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package app.termora.terminal
|
package app.termora.terminal
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.ArrayUtils
|
||||||
import org.slf4j.LoggerFactory
|
import org.slf4j.LoggerFactory
|
||||||
import java.awt.Toolkit
|
import java.awt.Toolkit
|
||||||
import kotlin.reflect.cast
|
import kotlin.reflect.cast
|
||||||
@@ -8,7 +9,7 @@ open class TerminalModelImpl(private val terminal: Terminal) : TerminalModel {
|
|||||||
private var rows: Int = 27
|
private var rows: Int = 27
|
||||||
private var cols: Int = 80
|
private var cols: Int = 80
|
||||||
private val data = mutableMapOf<DataKey<*>, Any>()
|
private val data = mutableMapOf<DataKey<*>, Any>()
|
||||||
private val listeners = mutableListOf<DataListener>()
|
private var listeners = emptyArray<DataListener>()
|
||||||
private val colorPalette = ColorPaletteImpl(terminal)
|
private val colorPalette = ColorPaletteImpl(terminal)
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
@@ -92,11 +93,11 @@ open class TerminalModelImpl(private val terminal: Terminal) : TerminalModel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun addDataListener(listener: DataListener) {
|
override fun addDataListener(listener: DataListener) {
|
||||||
listeners.add(listener)
|
listeners = ArrayUtils.add(listeners, listener)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun removeDataListener(listener: DataListener) {
|
override fun removeDataListener(listener: DataListener) {
|
||||||
listeners.remove(listener)
|
listeners = ArrayUtils.removeElement(listeners, listener)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun bell() {
|
override fun bell() {
|
||||||
@@ -129,9 +130,8 @@ open class TerminalModelImpl(private val terminal: Terminal) : TerminalModel {
|
|||||||
|
|
||||||
@Suppress("MemberVisibilityCanBePrivate")
|
@Suppress("MemberVisibilityCanBePrivate")
|
||||||
protected fun <T : Any> fireDataChanged(key: DataKey<T>, data: T) {
|
protected fun <T : Any> fireDataChanged(key: DataKey<T>, data: T) {
|
||||||
val size = listeners.size
|
for (listener in listeners) {
|
||||||
for (i in 0 until size) {
|
listener.onChanged(key, data)
|
||||||
listeners.getOrNull(i)?.onChanged(key, data)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user