diff --git a/quickshell/Common/SessionData.qml b/quickshell/Common/SessionData.qml index 00ba5fd3..62df4fa3 100644 --- a/quickshell/Common/SessionData.qml +++ b/quickshell/Common/SessionData.qml @@ -126,6 +126,10 @@ Singleton { property var hiddenOutputDeviceNames: [] property var hiddenInputDeviceNames: [] + property string launcherLastMode: "all" + property string appDrawerLastMode: "apps" + property string niriOverviewLastMode: "apps" + Component.onCompleted: { if (!isGreeterMode) { loadSettings(); @@ -1100,6 +1104,21 @@ Singleton { saveSettings(); } + function setLauncherLastMode(mode) { + launcherLastMode = mode; + saveSettings(); + } + + function setAppDrawerLastMode(mode) { + appDrawerLastMode = mode; + saveSettings(); + } + + function setNiriOverviewLastMode(mode) { + niriOverviewLastMode = mode; + saveSettings(); + } + function syncWallpaperForCurrentMode() { if (!perModeWallpaper) return; diff --git a/quickshell/Common/settings/SessionSpec.js b/quickshell/Common/settings/SessionSpec.js index 5e6347ac..9797e45e 100644 --- a/quickshell/Common/settings/SessionSpec.js +++ b/quickshell/Common/settings/SessionSpec.js @@ -77,7 +77,11 @@ var SPEC = { deviceMaxVolumes: { def: {} }, hiddenOutputDeviceNames: { def: [] }, - hiddenInputDeviceNames: { def: [] } + hiddenInputDeviceNames: { def: [] }, + + launcherLastMode: { def: "all" }, + appDrawerLastMode: { def: "apps" }, + niriOverviewLastMode: { def: "apps" } }; function getValidKeys() { diff --git a/quickshell/Modals/DankLauncherV2/DankLauncherV2Modal.qml b/quickshell/Modals/DankLauncherV2/DankLauncherV2Modal.qml index 95e7c2e9..7dcae4c1 100644 --- a/quickshell/Modals/DankLauncherV2/DankLauncherV2Modal.qml +++ b/quickshell/Modals/DankLauncherV2/DankLauncherV2Modal.qml @@ -102,7 +102,7 @@ Item { spotlightContent.searchField.text = query; } if (spotlightContent.controller) { - var targetMode = mode || "all"; + var targetMode = mode || SessionData.launcherLastMode || "all"; spotlightContent.controller.searchMode = targetMode; spotlightContent.controller.activePluginId = ""; spotlightContent.controller.activePluginName = ""; @@ -226,6 +226,15 @@ Item { } } + Connections { + target: spotlightContent?.controller ?? null + function onModeChanged(mode) { + if (spotlightContent.controller.autoSwitchedToFiles) + return; + SessionData.setLauncherLastMode(mode); + } + } + HyprlandFocusGrab { id: focusGrab windows: [launcherWindow] diff --git a/quickshell/Modules/AppDrawer/AppDrawerPopout.qml b/quickshell/Modules/AppDrawer/AppDrawerPopout.qml index 647f06df..2fc982c5 100644 --- a/quickshell/Modules/AppDrawer/AppDrawerPopout.qml +++ b/quickshell/Modules/AppDrawer/AppDrawerPopout.qml @@ -61,7 +61,7 @@ DankPopout { return; const query = _pendingQuery; - const mode = _pendingMode || "apps"; + const mode = _pendingMode || SessionData.appDrawerLastMode || "apps"; _pendingMode = ""; _pendingQuery = ""; @@ -83,6 +83,15 @@ DankPopout { lc.actionPanel?.hide(); } + Connections { + target: contentLoader.item?.launcherContent?.controller ?? null + function onModeChanged(mode) { + if (contentLoader.item.launcherContent.controller.autoSwitchedToFiles) + return; + SessionData.setAppDrawerLastMode(mode); + } + } + content: Component { Rectangle { id: contentContainer diff --git a/quickshell/Modules/WorkspaceOverlays/NiriOverviewOverlay.qml b/quickshell/Modules/WorkspaceOverlays/NiriOverviewOverlay.qml index 738579d9..c7b1bf79 100644 --- a/quickshell/Modules/WorkspaceOverlays/NiriOverviewOverlay.qml +++ b/quickshell/Modules/WorkspaceOverlays/NiriOverviewOverlay.qml @@ -79,199 +79,199 @@ Scope { id: overlayWindow required property var modelData - readonly property real dpr: CompositorService.getScreenScale(screen) - readonly property bool isActiveScreen: screen.name === NiriService.currentOutput - readonly property bool shouldShowSpotlight: niriOverviewScope.searchActive && screen.name === niriOverviewScope.searchActiveScreen && !niriOverviewScope.isClosing - readonly property bool isSpotlightScreen: screen.name === niriOverviewScope.searchActiveScreen - readonly property bool overlayVisible: NiriService.inOverview || niriOverviewScope.isClosing - property bool hasActivePopout: !!PopoutManager.currentPopoutsByScreen[screen.name] - property bool hasActiveModal: !!ModalManager.currentModalsByScreen[screen.name] + readonly property real dpr: CompositorService.getScreenScale(screen) + readonly property bool isActiveScreen: screen.name === NiriService.currentOutput + readonly property bool shouldShowSpotlight: niriOverviewScope.searchActive && screen.name === niriOverviewScope.searchActiveScreen && !niriOverviewScope.isClosing + readonly property bool isSpotlightScreen: screen.name === niriOverviewScope.searchActiveScreen + readonly property bool overlayVisible: NiriService.inOverview || niriOverviewScope.isClosing + property bool hasActivePopout: !!PopoutManager.currentPopoutsByScreen[screen.name] + property bool hasActiveModal: !!ModalManager.currentModalsByScreen[screen.name] - Connections { - target: PopoutManager - function onPopoutChanged() { - overlayWindow.hasActivePopout = !!PopoutManager.currentPopoutsByScreen[overlayWindow.screen.name]; + Connections { + target: PopoutManager + function onPopoutChanged() { + overlayWindow.hasActivePopout = !!PopoutManager.currentPopoutsByScreen[overlayWindow.screen.name]; + } } - } - Connections { - target: ModalManager - function onModalChanged() { - overlayWindow.hasActiveModal = !!ModalManager.currentModalsByScreen[overlayWindow.screen.name]; + Connections { + target: ModalManager + function onModalChanged() { + overlayWindow.hasActiveModal = !!ModalManager.currentModalsByScreen[overlayWindow.screen.name]; + } } - } screen: modelData visible: overlayVisible color: "transparent" - WlrLayershell.namespace: "dms:niri-overview-spotlight" - WlrLayershell.layer: WlrLayer.Overlay - WlrLayershell.exclusiveZone: -1 - WlrLayershell.keyboardFocus: { - if (!NiriService.inOverview) - return WlrKeyboardFocus.None; - if (!isActiveScreen) - return WlrKeyboardFocus.None; - if (niriOverviewScope.releaseKeyboard) - return WlrKeyboardFocus.None; - if (hasActivePopout || hasActiveModal) - return WlrKeyboardFocus.None; - return WlrKeyboardFocus.Exclusive; - } - - mask: Region { - item: overlayVisible && spotlightContainer.visible ? spotlightContainer : null - } - - onShouldShowSpotlightChanged: { - if (shouldShowSpotlight) { - if (launcherContent?.controller) { - launcherContent.controller.searchMode = "apps"; - launcherContent.controller.performSearch(); - } - return; + WlrLayershell.namespace: "dms:niri-overview-spotlight" + WlrLayershell.layer: WlrLayer.Overlay + WlrLayershell.exclusiveZone: -1 + WlrLayershell.keyboardFocus: { + if (!NiriService.inOverview) + return WlrKeyboardFocus.None; + if (!isActiveScreen) + return WlrKeyboardFocus.None; + if (niriOverviewScope.releaseKeyboard) + return WlrKeyboardFocus.None; + if (hasActivePopout || hasActiveModal) + return WlrKeyboardFocus.None; + return WlrKeyboardFocus.Exclusive; } - if (!isActiveScreen) - return; - Qt.callLater(() => keyboardFocusScope.forceActiveFocus()); - } - anchors { - top: true - left: true - right: true - bottom: true - } - - FocusScope { - id: keyboardFocusScope - anchors.fill: parent - focus: true - - Keys.onPressed: event => { - if (overlayWindow.shouldShowSpotlight || niriOverviewScope.isClosing) - return; - if ([Qt.Key_Escape, Qt.Key_Return].includes(event.key)) { - NiriService.toggleOverview(); - event.accepted = true; - return; - } - - if (event.key === Qt.Key_Left) { - NiriService.moveColumnLeft(); - event.accepted = true; - return; - } - - if (event.key === Qt.Key_Right) { - NiriService.moveColumnRight(); - event.accepted = true; - return; - } - - if (event.key === Qt.Key_Up) { - NiriService.moveWorkspaceUp(); - event.accepted = true; - return; - } - - if (event.key === Qt.Key_Down) { - NiriService.moveWorkspaceDown(); - event.accepted = true; - return; - } - - if (event.modifiers & (Qt.ControlModifier | Qt.MetaModifier) || [Qt.Key_Delete, Qt.Key_Backspace].includes(event.key)) { - event.accepted = false; - return; - } - - if (event.isAutoRepeat || !event.text) - return; - if (!launcherContent?.searchField) - return; - const trimmedText = event.text.trim(); - launcherContent.searchField.text = trimmedText; - launcherContent.controller.setSearchQuery(trimmedText); - niriOverviewScope.showSpotlight(overlayWindow.screen.name); - Qt.callLater(() => launcherContent.searchField.forceActiveFocus()); - event.accepted = true; + mask: Region { + item: overlayVisible && spotlightContainer.visible ? spotlightContainer : null + } + + onShouldShowSpotlightChanged: { + if (shouldShowSpotlight) { + if (launcherContent?.controller) { + launcherContent.controller.searchMode = SessionData.niriOverviewLastMode || "apps"; + launcherContent.controller.performSearch(); + } + return; + } + if (!isActiveScreen) + return; + Qt.callLater(() => keyboardFocusScope.forceActiveFocus()); + } + + anchors { + top: true + left: true + right: true + bottom: true + } + + FocusScope { + id: keyboardFocusScope + anchors.fill: parent + focus: true + + Keys.onPressed: event => { + if (overlayWindow.shouldShowSpotlight || niriOverviewScope.isClosing) + return; + if ([Qt.Key_Escape, Qt.Key_Return].includes(event.key)) { + NiriService.toggleOverview(); + event.accepted = true; + return; + } + + if (event.key === Qt.Key_Left) { + NiriService.moveColumnLeft(); + event.accepted = true; + return; + } + + if (event.key === Qt.Key_Right) { + NiriService.moveColumnRight(); + event.accepted = true; + return; + } + + if (event.key === Qt.Key_Up) { + NiriService.moveWorkspaceUp(); + event.accepted = true; + return; + } + + if (event.key === Qt.Key_Down) { + NiriService.moveWorkspaceDown(); + event.accepted = true; + return; + } + + if (event.modifiers & (Qt.ControlModifier | Qt.MetaModifier) || [Qt.Key_Delete, Qt.Key_Backspace].includes(event.key)) { + event.accepted = false; + return; + } + + if (event.isAutoRepeat || !event.text) + return; + if (!launcherContent?.searchField) + return; + const trimmedText = event.text.trim(); + launcherContent.searchField.text = trimmedText; + launcherContent.controller.setSearchQuery(trimmedText); + niriOverviewScope.showSpotlight(overlayWindow.screen.name); + Qt.callLater(() => launcherContent.searchField.forceActiveFocus()); + event.accepted = true; + } } - } Item { id: spotlightContainer x: Theme.snap((parent.width - width) / 2, overlayWindow.dpr) y: Theme.snap((parent.height - height) / 2, overlayWindow.dpr) - readonly property int baseWidth: { - switch (SettingsData.dankLauncherV2Size) { - case "micro": - return 500; - case "medium": - return 720; - case "large": - return 860; - default: - return 620; + readonly property int baseWidth: { + switch (SettingsData.dankLauncherV2Size) { + case "micro": + return 500; + case "medium": + return 720; + case "large": + return 860; + default: + return 620; + } } - } - readonly property int baseHeight: { - switch (SettingsData.dankLauncherV2Size) { - case "micro": - return 480; - case "medium": - return 720; - case "large": - return 860; - default: - return 600; + readonly property int baseHeight: { + switch (SettingsData.dankLauncherV2Size) { + case "micro": + return 480; + case "medium": + return 720; + case "large": + return 860; + default: + return 600; + } } - } - width: Math.min(baseWidth, overlayWindow.screen.width - 100) - height: Math.min(baseHeight, overlayWindow.screen.height - 100) + width: Math.min(baseWidth, overlayWindow.screen.width - 100) + height: Math.min(baseHeight, overlayWindow.screen.height - 100) - readonly property bool animatingOut: niriOverviewScope.isClosing && overlayWindow.isSpotlightScreen + readonly property bool animatingOut: niriOverviewScope.isClosing && overlayWindow.isSpotlightScreen - scale: overlayWindow.shouldShowSpotlight ? 1.0 : 0.96 - opacity: overlayWindow.shouldShowSpotlight ? 1 : 0 - visible: overlayWindow.shouldShowSpotlight || animatingOut - enabled: overlayWindow.shouldShowSpotlight + scale: overlayWindow.shouldShowSpotlight ? 1.0 : 0.96 + opacity: overlayWindow.shouldShowSpotlight ? 1 : 0 + visible: overlayWindow.shouldShowSpotlight || animatingOut + enabled: overlayWindow.shouldShowSpotlight layer.enabled: visible layer.smooth: false layer.textureSize: layer.enabled ? Qt.size(Math.round(width * overlayWindow.dpr), Math.round(height * overlayWindow.dpr)) : Qt.size(0, 0) - Behavior on scale { - id: scaleAnimation - NumberAnimation { - duration: Theme.expressiveDurations.fast - easing.type: Easing.BezierSpline - easing.bezierCurve: spotlightContainer.visible ? Theme.expressiveCurves.expressiveFastSpatial : Theme.expressiveCurves.standardAccel - onRunningChanged: { - if (running || !spotlightContainer.animatingOut) - return; - niriOverviewScope.resetState(); + Behavior on scale { + id: scaleAnimation + NumberAnimation { + duration: Theme.expressiveDurations.fast + easing.type: Easing.BezierSpline + easing.bezierCurve: spotlightContainer.visible ? Theme.expressiveCurves.expressiveFastSpatial : Theme.expressiveCurves.standardAccel + onRunningChanged: { + if (running || !spotlightContainer.animatingOut) + return; + niriOverviewScope.resetState(); + } } } - } - Behavior on opacity { - NumberAnimation { - duration: Theme.expressiveDurations.fast - easing.type: Easing.BezierSpline - easing.bezierCurve: spotlightContainer.visible ? Theme.expressiveCurves.expressiveFastSpatial : Theme.expressiveCurves.standardAccel + Behavior on opacity { + NumberAnimation { + duration: Theme.expressiveDurations.fast + easing.type: Easing.BezierSpline + easing.bezierCurve: spotlightContainer.visible ? Theme.expressiveCurves.expressiveFastSpatial : Theme.expressiveCurves.standardAccel + } } - } - Rectangle { - anchors.fill: parent - color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) - radius: Theme.cornerRadius - border.color: Theme.outlineMedium - border.width: 1 - } + Rectangle { + anchors.fill: parent + color: Theme.withAlpha(Theme.surfaceContainer, Theme.popupTransparency) + radius: Theme.cornerRadius + border.color: Theme.outlineMedium + border.width: 1 + } LauncherContent { id: launcherContent @@ -308,6 +308,11 @@ Scope { function onItemExecuted() { niriOverviewScope.releaseKeyboard = true; } + function onModeChanged(mode) { + if (launcherContent.controller.autoSwitchedToFiles) + return; + SessionData.setNiriOverviewLastMode(mode); + } } } }