From dd3f17f51efa998386ba03f292c6835465be5a61 Mon Sep 17 00:00:00 2001 From: Kangheng Liu <72962885+kanghengliu@users.noreply.github.com> Date: Sat, 25 Apr 2026 12:06:33 -0400 Subject: [PATCH] clipboard: add keybind to switch tabs and toggle pinned (#2262) * clipboard: add keybind to switch tabs * clipboard: add bind to toggle pinned --- .../Clipboard/ClipboardKeyboardController.qml | 31 +++++++++++++++++++ .../Clipboard/ClipboardKeyboardHints.qml | 4 +-- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml b/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml index f2a457ee..699f0dec 100644 --- a/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml +++ b/quickshell/Modals/Clipboard/ClipboardKeyboardController.qml @@ -53,6 +53,19 @@ QtObject { } } + function togglePinSelected() { + const entries = modal.activeTab === "saved" ? ClipboardService.pinnedEntries : ClipboardService.unpinnedEntries; + if (!entries || entries.length === 0 || ClipboardService.selectedIndex < 0 || ClipboardService.selectedIndex >= entries.length) { + return; + } + const selectedEntry = entries[ClipboardService.selectedIndex]; + if (modal.activeTab === "saved") { + modal.unpinEntry(selectedEntry); + } else { + modal.pinEntry(selectedEntry); + } + } + function handleKey(event) { switch (event.key) { case Qt.Key_Escape: @@ -65,6 +78,12 @@ QtObject { return; case Qt.Key_Down: case Qt.Key_Tab: + if (event.key === Qt.Key_Tab && (event.modifiers & Qt.ControlModifier)) { + modal.activeTab = modal.activeTab === "saved" ? "recents" : "saved"; + ClipboardService.selectedIndex = 0; + event.accepted = true; + return; + } if (!ClipboardService.keyboardNavigationActive) { ClipboardService.keyboardNavigationActive = true; ClipboardService.selectedIndex = 0; @@ -75,6 +94,12 @@ QtObject { return; case Qt.Key_Up: case Qt.Key_Backtab: + if (event.key === Qt.Key_Backtab && (event.modifiers & Qt.ControlModifier)) { + modal.activeTab = modal.activeTab === "saved" ? "recents" : "saved"; + ClipboardService.selectedIndex = 0; + event.accepted = true; + return; + } if (!ClipboardService.keyboardNavigationActive) { ClipboardService.keyboardNavigationActive = true; ClipboardService.selectedIndex = 0; @@ -121,6 +146,12 @@ QtObject { event.accepted = true; } return; + case Qt.Key_S: + if (ClipboardService.keyboardNavigationActive) { + togglePinSelected(); + event.accepted = true; + } + return; } } diff --git a/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml b/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml index 0285952c..1b6725c3 100644 --- a/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml +++ b/quickshell/Modals/Clipboard/ClipboardKeyboardHints.qml @@ -9,8 +9,8 @@ Rectangle { property bool enterToPaste: false readonly property string hintsText: { if (!wtypeAvailable) - return I18n.tr("Shift+Del: Clear All • Esc: Close"); - return enterToPaste ? I18n.tr("Shift+Enter: Copy • Shift+Del: Clear All • Esc: Close", "Keyboard hints when enter-to-paste is enabled") : I18n.tr("Shift+Enter: Paste • Shift+Del: Clear All • Esc: Close"); + return I18n.tr("Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Del: Clear All • Esc: Close"); + return enterToPaste ? I18n.tr("Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Enter: Copy • Shift+Del: Clear All • Esc: Close", "Keyboard hints when enter-to-paste is enabled") : I18n.tr("Ctrl+Tab: Switch Tab • Ctrl+S: Pin/Unpin • Shift+Enter: Paste • Shift+Del: Clear All • Esc: Close"); } height: ClipboardConstants.keyboardHintsHeight