diff --git a/shell/services/BatteryService.qml b/shell/services/BatteryService.qml index 4154674..2031c3e 100644 --- a/shell/services/BatteryService.qml +++ b/shell/services/BatteryService.qml @@ -1,7 +1,7 @@ pragma Singleton import QtQuick -import Quickshell.Services.Notifications +import Quickshell.Io import Quickshell.Services.UPower import "." as S @@ -62,14 +62,31 @@ QtObject { if (root.percent < root.critThresh && !root._critSent) { root._critSent = true; root._warnSent = true; - S.NotifService.send("Very Low Battery", "Connect to power now!", NotificationUrgency.Critical, "battery-low"); + root._sendNotif(2, "battery-low", "Very Low Battery", "Connect to power now!"); } else if (root.percent < root.warnThresh && !root._warnSent) { root._warnSent = true; - S.NotifService.send("Low Battery", "", NotificationUrgency.Normal, "battery-caution"); + root._sendNotif(1, "battery-caution", "Low Battery", ""); } } } + // Send notification via D-Bus so any active daemon receives it + function _sendNotif(urgency, icon, summary, body) { + _notifProc.command = ["busctl", "--user", "call", "org.freedesktop.Notifications", "/org/freedesktop/Notifications", "org.freedesktop.Notifications", "Notify", "susssasa{sv}i" // signature + , "nova-shell" // app_name + , "0" // replaces_id + , icon // app_icon + , summary // summary + , body // body + , "0" // actions (empty array) + , "1", "urgency", "y", String(urgency) // hints: urgency + , "-1" // expire_timeout + ]; + _notifProc.running = true; + } + + property var _notifProc: Process {} + function fmtTime(secs) { if (!secs || secs <= 0) return ""; diff --git a/shell/services/NotifService.qml b/shell/services/NotifService.qml index 773ad7d..e3dde41 100644 --- a/shell/services/NotifService.qml +++ b/shell/services/NotifService.qml @@ -48,33 +48,6 @@ QtObject { dnd = !dnd; } - // Internal notifications - no D-Bus roundtrip needed - property int _nextInternalId: -1 - - function send(summary, body, urgency, appIcon) { - const id = _nextInternalId--; - const item = _itemComp.createObject(root, { - id: id, - summary: summary, - body: body || "", - appName: "nova-shell", - appIcon: appIcon || "", - image: "", - hints: {}, - urgency: urgency ?? NotificationUrgency.Normal, - actions: [], - time: Date.now(), - popup: true - }); - - _byId[id] = item; - list = [item, ...list]; - - const timeout = Modules.notifications.timeout || 3000; - item._expireTimer.interval = urgency === NotificationUrgency.Critical ? timeout * 3 : timeout; - item._expireTimer.running = true; - } - function _changed() { list = list.slice(); } diff --git a/test/qmllint-baseline.txt b/test/qmllint-baseline.txt index e5b7733..ff9ca29 100644 --- a/test/qmllint-baseline.txt +++ b/test/qmllint-baseline.txt @@ -84,7 +84,7 @@ shell/modules/WeatherModule.qml: Unqualified access [unqualified] shell/modules/WindowTitleModule.qml: Unqualified access [unqualified] shell/modules/WorkspacesModule.qml: Member "screen" not found on type "QObject" [missing-property] shell/modules/WorkspacesModule.qml: Unqualified access [unqualified] -shell/services/NotifService.qml: Member "_expireTimer" not found on type "QObject" [missing-property] +shell/services/BatteryService.qml: Unqualified access [unqualified] shell/services/BluetoothService.qml: Unqualified access [unqualified] shell/services/LockService.qml: Type QProcess::ExitStatus of parameter exitStatus in signal called exited was not found, but is required to compile onExited. Did you add all imports and dependencies? [signal-handler-parameters] shell/services/LockService.qml: Unqualified access [unqualified]