import { Gdk, Gtk } from "ags/gtk4"; import { Separator } from "./Separator"; import { HistoryNotification, Notifications } from "../modules/notifications"; import { getAppIcon, getSymbolicIcon } from "../modules/apps"; import { escapeUnintendedMarkup, pathToURI } from "../modules/utils"; import { onCleanup } from "ags"; import GObject from "ags/gobject"; import AstalNotifd from "gi://AstalNotifd"; import Pango from "gi://Pango?version=1.0"; import GLib from "gi://GLib?version=2.0"; function getNotificationImage(notif: AstalNotifd.Notification|HistoryNotification): (string|undefined) { const img = notif.image || notif.appIcon; if(!img || !img.includes('/')) return undefined; return pathToURI(img); } export function NotificationWidget({ notification, actionClicked, holdOnHover, showTime, actionClose }: { notification: AstalNotifd.Notification|number|HistoryNotification; actionClicked?: (notif: AstalNotifd.Notification|HistoryNotification) => void; actionClose?: (notif: AstalNotifd.Notification|HistoryNotification) => void; holdOnHover?: boolean; showTime?: boolean; // It's showTime :speaking_head: :boom: :bangbang: }): Gtk.Widget { notification = (typeof notification === "number") ? AstalNotifd.get_default().get_notification(notification) : notification; const actions: Array|undefined = ((notification instanceof AstalNotifd.Notification) && notification.actions && notification.actions.filter(a => Boolean(a)).length > 0) ? notification.actions?.filter(a => a?.id?.toLowerCase() !== "view" && a?.label?.toLowerCase() != "view" ) : undefined; const conns: Map> = new Map(); onCleanup(() => conns.forEach((ids, obj) => ids.forEach(id => obj.disconnect(id)) )); return holdOnHover && Notifications.getDefault().holdNotification(notification.id) } onLeave={() => holdOnHover && Notifications.getDefault().releaseNotification(notification.id) } /> gesture.get_current_button() === Gdk.BUTTON_PRIMARY && actionClicked?.(notification) } /> { const icon = getSymbolicIcon(notification.appIcon ?? notification.appName) ?? getSymbolicIcon(notification.appName) ?? getAppIcon(notification.appName); if(icon) { self.set_from_icon_name(icon); return; } self.set_visible(false); }} /> actionClose?.(notification)}/> {getNotificationImage(notification) && } {(notification instanceof AstalNotifd.Notification) && actions && actions.length > 0 && { actions.map(action => { notification.invoke(action.id); actionClose?.(notification); }} />) } } as Gtk.Widget; }