From d46302588ae6500f84c2cbd725d332550b4088f3 Mon Sep 17 00:00:00 2001 From: bbedward Date: Fri, 12 Dec 2025 15:29:10 -0500 Subject: [PATCH] clipboard: add shift+enter to paste from clipboard history modal fixes #358 --- CHANGELOG.MD | 5 +++ .../Modals/Clipboard/ClipboardContent.qml | 1 + .../Clipboard/ClipboardHistoryModal.qml | 45 +++++++++++++++++++ .../Clipboard/ClipboardKeyboardController.qml | 20 ++++++--- .../Clipboard/ClipboardKeyboardHints.qml | 3 +- 5 files changed, 68 insertions(+), 6 deletions(-) create mode 100644 CHANGELOG.MD diff --git a/CHANGELOG.MD b/CHANGELOG.MD new file mode 100644 index 00000000..d5f71582 --- /dev/null +++ b/CHANGELOG.MD @@ -0,0 +1,5 @@ +# 1.2.0 + +- Added clipboard and clipboard history integration +- Added swipe to dismiss notification popups and from center +- Added paste from clipboard history view - requires wtype diff --git a/quickshell/Modals/Clipboard/ClipboardContent.qml b/quickshell/Modals/Clipboard/ClipboardContent.qml index b52457ac..df1dce5a 100644 --- a/quickshell/Modals/Clipboard/ClipboardContent.qml +++ b/quickshell/Modals/Clipboard/ClipboardContent.qml @@ -158,5 +158,6 @@ Item { anchors.right: parent.right anchors.margins: Theme.spacingL visible: modal.showKeyboardHints + wtypeAvailable: modal.wtypeAvailable } } diff --git a/quickshell/Modals/Clipboard/ClipboardHistoryModal.qml b/quickshell/Modals/Clipboard/ClipboardHistoryModal.qml index 1cc4a92f..b3dcb517 100644 --- a/quickshell/Modals/Clipboard/ClipboardHistoryModal.qml +++ b/quickshell/Modals/Clipboard/ClipboardHistoryModal.qml @@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import Quickshell.Hyprland +import Quickshell.Io import qs.Common import qs.Modals.Common import qs.Services @@ -26,6 +27,50 @@ DankModal { property int activeImageLoads: 0 readonly property int maxConcurrentLoads: 3 readonly property bool clipboardAvailable: DMSService.isConnected && DMSService.capabilities.includes("clipboard") + property bool wtypeAvailable: false + + Process { + id: wtypeCheck + command: ["which", "wtype"] + running: true + onExited: exitCode => { + clipboardHistoryModal.wtypeAvailable = (exitCode === 0); + } + } + + Process { + id: wtypeProcess + command: ["wtype", "-M", "ctrl", "-P", "v", "-p", "v", "-m", "ctrl"] + running: false + } + + Timer { + id: pasteTimer + interval: 200 + repeat: false + onTriggered: wtypeProcess.running = true + } + + function pasteSelected() { + if (!keyboardNavigationActive || clipboardEntries.length === 0 || selectedIndex < 0 || selectedIndex >= clipboardEntries.length) { + return; + } + if (!wtypeAvailable) { + ToastService.showError(I18n.tr("wtype not available - install wtype for paste support")); + return; + } + const entry = clipboardEntries[selectedIndex]; + DMSService.sendRequest("clipboard.copyEntry", { + "id": entry.id + }, function (response) { + if (response.error) { + ToastService.showError(I18n.tr("Failed to copy entry")); + return; + } + instantClose(); + pasteTimer.start(); + }); + } function updateFilteredModel() { const query = searchText.trim(); diff --git a/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml b/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml index 8d808928..e3a14ec7 100644 --- a/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml +++ b/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml @@ -114,11 +114,21 @@ QtObject { } } - if (event.modifiers & Qt.ShiftModifier && event.key === Qt.Key_Delete) { - modal.clearAll(); - modal.hide(); - event.accepted = true; - return; + if (event.modifiers & Qt.ShiftModifier) { + switch (event.key) { + case Qt.Key_Delete: + modal.clearAll(); + modal.hide(); + event.accepted = true; + return; + case Qt.Key_Return: + case Qt.Key_Enter: + if (modal.keyboardNavigationActive) { + modal.pasteSelected(); + event.accepted = true; + } + return; + } } if (modal.keyboardNavigationActive) { diff --git a/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml b/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml index 3e61f077..6989a91c 100644 --- a/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml +++ b/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml @@ -5,7 +5,8 @@ import qs.Widgets Rectangle { id: keyboardHints - readonly property string hintsText: I18n.tr("Shift+Del: Clear All • Esc: Close") + property bool wtypeAvailable: false + readonly property string hintsText: wtypeAvailable ? I18n.tr("Shift+Enter: Paste • Shift+Del: Clear All • Esc: Close") : I18n.tr("Shift+Del: Clear All • Esc: Close") height: ClipboardConstants.keyboardHintsHeight radius: Theme.cornerRadius