From 4df645a025ce659929d091e86a06f4b7fa60a620 Mon Sep 17 00:00:00 2001 From: end-4 <97237370+end-4@users.noreply.github.com> Date: Sat, 17 May 2025 23:57:32 +0200 Subject: [PATCH] notif popup: show only on focused screen --- .../notificationPopup/NotificationPopup.qml | 188 +++++++++--------- 1 file changed, 91 insertions(+), 97 deletions(-) diff --git a/.config/quickshell/modules/notificationPopup/NotificationPopup.qml b/.config/quickshell/modules/notificationPopup/NotificationPopup.qml index 8d5b0549c..f970a09c6 100644 --- a/.config/quickshell/modules/notificationPopup/NotificationPopup.qml +++ b/.config/quickshell/modules/notificationPopup/NotificationPopup.qml @@ -7,111 +7,105 @@ import QtQuick.Controls import QtQuick.Layouts import Quickshell import Quickshell.Wayland +import Quickshell.Hyprland Scope { - id: screenCorners - readonly property Toplevel activeWindow: ToplevelManager.activeToplevel + id: notificationPopup - Variants { - model: Quickshell.screens + LazyLoader { + loading: true + PanelWindow { + id: root + visible: (columnLayout.children.length > 0 || notificationWidgetList.length > 0) + screen: Quickshell.screens.find(s => s.name === Hyprland.focusedMonitor?.name) - LazyLoader { - property var modelData - loading: true - PanelWindow { - id: root - visible: (columnLayout.children.length > 0 || notificationWidgetList.length > 0) + property Component notifComponent: NotificationWidget {} + property list notificationWidgetList: [] - property Component notifComponent: NotificationWidget {} - property list notificationWidgetList: [] - - screen: modelData - WlrLayershell.namespace: "quickshell:notificationPopup" - WlrLayershell.layer: WlrLayer.Overlay - exclusiveZone: 0 - - anchors { - top: true - right: true - bottom: true - } - - mask: Region { - item: columnLayout - } - - color: "transparent" - implicitWidth: Appearance.sizes.notificationPopupWidth - - // Signal handlers to add/remove notifications - Connections { - target: Notifications - function onNotify(notification) { - if (GlobalStates.sidebarRightOpenCount > 0) { - return - } - // notificationRepeater.model = [notification, ...notificationRepeater.model] - const notif = root.notifComponent.createObject(columnLayout, { - notificationObject: notification, - popup: true - }); - notificationWidgetList.unshift(notif) - - // Remove stuff from t he column, add back - for (let i = 0; i < notificationWidgetList.length; i++) { - if (notificationWidgetList[i].parent === columnLayout) { - notificationWidgetList[i].parent = null; - } - } - - // Add notification widgets to the column - for (let i = 0; i < notificationWidgetList.length; i++) { - if (notificationWidgetList[i].parent === null) { - notificationWidgetList[i].parent = columnLayout; - } - } - } - function onDiscard(id) { - for (let i = notificationWidgetList.length - 1; i >= 0; i--) { - const widget = notificationWidgetList[i]; - if (widget && widget.notificationObject && widget.notificationObject.id === id) { - widget.destroyWithAnimation(); - notificationWidgetList.splice(i, 1); - } - } - } - function onTimeout(id) { - for (let i = notificationWidgetList.length - 1; i >= 0; i--) { - const widget = notificationWidgetList[i]; - if (widget && widget.notificationObject && widget.notificationObject.id === id) { - widget.destroyWithAnimation(); - notificationWidgetList.splice(i, 1); - } - } - } - function onDiscardAll() { - for (let i = notificationWidgetList.length - 1; i >= 0; i--) { - const widget = notificationWidgetList[i]; - if (widget && widget.notificationObject) { - widget.destroyWithAnimation(); - } - } - notificationWidgetList = []; - } - } - - ColumnLayout { // Scrollable window content - id: columnLayout - anchors.horizontalCenter: parent.horizontalCenter - width: parent.width - Appearance.sizes.hyprlandGapsOut * 2 - spacing: 0 // The widgets themselves have margins for spacing - - // Notifications are added by the above signal handlers - } + WlrLayershell.namespace: "quickshell:notificationPopup" + WlrLayershell.layer: WlrLayer.Overlay + exclusiveZone: 0 + anchors { + top: true + right: true + bottom: true } - } + mask: Region { + item: columnLayout + } + + color: "transparent" + implicitWidth: Appearance.sizes.notificationPopupWidth + + // Signal handlers to add/remove notifications + Connections { + target: Notifications + function onNotify(notification) { + if (GlobalStates.sidebarRightOpenCount > 0) { + return + } + // notificationRepeater.model = [notification, ...notificationRepeater.model] + const notif = root.notifComponent.createObject(columnLayout, { + notificationObject: notification, + popup: true + }); + notificationWidgetList.unshift(notif) + + // Remove stuff from t he column, add back + for (let i = 0; i < notificationWidgetList.length; i++) { + if (notificationWidgetList[i].parent === columnLayout) { + notificationWidgetList[i].parent = null; + } + } + + // Add notification widgets to the column + for (let i = 0; i < notificationWidgetList.length; i++) { + if (notificationWidgetList[i].parent === null) { + notificationWidgetList[i].parent = columnLayout; + } + } + } + function onDiscard(id) { + for (let i = notificationWidgetList.length - 1; i >= 0; i--) { + const widget = notificationWidgetList[i]; + if (widget && widget.notificationObject && widget.notificationObject.id === id) { + widget.destroyWithAnimation(); + notificationWidgetList.splice(i, 1); + } + } + } + function onTimeout(id) { + for (let i = notificationWidgetList.length - 1; i >= 0; i--) { + const widget = notificationWidgetList[i]; + if (widget && widget.notificationObject && widget.notificationObject.id === id) { + widget.destroyWithAnimation(); + notificationWidgetList.splice(i, 1); + } + } + } + function onDiscardAll() { + for (let i = notificationWidgetList.length - 1; i >= 0; i--) { + const widget = notificationWidgetList[i]; + if (widget && widget.notificationObject) { + widget.destroyWithAnimation(); + } + } + notificationWidgetList = []; + } + } + + ColumnLayout { // Scrollable window content + id: columnLayout + anchors.horizontalCenter: parent.horizontalCenter + width: parent.width - Appearance.sizes.hyprlandGapsOut * 2 + spacing: 0 // The widgets themselves have margins for spacing + + // Notifications are added by the above signal handlers + } + + } } }