From 314c112d4b1c6019ddddbded072a207eb936ec77 Mon Sep 17 00:00:00 2001 From: hstyi Date: Thu, 16 Jan 2025 12:38:43 +0800 Subject: [PATCH] feat: Windows keyboard shortcut (#86) --- .../termora/terminal/panel/TerminalPanel.kt | 5 +++- .../terminal/panel/TerminalPanelKeyAdapter.kt | 2 +- .../panel/TerminalWindowsCopyAction.kt | 22 ++++++++++++++++++ .../panel/TerminalWindowsPasteAction.kt | 23 +++++++++++++++++++ 4 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 src/main/kotlin/app/termora/terminal/panel/TerminalWindowsCopyAction.kt create mode 100644 src/main/kotlin/app/termora/terminal/panel/TerminalWindowsPasteAction.kt diff --git a/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt b/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt index 76e2585..268279d 100644 --- a/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt +++ b/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt @@ -47,7 +47,10 @@ class TerminalPanel(val terminal: Terminal, private val ptyConnector: PtyConnect /** * 键盘事件 */ - private val actions = mutableListOf() + private val actions = mutableListOf( + TerminalWindowsCopyAction(), + TerminalWindowsPasteAction(), + ) /** diff --git a/src/main/kotlin/app/termora/terminal/panel/TerminalPanelKeyAdapter.kt b/src/main/kotlin/app/termora/terminal/panel/TerminalPanelKeyAdapter.kt index 98a6893..1173966 100644 --- a/src/main/kotlin/app/termora/terminal/panel/TerminalPanelKeyAdapter.kt +++ b/src/main/kotlin/app/termora/terminal/panel/TerminalPanelKeyAdapter.kt @@ -52,7 +52,7 @@ class TerminalPanelKeyAdapter( return } - if (Character.isISOControl(e.keyChar)) { + if (Character.isISOControl(e.keyChar) && isCtrlPressedOnly(e)) { terminal.getSelectionModel().clearSelection() // 如果不为空表示已经发送过了,所以这里为空的时候再发送 if (encode.isEmpty()) { diff --git a/src/main/kotlin/app/termora/terminal/panel/TerminalWindowsCopyAction.kt b/src/main/kotlin/app/termora/terminal/panel/TerminalWindowsCopyAction.kt new file mode 100644 index 0000000..74d41d7 --- /dev/null +++ b/src/main/kotlin/app/termora/terminal/panel/TerminalWindowsCopyAction.kt @@ -0,0 +1,22 @@ +package app.termora.terminal.panel + +import app.termora.actions.AnActionEvent +import app.termora.actions.TerminalCopyAction +import com.formdev.flatlaf.util.SystemInfo +import org.apache.commons.lang3.StringUtils +import org.jdesktop.swingx.action.ActionManager +import java.awt.event.InputEvent +import java.awt.event.KeyEvent +import javax.swing.KeyStroke + +class TerminalWindowsCopyAction : TerminalPredicateAction { + private val keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, InputEvent.CTRL_DOWN_MASK) + override fun actionPerformed(e: KeyEvent) { + ActionManager.getInstance().getAction(TerminalCopyAction.COPY) + ?.actionPerformed(AnActionEvent(e.source, StringUtils.EMPTY, e)) + } + + override fun test(keyStroke: KeyStroke, e: KeyEvent): Boolean { + return (SystemInfo.isWindows || SystemInfo.isLinux) && keyStroke == this.keyStroke + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/terminal/panel/TerminalWindowsPasteAction.kt b/src/main/kotlin/app/termora/terminal/panel/TerminalWindowsPasteAction.kt new file mode 100644 index 0000000..3d2be81 --- /dev/null +++ b/src/main/kotlin/app/termora/terminal/panel/TerminalWindowsPasteAction.kt @@ -0,0 +1,23 @@ +package app.termora.terminal.panel + +import app.termora.actions.AnActionEvent +import app.termora.actions.TerminalPasteAction +import com.formdev.flatlaf.util.SystemInfo +import org.apache.commons.lang3.StringUtils +import org.jdesktop.swingx.action.ActionManager +import java.awt.event.InputEvent +import java.awt.event.KeyEvent +import javax.swing.KeyStroke + +class TerminalWindowsPasteAction : TerminalPredicateAction { + private val keyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_INSERT, InputEvent.SHIFT_DOWN_MASK) + + override fun actionPerformed(e: KeyEvent) { + ActionManager.getInstance().getAction(TerminalPasteAction.PASTE) + ?.actionPerformed(AnActionEvent(e.source, StringUtils.EMPTY, e)) + } + + override fun test(keyStroke: KeyStroke, e: KeyEvent): Boolean { + return (SystemInfo.isWindows || SystemInfo.isLinux) && keyStroke == this.keyStroke + } +} \ No newline at end of file