diff --git a/quickshell/Modals/Common/DankModal.qml b/quickshell/Modals/Common/DankModal.qml index 550cc676..8a5239ad 100644 --- a/quickshell/Modals/Common/DankModal.qml +++ b/quickshell/Modals/Common/DankModal.qml @@ -15,9 +15,9 @@ Item { property real modalWidth: 400 property real modalHeight: 300 property var targetScreen - readonly property var effectiveScreen: targetScreen || contentWindow.screen - readonly property real screenWidth: effectiveScreen?.width - readonly property real screenHeight: effectiveScreen?.height + readonly property var effectiveScreen: contentWindow.screen ?? targetScreen + readonly property real screenWidth: effectiveScreen?.width ?? 1920 + readonly property real screenHeight: effectiveScreen?.height ?? 1080 readonly property real dpr: effectiveScreen ? CompositorService.getScreenScale(effectiveScreen) : 1 property bool showBackground: true property real backgroundOpacity: 0.5 @@ -58,6 +58,12 @@ Item { function open() { ModalManager.openModal(root); closeTimer.stop(); + const focusedScreen = CompositorService.getFocusedScreen(); + if (focusedScreen) { + contentWindow.screen = focusedScreen; + if (useBackgroundWindow) + backgroundWindow.screen = focusedScreen; + } shouldBeVisible = true; contentWindow.visible = false; if (useBackgroundWindow) @@ -102,6 +108,30 @@ Item { } } + Connections { + target: Quickshell + function onScreensChanged() { + if (!contentWindow.screen) + return; + const currentScreenName = contentWindow.screen.name; + let screenStillExists = false; + for (let i = 0; i < Quickshell.screens.length; i++) { + if (Quickshell.screens[i].name === currentScreenName) { + screenStillExists = true; + break; + } + } + if (screenStillExists) + return; + const newScreen = CompositorService.getFocusedScreen(); + if (newScreen) { + contentWindow.screen = newScreen; + if (useBackgroundWindow) + backgroundWindow.screen = newScreen; + } + } + } + Timer { id: closeTimer interval: animationDuration + 120 diff --git a/quickshell/Services/CompositorService.qml b/quickshell/Services/CompositorService.qml index 990b3eb9..f1536f67 100644 --- a/quickshell/Services/CompositorService.qml +++ b/quickshell/Services/CompositorService.qml @@ -64,6 +64,28 @@ Singleton { return screen?.devicePixelRatio || 1; } + function getFocusedScreen() { + let screenName = ""; + if (isHyprland && Hyprland.focusedWorkspace?.monitor) + screenName = Hyprland.focusedWorkspace.monitor.name; + else if (isNiri && NiriService.currentOutput) + screenName = NiriService.currentOutput; + else if (isSway) { + const focusedWs = I3.workspaces?.values?.find(ws => ws.focused === true); + screenName = focusedWs?.monitor?.name || ""; + } else if (isDwl && DwlService.activeOutput) + screenName = DwlService.activeOutput; + + if (!screenName) + return Quickshell.screens.length > 0 ? Quickshell.screens[0] : null; + + for (let i = 0; i < Quickshell.screens.length; i++) { + if (Quickshell.screens[i].name === screenName) + return Quickshell.screens[i]; + } + return Quickshell.screens.length > 0 ? Quickshell.screens[0] : null; + } + Timer { id: sortDebounceTimer interval: 100