96 lines
3.3 KiB
Diff
96 lines
3.3 KiB
Diff
From fa8f6054c992f8f28781933a23bccb91b3341d6e Mon Sep 17 00:00:00 2001
|
|
From: Christian Muehlhaeuser <muesli@gmail.com>
|
|
Date: Tue, 8 Nov 2022 08:55:14 +0100
|
|
Subject: [PATCH] Add support for OSC-52 write-only clipboard access
|
|
|
|
Implements OSC-52 write-only clipboard access. Already supported by
|
|
a wide range of other terminals, including alacritty, foot, kitty,
|
|
urxvt, wezterm, xterm, and others.
|
|
|
|
I've intentionally omitted read access to the clipboard as that
|
|
comes with several security concerns, which should be discussed
|
|
first.
|
|
---
|
|
src/Vt102Emulation.cpp | 36 ++++++++++++++++++++++++++++++++++++
|
|
src/Vt102Emulation.h | 2 +-
|
|
2 files changed, 37 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/src/Vt102Emulation.cpp b/src/Vt102Emulation.cpp
|
|
index 49b23c77d4..3b1e389106 100644
|
|
--- a/src/Vt102Emulation.cpp
|
|
+++ b/src/Vt102Emulation.cpp
|
|
@@ -12,8 +12,10 @@
|
|
#include <cstdio>
|
|
|
|
// Qt
|
|
+#include <QApplication>
|
|
#include <QAudioOutput>
|
|
#include <QBuffer>
|
|
+#include <QClipboard>
|
|
#include <QEvent>
|
|
#include <QKeyEvent>
|
|
#include <QTimer>
|
|
@@ -1153,6 +1155,40 @@ void Vt102Emulation::processSessionAttributeRequest(const int tokenSize, const u
|
|
connect(action, &KNotificationAction::activated, this, [this, notification]() {
|
|
_currentScreen->currentTerminalDisplay()->notificationClicked(notification->xdgActivationToken());
|
|
});
|
|
+ }
|
|
+ if (attribute == Clipboard) {
|
|
+ // Clipboard
|
|
+ QStringList params = value.split(QLatin1Char(';'));
|
|
+ if (params.length() == 0) {
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ bool clipboard = false;
|
|
+ bool selection = false;
|
|
+ if (params[0].isEmpty() || params[0].contains(QLatin1Char('c')) || params[0].contains(QLatin1Char('s'))) {
|
|
+ clipboard = true;
|
|
+ }
|
|
+ if (params[0].contains(QLatin1Char('p'))) {
|
|
+ selection = true;
|
|
+ }
|
|
+
|
|
+ if (params.length() == 2) {
|
|
+ // Copy to clipboard
|
|
+ if (clipboard) {
|
|
+ QApplication::clipboard()->setText(QString::fromUtf8(QByteArray::fromBase64(params[1].toUtf8())), QClipboard::Clipboard);
|
|
+ }
|
|
+ if (selection) {
|
|
+ QApplication::clipboard()->setText(QString::fromUtf8(QByteArray::fromBase64(params[1].toUtf8())), QClipboard::Selection);
|
|
+ }
|
|
+ } else {
|
|
+ // Clear clipboard
|
|
+ if (clipboard) {
|
|
+ QApplication::clipboard()->clear(QClipboard::Clipboard);
|
|
+ }
|
|
+ if (selection) {
|
|
+ QApplication::clipboard()->clear(QClipboard::Selection);
|
|
+ }
|
|
+ }
|
|
|
|
return;
|
|
}
|
|
diff --git a/src/Vt102Emulation.h b/src/Vt102Emulation.h
|
|
index 665e9f026d..3456e068d3 100644
|
|
--- a/src/Vt102Emulation.h
|
|
+++ b/src/Vt102Emulation.h
|
|
@@ -126,7 +126,6 @@ private:
|
|
void resetModes();
|
|
|
|
void resetTokenizer();
|
|
-#define MAX_TOKEN_LENGTH 256 // Max length of tokens (e.g. window title)
|
|
void addToCurrentToken(uint cc);
|
|
int tokenBufferPos;
|
|
|
|
@@ -183,6 +182,7 @@ private:
|
|
enum osc {
|
|
// https://invisible-island.net/xterm/ctlseqs/ctlseqs.html#h2-Operating-System-Commands
|
|
ReportColors = 4,
|
|
+ Clipboard = 52,
|
|
ResetColors = 104,
|
|
// https://gitlab.freedesktop.org/Per_Bothner/specifications/blob/master/proposals/semantic-prompts.md
|
|
SemanticPrompts = 133,
|
|
--
|
|
GitLab
|
|
|