From ffcb4d028e5a4a1817583fd6fc25b7627cad7c77 Mon Sep 17 00:00:00 2001 From: hstyi Date: Tue, 7 Jan 2025 18:13:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=20OSC=2052=20?= =?UTF-8?q?=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../OperatingSystemCommandProcessor.kt | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/main/kotlin/app/termora/terminal/OperatingSystemCommandProcessor.kt b/src/main/kotlin/app/termora/terminal/OperatingSystemCommandProcessor.kt index 99ae581..b5316b2 100644 --- a/src/main/kotlin/app/termora/terminal/OperatingSystemCommandProcessor.kt +++ b/src/main/kotlin/app/termora/terminal/OperatingSystemCommandProcessor.kt @@ -1,6 +1,9 @@ package app.termora.terminal +import org.apache.commons.codec.binary.Base64 import org.slf4j.LoggerFactory +import java.awt.Toolkit +import java.awt.datatransfer.StringSelection class OperatingSystemCommandProcessor(terminal: Terminal, reader: TerminalReader) : AbstractProcessor(terminal, reader) { @@ -95,6 +98,25 @@ class OperatingSystemCommandProcessor(terminal: Terminal, reader: TerminalReader replyColor(mode, terminalColor) } + // Ps = 5 2 ⇒ Manipulate Selection Data. These controls may be disabled using the allowWindowOps resource. The parameter Pt is parsed as + 52 -> { + val pair = suffix.split(";", limit = 2).let { + Pair(it.first(), it.last()) + } + + // base64 + if (pair.first == "c") { + val text = String(Base64.decodeBase64(pair.second)) + Toolkit.getDefaultToolkit().systemClipboard.setContents(StringSelection(text), null) + if (log.isDebugEnabled) { + log.debug("Copy {} to clipboard", text) + } + } else if (log.isWarnEnabled) { + log.warn("Manipulate Selection Data. Unknown: {}", pair) + } + + } + else -> { if (log.isWarnEnabled) { log.warn("Unknown OSC: $prefix")