From 0bb1589df5ba12fc850e71c73b0b45fdbfa84c7b Mon Sep 17 00:00:00 2001 From: retrozinndev Date: Sun, 11 May 2025 20:37:11 -0300 Subject: [PATCH] :recycle: ags(notifications): move `getUrgencyString()` to Notifications module --- ags/scripts/notifications.ts | 67 +++++++++++++++++++++++++++++++++++- ags/widget/Notification.ts | 13 ++----- 2 files changed, 68 insertions(+), 12 deletions(-) diff --git a/ags/scripts/notifications.ts b/ags/scripts/notifications.ts index 486cc81..bd61f68 100644 --- a/ags/scripts/notifications.ts +++ b/ags/scripts/notifications.ts @@ -1,4 +1,4 @@ -import { AstalIO, GObject, property, register, signal, timeout } from "astal"; +import { AstalIO, execAsync, Gio, GObject, property, register, signal, timeout } from "astal"; import AstalNotifd from "gi://AstalNotifd"; export let @@ -126,6 +126,71 @@ class Notifications extends GObject.Object { return this.instance; } + public async sendNotification(props: { + urgency?: AstalNotifd.Urgency; + appName?: string; + image?: string; + summary: string; + body?: string; + replaceId?: number; + actions?: Array<{ + id?: (string|number); + text: string; + onAction?: () => void + }> + }): Promise<{ + id?: (string|number); + text: string; + onAction?: () => void + }|null|void> { + + return await execAsync([ + "notify-send", + ...(props.urgency ? [ + "-u", this.getUrgencyString(props.urgency) + ] : []), ...(props.appName ? [ + "-a", props.appName + ] : []), ...(props.image ? [ + "-i", props.image + ] : []), ...(props.actions ? props.actions.map((action) => + [ "-A", action.text ] + ).join("\s") : []), ...(props.replaceId ? [ + "-r", props.replaceId.toString() + ] : []), props.summary, props.body ? props.body : "" + ]).then((stdout) => { + stdout = stdout.trim(); + if(!stdout) { + if(props.actions && props.actions.length > 0) + return null; + + return; + } + + if(props.actions && props.actions.length > 0) { + const action = props.actions[Number.parseInt(stdout)]; + action?.onAction?.(); + + return action ?? undefined; + } + }).catch((err: Gio.IOErrorEnum) => { + console.error(`Notifications: Couldn't send notification! Is the daemon running? Stderr:\n${ + err.message ? `${err.message}\n` : ""}Stack: ${err.stack}`); + }); + } + + public getUrgencyString(urgency: AstalNotifd.Notification|AstalNotifd.Urgency) { + switch((urgency instanceof AstalNotifd.Notification) ? + urgency.urgency : urgency) { + + case AstalNotifd.Urgency.LOW: + return "low"; + case AstalNotifd.Urgency.CRITICAL: + return "critical"; + } + + return "normal"; + } + private addHistory(notif: AstalNotifd.Notification, onAdded?: (notif: AstalNotifd.Notification) => void): void { if(!notif) return; diff --git a/ags/widget/Notification.ts b/ags/widget/Notification.ts index 87c50b4..e9cefc2 100644 --- a/ags/widget/Notification.ts +++ b/ags/widget/Notification.ts @@ -5,16 +5,6 @@ import { HistoryNotification, Notifications } from "../scripts/notifications"; import { GLib } from "astal"; import { getAppIcon } from "../scripts/apps"; -export function getUrgencyString(notif: AstalNotifd.Notification) { - switch(notif.urgency) { - case AstalNotifd.Urgency.LOW: - return "low"; - case AstalNotifd.Urgency.CRITICAL: - return "critical"; - } - - return "normal"; -} function getNotificationImage(notif: AstalNotifd.Notification|HistoryNotification): (string|undefined) { const img = notif.image ?? notif.appIcon; @@ -64,7 +54,8 @@ export function NotificationWidget(notification: AstalNotifd.Notification|number hexpand: true, vexpand: false, child: new Widget.Box({ - className: `notification ${ (notification instanceof AstalNotifd.Notification) ? getUrgencyString(notification) : "" }`, + className: `notification ${ (notification instanceof AstalNotifd.Notification) ? + Notifications.getDefault().getUrgencyString(notification.urgency) : "" }`, homogeneous: false, expand: true, orientation: Gtk.Orientation.VERTICAL,