summaryrefslogtreecommitdiff
path: root/src/modules/notifications.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/notifications.tsx')
-rw-r--r--src/modules/notifications.tsx57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/modules/notifications.tsx b/src/modules/notifications.tsx
new file mode 100644
index 0000000..66188a1
--- /dev/null
+++ b/src/modules/notifications.tsx
@@ -0,0 +1,57 @@
+import { Gtk } from "astal/gtk3";
+import AstalNotifd from "gi://AstalNotifd";
+import { PopupWindow, setupChildClickthrough } from "../utils/widgets";
+
+const List = () => (
+ <box
+ vertical
+ valign={Gtk.Align.START}
+ className="list"
+ setup={self => {
+ const notifd = AstalNotifd.get_default();
+ const map = new Map<number, NotifPopup>();
+ self.hook(notifd, "notified", (self, id) => {
+ const notification = notifd.get_notification(id);
+
+ const popup = (<NotifPopup notification={notification} />) as NotifPopup;
+ popup.connect("destroy", () => map.get(notification.id) === popup && map.delete(notification.id));
+ map.get(notification.id)?.destroyWithAnims();
+ map.set(notification.id, popup);
+
+ self.add(
+ <eventbox
+ // Dismiss on middle click
+ onClick={(_, event) => event.button === Astal.MouseButton.MIDDLE && notification.dismiss()}
+ // Close on hover lost
+ onHoverLost={() => popup.destroyWithAnims()}
+ >
+ {popup}
+ </eventbox>
+ );
+
+ // Limit number of popups
+ if (config.maxPopups > 0 && self.children.length > config.maxPopups)
+ map.values().next().value?.destroyWithAnims();
+ });
+ self.hook(notifd, "resolved", (_, id) => map.get(id)?.destroyWithAnims());
+
+ // Change input region to child region so can click through empty space
+ setupChildClickthrough(self);
+ }}
+ />
+);
+
+export default class Notifications extends PopupWindow {
+ constructor() {
+ super({
+ name: "notifications",
+ child: (
+ <box>
+ <List />
+ </box>
+ ),
+ });
+
+ setupChildClickthrough(self);
+ }
+}