feat: hyperlinks require holding down the function key to open

This commit is contained in:
hstyi
2025-08-09 12:27:46 +08:00
committed by hstyi
parent a77a03d8b3
commit 3fa4064655
2 changed files with 33 additions and 7 deletions

View File

@@ -185,8 +185,9 @@ class TerminalPanel(val tab: TerminalTab?, val terminal: Terminal, private val w
this.addMouseMotionListener(mouseAdapter) this.addMouseMotionListener(mouseAdapter)
// 超链接 // 超链接
val hyperlinkAdapter = TerminalPanelMouseHyperlinkAdapter(this, terminal) val hyperlinkAdapter = TerminalPanelMouseHyperlinkAdapter(this, terminalDisplay, terminal)
this.addMouseListener(hyperlinkAdapter) this.addMouseListener(hyperlinkAdapter)
this.addMouseMotionListener(hyperlinkAdapter)
// 鼠标跟踪 // 鼠标跟踪
val trackingAdapter = TerminalPanelMouseTrackingAdapter(this, terminal, writer) val trackingAdapter = TerminalPanelMouseTrackingAdapter(this, terminal, writer)

View File

@@ -2,6 +2,8 @@ package app.termora.terminal.panel
import app.termora.terminal.ClickableHighlighter import app.termora.terminal.ClickableHighlighter
import app.termora.terminal.Terminal import app.termora.terminal.Terminal
import com.formdev.flatlaf.util.SystemInfo
import java.awt.Cursor
import java.awt.event.MouseAdapter import java.awt.event.MouseAdapter
import java.awt.event.MouseEvent import java.awt.event.MouseEvent
import javax.swing.SwingUtilities import javax.swing.SwingUtilities
@@ -11,19 +13,42 @@ import javax.swing.SwingUtilities
*/ */
class TerminalPanelMouseHyperlinkAdapter( class TerminalPanelMouseHyperlinkAdapter(
private val terminalPanel: TerminalPanel, private val terminalPanel: TerminalPanel,
private val terminalDisplay: TerminalDisplay,
private val terminal: Terminal, private val terminal: Terminal,
) : MouseAdapter() { ) : MouseAdapter() {
override fun mouseClicked(e: MouseEvent) { override fun mouseClicked(e: MouseEvent) {
if (SwingUtilities.isLeftMouseButton(e)) { if (SwingUtilities.isLeftMouseButton(e).not()) {
val position = terminalPanel.pointToPosition(e.point) return
for (highlighter in terminal.getMarkupModel().getHighlighters(position)) { }
if (highlighter is ClickableHighlighter) {
highlighter.onClicked(position) 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
}
} }