From 35faa3130c81e669b56b669c798662763cc801a6 Mon Sep 17 00:00:00 2001 From: purian23 Date: Tue, 29 Sep 2026 03:30:58 -0400 Subject: [PATCH] feat(island): add clipboard support & align launcher sizing options --- quickshell/Common/SettingsData.qml | 2 + .../Common/settings/BarWidgetDefaults.js | 1 + quickshell/DMSShellIPC.qml | 6 +- .../DankLauncherV2ModalIsland.qml | 5 +- .../Activities/ClipboardExpanded.qml | 87 ++++++++++++++++ quickshell/Modules/DankIsland/DankIsland.qml | 4 + .../Modules/DankIsland/DankIslandSurface.qml | 25 +++++ .../Modules/DankIsland/IslandBarHost.qml | 4 +- .../Modules/DankIsland/IslandContentHost.qml | 20 ++++ .../Modules/DankIsland/IslandController.qml | 22 ++++- .../Settings/Widgets/IslandBehaviorCard.qml | 12 ++- .../SurfaceWidgets/SurfaceWidgetFactory.qml | 1 + quickshell/Services/PopoutService.qml | 13 +++ .../tests/qml/island-widget-options.qml | 22 ++--- .../translations/settings_search_index.json | 98 +++++++++++++++---- 15 files changed, 280 insertions(+), 42 deletions(-) create mode 100644 quickshell/Modules/DankIsland/Activities/ClipboardExpanded.qml diff --git a/quickshell/Common/SettingsData.qml b/quickshell/Common/SettingsData.qml index f80c0ef6a..ec022c290 100644 --- a/quickshell/Common/SettingsData.qml +++ b/quickshell/Common/SettingsData.qml @@ -2704,6 +2704,8 @@ Singleton { return "islandRouteWeather"; case "wallpaper": return "islandRouteWallpaper"; + case "clipboard": + return "islandRouteClipboard"; } return ""; } diff --git a/quickshell/Common/settings/BarWidgetDefaults.js b/quickshell/Common/settings/BarWidgetDefaults.js index f3c18c1a6..2a342334e 100644 --- a/quickshell/Common/settings/BarWidgetDefaults.js +++ b/quickshell/Common/settings/BarWidgetDefaults.js @@ -16,6 +16,7 @@ var ISLAND_DEFAULTS = { islandRouteLauncher: "follow", islandRouteControlCenter: "follow", islandRouteNotificationCenter: "follow", + islandRouteClipboard: "follow", islandRouteDash: "island", islandRouteMedia: "island", islandRouteWeather: "island", diff --git a/quickshell/DMSShellIPC.qml b/quickshell/DMSShellIPC.qml index faf4a0367..e3fa11091 100644 --- a/quickshell/DMSShellIPC.qml +++ b/quickshell/DMSShellIPC.qml @@ -1466,7 +1466,7 @@ Item { if (!PopoutService.clipboardHistoryModal) { return "CLIPBOARD_NOT_AVAILABLE"; } - PopoutService.clipboardHistoryModal.show(); + PopoutService.openClipboardHistory(); return "CLIPBOARD_OPEN_SUCCESS"; } @@ -1474,7 +1474,7 @@ Item { if (!PopoutService.clipboardHistoryModal) { return "CLIPBOARD_NOT_AVAILABLE"; } - PopoutService.clipboardHistoryModal.hide(); + PopoutService.closeClipboardHistory(); return "CLIPBOARD_CLOSE_SUCCESS"; } @@ -1482,7 +1482,7 @@ Item { if (!PopoutService.clipboardHistoryModal) { return "CLIPBOARD_NOT_AVAILABLE"; } - PopoutService.clipboardHistoryModal.toggle(); + PopoutService.toggleClipboardHistory(); return "CLIPBOARD_TOGGLE_SUCCESS"; } diff --git a/quickshell/Modals/DankLauncherV2/DankLauncherV2ModalIsland.qml b/quickshell/Modals/DankLauncherV2/DankLauncherV2ModalIsland.qml index ce511ff76..677dbb2c7 100644 --- a/quickshell/Modals/DankLauncherV2/DankLauncherV2ModalIsland.qml +++ b/quickshell/Modals/DankLauncherV2/DankLauncherV2ModalIsland.qml @@ -2,6 +2,7 @@ pragma ComponentBehavior: Bound import QtQuick import qs.Common +import qs.Modals.DankLauncherV2.Components import qs.Services Item { @@ -24,8 +25,8 @@ Item { readonly property real screenWidth: usingFallback ? fallback.screenWidth : Theme.mediumBreakpoint * 2 readonly property real screenHeight: usingFallback ? fallback.screenHeight : Theme.mediumBreakpoint readonly property real dpr: usingFallback ? fallback.dpr : 1 - readonly property int modalWidth: usingFallback ? fallback.modalWidth : Theme.launcherWidthWide - readonly property int modalHeight: usingFallback ? fallback.modalHeight : Theme.launcherHeightDefault + readonly property int modalWidth: usingFallback ? fallback.modalWidth : LauncherMetrics.sizeWidth(SettingsData.dankLauncherV2Size) + readonly property int modalHeight: usingFallback ? fallback.modalHeight : LauncherMetrics.sizeHeight(SettingsData.dankLauncherV2Size) readonly property real modalX: usingFallback ? fallback.modalX : 0 readonly property real modalY: usingFallback ? fallback.modalY : 0 readonly property bool frameOwnsConnectedChrome: false diff --git a/quickshell/Modules/DankIsland/Activities/ClipboardExpanded.qml b/quickshell/Modules/DankIsland/Activities/ClipboardExpanded.qml new file mode 100644 index 000000000..77ba61e61 --- /dev/null +++ b/quickshell/Modules/DankIsland/Activities/ClipboardExpanded.qml @@ -0,0 +1,87 @@ +pragma ComponentBehavior: Bound + +import QtQuick +import qs.Common +import qs.Modals.Clipboard +import qs.Modals.Common +import qs.Services + +FocusScope { + id: root + + required property var controller + property var transientSurfaceTracker: null + property var effectiveScreen: null + property real alignedX: 0 + property real alignedY: 0 + + clip: true + + function focusFace() { + clipboardContent.searchField?.forceActiveFocus(); + return true; + } + + function beginSession() { + clipboardContent.resetState(); + if (ClipboardService.clipboardAvailable) + ClipboardService.refresh(); + clipboardContent.searchField.text = ""; + root.focusFace(); + } + + QtObject { + id: hostContract + + readonly property var effectiveScreen: root.effectiveScreen + readonly property real alignedX: root.alignedX + readonly property real alignedY: root.alignedY + } + + Ref { + service: ClipboardService + } + + ConfirmModal { + id: clearConfirmDialog + + confirmButtonText: I18n.tr("Clear All") + confirmButtonColor: Theme.primary + useOverlayLayer: true + onShouldBeVisibleChanged: { + root.controller.keyboardYielded = shouldBeVisible; + if (shouldBeVisible) { + selectedButton = 0; + keyboardNavigation = true; + return; + } + Qt.callLater(root.focusFace); + } + } + + ClipboardHistoryContent { + id: clipboardContent + + anchors.fill: parent + surfaceHost: hostContract + transientSurfaceTracker: root.transientSurfaceTracker + clearConfirmDialog: clearConfirmDialog + onCloseRequested: root.controller.requestCollapse() + onInstantCloseRequested: root.controller.requestCollapse() + } + + Connections { + target: root.controller + + function onSessionStarted(activityId) { + if (activityId === "clipboard") + Qt.callLater(root.beginSession); + } + } + + Component.onCompleted: root.controller.markVisualsReady("clipboard") + Component.onDestruction: { + root.controller.keyboardYielded = false; + root.controller.setVisualsReady("clipboard", false); + } +} diff --git a/quickshell/Modules/DankIsland/DankIsland.qml b/quickshell/Modules/DankIsland/DankIsland.qml index 0625af8c1..b695a3561 100644 --- a/quickshell/Modules/DankIsland/DankIsland.qml +++ b/quickshell/Modules/DankIsland/DankIsland.qml @@ -120,6 +120,7 @@ Item { case "wallpaper": case "weather": case "notificationcenter": + case "clipboard": return requested; case "control-center": case "cc": @@ -149,6 +150,8 @@ Item { return host.islandController.requestWeather(false); case "notificationcenter": return host.islandController.requestNotificationCenter(false); + case "clipboard": + return host.islandController.requestClipboard(false); } return host.islandController.requestActivity(activityId, true, true); } @@ -267,6 +270,7 @@ Item { "wallpaperAvailable": true, "weatherAvailable": true, "notificationCenterAvailable": true, + "clipboardAvailable": true, "launcherInputFocused": host.islandController.launcherInputFocused, "launcherResultCount": host.launcherResultCount, "compactHeight": host.islandController.compactThickness, diff --git a/quickshell/Modules/DankIsland/DankIslandSurface.qml b/quickshell/Modules/DankIsland/DankIslandSurface.qml index 7a1b4860b..7b8fc9d69 100644 --- a/quickshell/Modules/DankIsland/DankIslandSurface.qml +++ b/quickshell/Modules/DankIsland/DankIslandSurface.qml @@ -427,6 +427,8 @@ Item { notificationExpandedComponent: expandedNotificationComponent notificationCenterCompactComponent: compactNotificationCenterComponent notificationCenterExpandedComponent: expandedNotificationCenterComponent + clipboardCompactComponent: compactClipboardComponent + clipboardExpandedComponent: expandedClipboardComponent } HoverHandler { @@ -725,6 +727,29 @@ Item { } } + Component { + id: compactClipboardComponent + + DestinationCompact { + controller: root.controller + activityId: "clipboard" + iconName: "content_paste" + label: I18n.tr("Clipboard") + } + } + + Component { + id: expandedClipboardComponent + + ClipboardExpanded { + controller: root.controller + transientSurfaceTracker: root.launcherTransientSurfaceTracker + effectiveScreen: root.effectiveScreen + alignedX: root.targetScreenX + alignedY: root.targetScreenY + } + } + Component { id: expandedNotificationComponent diff --git a/quickshell/Modules/DankIsland/IslandBarHost.qml b/quickshell/Modules/DankIsland/IslandBarHost.qml index 7156b86f9..1263f04a6 100644 --- a/quickshell/Modules/DankIsland/IslandBarHost.qml +++ b/quickshell/Modules/DankIsland/IslandBarHost.qml @@ -147,8 +147,8 @@ Item { readonly property var springDampingRange: [10, 100] readonly property var springMassRange: [0.25, 3] readonly property int destinationMaxHeight: Math.max(destinationMinHeight, Math.min(destinationMaxHeightLimit, (root.screen?.height ?? referenceScreenHeight) - screenMargin)) - readonly property int maxActivityHeight: Math.max(controller.dashboardHeight, controller.controlCenterHeight, destinationMaxHeight) - readonly property int maxActivityWidth: Math.max(controller.dashboardMaxWidth, controller.controlCenterMaxWidth, Math.min(activityMaxWidth, Math.max(activityMinWidth, (root.screen?.width ?? referenceScreenWidth) - screenMargin))) + readonly property int maxActivityHeight: Math.max(controller.dashboardHeight, controller.controlCenterHeight, controller.launcherExpandedTarget.height, controller.clipboardExpandedTarget.height, destinationMaxHeight) + readonly property int maxActivityWidth: Math.max(controller.dashboardMaxWidth, controller.controlCenterMaxWidth, controller.launcherExpandedTarget.width, controller.clipboardExpandedTarget.width, Math.min(activityMaxWidth, Math.max(activityMinWidth, (root.screen?.width ?? referenceScreenWidth) - screenMargin))) readonly property int hostThickness: outerGap + nearInset + (root.isVertical ? maxActivityWidth : maxActivityHeight) + Theme.spacingS readonly property real maximumAlongOffset: root.isVertical ? Math.max(0, (height - maxActivityHeight) / 2 - Theme.spacingS) : Math.max(0, (width - maxActivityWidth) / 2 - Theme.spacingS) readonly property bool scrollEnabled: root.barConfig?.scrollEnabled ?? true diff --git a/quickshell/Modules/DankIsland/IslandContentHost.qml b/quickshell/Modules/DankIsland/IslandContentHost.qml index c06202c93..ed6960b26 100644 --- a/quickshell/Modules/DankIsland/IslandContentHost.qml +++ b/quickshell/Modules/DankIsland/IslandContentHost.qml @@ -46,6 +46,8 @@ Item { required property Component notificationExpandedComponent required property Component notificationCenterCompactComponent required property Component notificationCenterExpandedComponent + required property Component clipboardCompactComponent + required property Component clipboardExpandedComponent readonly property real compactFade: root.fadeCompact(root.morphProgress) readonly property real expandedFade: root.fadeExpanded(root.morphProgress) @@ -93,6 +95,7 @@ Item { "wallpaper": wallpaperExpandedLoader, "weather": weatherExpandedLoader, "notificationcenter": notificationCenterExpandedLoader, + "clipboard": clipboardExpandedLoader, "controlcenter": controlCenterExpandedLoader }) @@ -318,6 +321,23 @@ Item { opacity: root.expandedOpacity("notificationcenter") } + CompactFace { + active: root.surfaceActive("clipboard") + activity: "clipboard" + face: root.clipboardCompactComponent + opacity: root.compactOpacity("clipboard") + } + + ExpandedFace { + id: clipboardExpandedLoader + + activity: "clipboard" + active: root.controller.visualsRequested("clipboard") + asynchronous: true + sourceComponent: root.clipboardExpandedComponent + opacity: root.expandedOpacity("clipboard") + } + CompactFace { active: root.systemSurfaceActive activity: "volume" diff --git a/quickshell/Modules/DankIsland/IslandController.qml b/quickshell/Modules/DankIsland/IslandController.qml index e9c4e346c..0432a093c 100644 --- a/quickshell/Modules/DankIsland/IslandController.qml +++ b/quickshell/Modules/DankIsland/IslandController.qml @@ -2,6 +2,8 @@ pragma ComponentBehavior: Bound import QtQuick import qs.Common +import qs.Modals.Clipboard +import qs.Modals.DankLauncherV2.Components import qs.Modules.ControlCenter import qs.Modules.DankBar import qs.Modules.DankDash @@ -152,8 +154,8 @@ QtObject { mediaContentLength = next; } - readonly property var destinations: ["launcher", "controlcenter", "wallpaper", "weather", "notificationcenter"] - readonly property var blankClickOwners: ["launcher", "controlcenter", "wallpaper", "notificationcenter"] + readonly property var destinations: ["launcher", "controlcenter", "wallpaper", "weather", "notificationcenter", "clipboard"] + readonly property var blankClickOwners: ["launcher", "controlcenter", "wallpaper", "notificationcenter", "clipboard"] readonly property var destinationDefaults: ({ "launcher": { "contentLength": 160, @@ -174,6 +176,10 @@ QtObject { "notificationcenter": { "contentLength": 170, "contentHeight": 320 + }, + "clipboard": { + "contentLength": 150, + "contentHeight": 0 } }) property var destinationState: root.freshDestinationState() @@ -330,6 +336,7 @@ QtObject { controlCenterPendingSection = ""; return; case "wallpaper": + case "clipboard": keyboardYielded = false; return; } @@ -423,13 +430,14 @@ QtObject { readonly property var mediaCompactTarget: pillTarget(mediaCompactLength, compactFaceThickness) readonly property var homeExpandedTarget: dashboardTargetFor("home") readonly property var mediaExpandedTarget: dashboardTargetFor("media") - readonly property var launcherExpandedTarget: sheetTarget(680, 560) + readonly property var launcherExpandedTarget: sheetTarget(Math.min(dashboardAvailableWidth, LauncherMetrics.sizeWidth(SettingsData.dankLauncherV2Size)), Math.min(dashboardAvailableHeight, LauncherMetrics.sizeHeight(SettingsData.dankLauncherV2Size))) readonly property var controlCenterExpandedTarget: sheetTarget(controlCenterSheetWidth + controlCenterSheetInset + editGutterFor("controlcenter") * 2, controlCenterHeight) readonly property var systemCompactTarget: pillTarget(root.isVertical ? 240 : (SettingsData.osdAlwaysShowValue ? 330 : 282), compactFaceThickness) readonly property var systemExpandedTarget: sheetTarget(460, 176) readonly property var notificationCompactTarget: pillTarget(Math.ceil(Math.max(notificationCompactMinLength, Math.min(notificationCompactMaxLength, notificationContentLength))), compactFaceThickness) readonly property var notificationExpandedTarget: sheetTarget(520, 220) readonly property var notificationCenterExpandedTarget: dashboardTargetFor("notificationcenter") + readonly property var clipboardExpandedTarget: sheetTarget(Math.min(dashboardAvailableWidth, ClipboardConstants.sizeWidth(SettingsData.clipboardSize)), Math.min(dashboardAvailableHeight, ClipboardConstants.sizeHeight(SettingsData.clipboardSize))) readonly property bool systemActivityActive: activeActivity === "volume" || activeActivity === "brightness" readonly property bool notificationActive: activeActivity === "notification" @@ -471,6 +479,8 @@ QtObject { return controlCenterExpandedTarget; case "notificationcenter": return notificationCenterExpandedTarget; + case "clipboard": + return clipboardExpandedTarget; case "media": return mediaExpandedTarget; } @@ -699,6 +709,12 @@ QtObject { return requestActivity("notificationcenter", true, true); } + function requestClipboard(shouldToggle) { + if (shouldToggle === true && activeActivity === "clipboard" && expanded) + return requestCollapse(); + return requestActivity("clipboard", true, true); + } + function cycleActivity(direction, shouldExpand) { const activities = ["home"]; if (mediaAvailable) diff --git a/quickshell/Modules/Settings/Widgets/IslandBehaviorCard.qml b/quickshell/Modules/Settings/Widgets/IslandBehaviorCard.qml index 46a0d1d15..4a42bca45 100644 --- a/quickshell/Modules/Settings/Widgets/IslandBehaviorCard.qml +++ b/quickshell/Modules/Settings/Widgets/IslandBehaviorCard.qml @@ -14,7 +14,7 @@ SettingsCard { readonly property var routingValues: ["normal", "always", "last-used"] readonly property var interactionModeValues: ["click", "hybrid"] - readonly property var routeActivities: ["launcher", "controlcenter", "notificationcenter", "home", "media", "weather", "wallpaper"] + readonly property var routeActivities: ["launcher", "controlcenter", "notificationcenter", "clipboard", "home", "media", "weather", "wallpaper"] readonly property var routeKeys: routeActivities.map(activity => SettingsData.islandRouteKey(activity)) readonly property string sharedRouting: SettingsData.islandSharedRoutingMode(root.store.config) @@ -39,7 +39,7 @@ SettingsCard { SettingsRow { settingKey: root.keyPrefix + "RouteActivities" - tags: ["island", "routing", "shortcuts", "launcher", "control center", "notification center", "dashboard", "media", "weather", "wallpaper", "ipc"] + tags: ["island", "routing", "shortcuts", "launcher", "control center", "notification center", "clipboard", "dashboard", "media", "weather", "wallpaper", "ipc"] visible: root.hosted || root.sharedRouting !== "always" resetStore: root.store resetKeys: root.routeKeys @@ -71,6 +71,14 @@ SettingsCard { text: I18n.tr("Notification Center") } + IslandRouteRow { + settingKey: root.keyPrefix + "RouteClipboard" + store: root.store + hosted: root.hosted + activity: "clipboard" + text: I18n.tr("Clipboard") + } + IslandRouteRow { settingKey: root.keyPrefix + "RouteDash" store: root.store diff --git a/quickshell/Modules/SurfaceWidgets/SurfaceWidgetFactory.qml b/quickshell/Modules/SurfaceWidgets/SurfaceWidgetFactory.qml index d73916343..8cec42319 100644 --- a/quickshell/Modules/SurfaceWidgets/SurfaceWidgetFactory.qml +++ b/quickshell/Modules/SurfaceWidgets/SurfaceWidgetFactory.qml @@ -191,6 +191,7 @@ Item { widgetItem: clipboardWidget, section: root.getWidgetSection(parent) || "right", triggerSource: "clipboard", + islandActivity: "clipboard", mode: mode || "click", prepare: popout => { if (initialTab) diff --git a/quickshell/Services/PopoutService.qml b/quickshell/Services/PopoutService.qml index 1d8230551..a0aa13b42 100644 --- a/quickshell/Services/PopoutService.qml +++ b/quickshell/Services/PopoutService.qml @@ -723,13 +723,26 @@ Singleton { } function openClipboardHistory() { + if (routeToIsland("clipboard", null, false)) + return; clipboardHistoryModal?.show(); } function closeClipboardHistory() { + closeIslandActivity("clipboard"); clipboardHistoryModal?.hide(); } + function toggleClipboardHistory() { + if (clipboardHistoryModal?.shouldBeVisible) { + clipboardHistoryModal.hide(); + return; + } + if (routeToIsland("clipboard", null, true)) + return; + clipboardHistoryModal?.toggle(); + } + function unloadClipboardHistoryPopout() { _scheduleUnload("clipboardHistory"); } diff --git a/quickshell/tests/qml/island-widget-options.qml b/quickshell/tests/qml/island-widget-options.qml index 3c9276c65..feda5418b 100644 --- a/quickshell/tests/qml/island-widget-options.qml +++ b/quickshell/tests/qml/island-widget-options.qml @@ -73,7 +73,7 @@ ShellRoot { const entry = () => SettingsData.islandWidgetEntry(SettingsData.getBarConfig(root.barId)); const shared = root.findRow(page, "islandWidgetSharedRouting"); const routes = root.findRow(page, "islandWidgetRouteActivities"); - const routeSuffixes = ["Launcher", "ControlCenter", "NotificationCenter", "Dash", "Media", "Weather", "Wallpaper"]; + const routeSuffixes = ["Launcher", "ControlCenter", "NotificationCenter", "Clipboard", "Dash", "Media", "Weather", "Wallpaper"]; const routeRows = routeSuffixes.map(suffix => root.findRow(page, "islandWidgetRoute" + suffix)); const popups = root.findRow(page, "islandWidgetNotificationPopups"); const mode = root.findRow(page, "islandWidgetInteractionMode"); @@ -83,8 +83,8 @@ ShellRoot { throw new Error("rows never appeared: " + [shared, routes, popups, mode].map(row => !!row).join(",")); } root.check(!shared.visible, "a hosted island has no shared rule to pick"); - root.check(routeRows.every(row => row.visible), "all seven destination rows are visible"); - root.check(routeRows.every((row, index) => row.checked === (index >= 3)), "legacy dashboard routing is reflected in every dashboard activity"); + root.check(routeRows.every(row => row.visible), "all eight destination rows are visible"); + root.check(routeRows.every((row, index) => row.checked === (index >= 4)), "legacy dashboard routing is reflected in every dashboard activity"); root.check(popups.checked === false, "rows read the widget entry, not the defaults"); root.check(mode.visible, "a hosted island is always docked, so expansion mode shows"); popups.toggled(true); @@ -93,16 +93,16 @@ ShellRoot { root.check(entry().islandRouteControlCenter === "island", "a pick routes that activity to the island: " + JSON.stringify(entry())); routeRows[1].toggled(false); root.check(entry().islandRouteControlCenter === "bar", "an unpick hands it back to the bar's popout: " + JSON.stringify(entry())); - routeRows[4].toggled(false); - root.check(!routeRows[4].checked && routeRows[3].checked && routeRows[5].checked, "media changes independently and rows follow persisted values"); - routeRows[3].toggled(false); - root.check(!routeRows[3].checked && !routeRows[4].checked && routeRows[5].checked && routeRows[6].checked, "editing dashboard preserves the other legacy destinations"); routeRows[5].toggled(false); - root.check(!routeRows[5].checked, "weather can override its island default"); - routeRows[5].resetRequested(); - root.check(entry().islandRouteWeather === "island" && routeRows[5].checked && !routeRows[3].checked && !routeRows[4].checked, "reset returns weather to the island without changing dashboard or media"); + root.check(!routeRows[5].checked && routeRows[4].checked && routeRows[6].checked, "media changes independently and rows follow persisted values"); + routeRows[4].toggled(false); + root.check(!routeRows[4].checked && !routeRows[5].checked && routeRows[6].checked && routeRows[7].checked, "editing dashboard preserves the other legacy destinations"); + routeRows[6].toggled(false); + root.check(!routeRows[6].checked, "weather can override its island default"); + routeRows[6].resetRequested(); + root.check(entry().islandRouteWeather === "island" && routeRows[6].checked && !routeRows[4].checked && !routeRows[5].checked, "reset returns weather to the island without changing dashboard or media"); routes.resetRequested(); - root.check(routeRows.every((row, index) => row.checked === (index >= 3)), "group reset restores dashboard activities to the island and other destinations to standard surfaces"); + root.check(routeRows.every((row, index) => row.checked === (index >= 4)), "group reset restores dashboard activities to the island and other destinations to standard surfaces"); root.check(SettingsData.islandWidgetEntry(SettingsData.getBarConfig(root.barId)).islandSharedRouting === undefined, "the shared rule is never written for a hosted island"); console.log("FIXTURE_PASS"); } catch (error) { diff --git a/quickshell/translations/settings_search_index.json b/quickshell/translations/settings_search_index.json index f470d0a64..23a24c6e4 100644 --- a/quickshell/translations/settings_search_index.json +++ b/quickshell/translations/settings_search_index.json @@ -3015,6 +3015,31 @@ "parentLabel": "Bar", "description": "Clicks on empty bar space reach the windows below" }, + { + "section": "islandRouteClipboard", + "label": "Clipboard", + "tabIndex": 3, + "category": "General", + "keywords": [ + "bar", + "clipboard", + "cliphist", + "copy", + "general", + "history", + "ipc", + "island", + "panel", + "paste", + "routing", + "shortcuts", + "statusbar", + "taskbar", + "topbar" + ], + "parentLabel": "Bar", + "conditionKey": "islandEnabled" + }, { "section": "islandRouteControlCenter", "label": "Control Center", @@ -3594,6 +3619,7 @@ "category": "General", "keywords": [ "bar", + "clipboard", "control center", "dashboard", "general", @@ -9530,13 +9556,21 @@ "optionFile": "PrivacyOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:25", + "section": "barWidgetOption:IslandOptions.qml:26", "label": "Clear badge on open", "tabIndex": 22, "keywords": [], "runtimeType": "barWidgetOption", "optionFile": "IslandOptions.qml" }, + { + "section": "barWidgetOption:IslandOptions.qml:12", + "label": "Clipboard", + "tabIndex": 22, + "keywords": [], + "runtimeType": "barWidgetOption", + "optionFile": "IslandOptions.qml" + }, { "section": "barWidgetOption:IslandOptions.qml:2", "label": "Clock style", @@ -9690,7 +9724,7 @@ "optionFile": "AppsDockOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:12", + "section": "barWidgetOption:IslandOptions.qml:13", "label": "Dashboard", "tabIndex": 22, "keywords": [], @@ -9730,7 +9764,7 @@ "optionFile": "AppsDockOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:24", + "section": "barWidgetOption:IslandOptions.qml:25", "label": "Expand by default", "tabIndex": 22, "keywords": [], @@ -9738,7 +9772,7 @@ "optionFile": "IslandOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:16", + "section": "barWidgetOption:IslandOptions.qml:17", "label": "Expansion mode", "tabIndex": 22, "keywords": [], @@ -9810,7 +9844,7 @@ "optionFile": "WorkspaceSwitcherOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:19", + "section": "barWidgetOption:IslandOptions.qml:20", "label": "Hide delay", "tabIndex": 22, "keywords": [], @@ -9842,7 +9876,7 @@ "optionFile": "IslandOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:17", + "section": "barWidgetOption:IslandOptions.qml:18", "label": "Hybrid peeks the current compact face on hover. Click pins a destination so it stays open", "tabIndex": 22, "keywords": [], @@ -9922,7 +9956,7 @@ "optionFile": "ControlCenterOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:20", + "section": "barWidgetOption:IslandOptions.qml:21", "label": "Keep clock with media", "tabIndex": 22, "keywords": [], @@ -9986,7 +10020,7 @@ "optionFile": "SystemTrayOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:13", + "section": "barWidgetOption:IslandOptions.qml:14", "label": "Media", "tabIndex": 22, "keywords": [], @@ -10018,7 +10052,7 @@ "optionFile": "WorkspaceSwitcherOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:26", + "section": "barWidgetOption:IslandOptions.qml:27", "label": "Motion", "tabIndex": 22, "keywords": [], @@ -10066,7 +10100,7 @@ "optionFile": "ClockOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:21", + "section": "barWidgetOption:IslandOptions.qml:22", "label": "Notifications", "tabIndex": 22, "keywords": [], @@ -10082,7 +10116,7 @@ "optionFile": "BatteryOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:18", + "section": "barWidgetOption:IslandOptions.qml:19", "label": "Open delay", "tabIndex": 22, "keywords": [], @@ -10114,7 +10148,7 @@ "optionFile": "AppsDockOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:27", + "section": "barWidgetOption:IslandOptions.qml:28", "label": "Reduce motion", "tabIndex": 22, "keywords": [], @@ -10330,7 +10364,7 @@ "optionFile": "AppsDockOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:29", + "section": "barWidgetOption:IslandOptions.qml:30", "label": "Spring damping", "tabIndex": 22, "keywords": [], @@ -10338,7 +10372,7 @@ "optionFile": "IslandOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:30", + "section": "barWidgetOption:IslandOptions.qml:31", "label": "Spring mass", "tabIndex": 22, "keywords": [], @@ -10346,7 +10380,7 @@ "optionFile": "IslandOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:28", + "section": "barWidgetOption:IslandOptions.qml:29", "label": "Spring stiffness", "tabIndex": 22, "keywords": [], @@ -10410,7 +10444,7 @@ "optionFile": "SystemTrayOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:23", + "section": "barWidgetOption:IslandOptions.qml:24", "label": "Use standard OSDs", "tabIndex": 22, "keywords": [], @@ -10418,7 +10452,7 @@ "optionFile": "IslandOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:22", + "section": "barWidgetOption:IslandOptions.qml:23", "label": "Use standard popups", "tabIndex": 22, "keywords": [], @@ -10442,7 +10476,7 @@ "optionFile": "IslandOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:15", + "section": "barWidgetOption:IslandOptions.qml:16", "label": "Wallpapers", "tabIndex": 22, "keywords": [], @@ -10450,7 +10484,7 @@ "optionFile": "IslandOptions.qml" }, { - "section": "barWidgetOption:IslandOptions.qml:14", + "section": "barWidgetOption:IslandOptions.qml:15", "label": "Weather", "tabIndex": 22, "keywords": [], @@ -16413,6 +16447,31 @@ "parentLabel": "Bar", "conditionKey": "dotEnabled" }, + { + "section": "dotRouteClipboard", + "label": "Clipboard", + "tabIndex": 65, + "category": "Dot", + "keywords": [ + "bar", + "clipboard", + "cliphist", + "copy", + "dot", + "history", + "ipc", + "island", + "panel", + "paste", + "routing", + "shortcuts", + "statusbar", + "taskbar", + "topbar" + ], + "parentLabel": "Bar", + "conditionKey": "dotEnabled" + }, { "section": "dotRouteControlCenter", "label": "Control Center", @@ -16787,6 +16846,7 @@ "category": "Dot", "keywords": [ "bar", + "clipboard", "control center", "dashboard", "dot",