From 3fa40646558563bbbcc9ab13010c4e887d9a2c9d Mon Sep 17 00:00:00 2001 From: hstyi Date: Sat, 9 Aug 2025 12:27:46 +0800 Subject: [PATCH] feat: hyperlinks require holding down the function key to open --- .../termora/terminal/panel/TerminalPanel.kt | 3 +- .../TerminalPanelMouseHyperlinkAdapter.kt | 37 ++++++++++++++++--- 2 files changed, 33 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt b/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt index 5155119..0d15400 100644 --- a/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt +++ b/src/main/kotlin/app/termora/terminal/panel/TerminalPanel.kt @@ -185,8 +185,9 @@ class TerminalPanel(val tab: TerminalTab?, val terminal: Terminal, private val w this.addMouseMotionListener(mouseAdapter) // 超链接 - val hyperlinkAdapter = TerminalPanelMouseHyperlinkAdapter(this, terminal) + val hyperlinkAdapter = TerminalPanelMouseHyperlinkAdapter(this, terminalDisplay, terminal) this.addMouseListener(hyperlinkAdapter) + this.addMouseMotionListener(hyperlinkAdapter) // 鼠标跟踪 val trackingAdapter = TerminalPanelMouseTrackingAdapter(this, terminal, writer) diff --git a/src/main/kotlin/app/termora/terminal/panel/TerminalPanelMouseHyperlinkAdapter.kt b/src/main/kotlin/app/termora/terminal/panel/TerminalPanelMouseHyperlinkAdapter.kt index 65cb3b1..8cd76ae 100644 --- a/src/main/kotlin/app/termora/terminal/panel/TerminalPanelMouseHyperlinkAdapter.kt +++ b/src/main/kotlin/app/termora/terminal/panel/TerminalPanelMouseHyperlinkAdapter.kt @@ -2,6 +2,8 @@ package app.termora.terminal.panel import app.termora.terminal.ClickableHighlighter import app.termora.terminal.Terminal +import com.formdev.flatlaf.util.SystemInfo +import java.awt.Cursor import java.awt.event.MouseAdapter import java.awt.event.MouseEvent import javax.swing.SwingUtilities @@ -11,19 +13,42 @@ import javax.swing.SwingUtilities */ class TerminalPanelMouseHyperlinkAdapter( private val terminalPanel: TerminalPanel, + private val terminalDisplay: TerminalDisplay, private val terminal: Terminal, ) : MouseAdapter() { override fun mouseClicked(e: MouseEvent) { - if (SwingUtilities.isLeftMouseButton(e)) { - val position = terminalPanel.pointToPosition(e.point) - for (highlighter in terminal.getMarkupModel().getHighlighters(position)) { - if (highlighter is ClickableHighlighter) { - highlighter.onClicked(position) - } + if (SwingUtilities.isLeftMouseButton(e).not()) { + return + } + + if (SystemInfo.isMacOS) { + if (e.isMetaDown.not()) + return + } else if (e.isControlDown.not()) { + return + } + + val position = terminalPanel.pointToPosition(e.point) + for (highlighter in terminal.getMarkupModel().getHighlighters(position)) { + if (highlighter is ClickableHighlighter) { + highlighter.onClicked(position) } } } + override fun mouseMoved(e: MouseEvent) { + val position = terminalPanel.pointToPosition(e.point) + var cursor = Cursor.getPredefinedCursor(Cursor.TEXT_CURSOR) + for (highlighter in terminal.getMarkupModel().getHighlighters(position)) { + if (highlighter is ClickableHighlighter) { + cursor = if (SystemInfo.isMacOS) Cursor.getDefaultCursor() + else Cursor.getPredefinedCursor(Cursor.HAND_CURSOR) + break + } + } + terminalDisplay.cursor = cursor + } + } \ No newline at end of file