84 lines
1.9 KiB
TypeScript
84 lines
1.9 KiB
TypeScript
// ┌ ┐
|
|
// │ From https://github.com/Neurarian/matshell │
|
|
// └ ┘
|
|
|
|
import Notifd from "gi://AstalNotifd";
|
|
import { GLib } from "astal";
|
|
import { Gtk, Gdk } from "astal/gtk4";
|
|
|
|
type TimeoutManager = {
|
|
setupTimeout: () => void;
|
|
clearTimeout: () => void;
|
|
handleHover: () => void;
|
|
handleHoverLost: () => void;
|
|
cleanup: () => void;
|
|
};
|
|
|
|
export const createTimeoutManager = (
|
|
dismissCallback: () => void,
|
|
timeoutDelay: number,
|
|
): TimeoutManager => {
|
|
let isHovered = false;
|
|
let timeoutId: number | null = null;
|
|
|
|
const clearTimeout = () => {
|
|
if (timeoutId !== null) {
|
|
GLib.source_remove(timeoutId);
|
|
timeoutId = null;
|
|
}
|
|
};
|
|
|
|
const setupTimeout = () => {
|
|
clearTimeout();
|
|
|
|
if (!isHovered) {
|
|
timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, timeoutDelay, () => {
|
|
clearTimeout();
|
|
dismissCallback();
|
|
return GLib.SOURCE_REMOVE;
|
|
});
|
|
}
|
|
};
|
|
|
|
return {
|
|
setupTimeout,
|
|
clearTimeout,
|
|
handleHover: () => {
|
|
isHovered = true;
|
|
clearTimeout();
|
|
},
|
|
handleHoverLost: () => {
|
|
isHovered = false;
|
|
setupTimeout();
|
|
},
|
|
cleanup: clearTimeout,
|
|
};
|
|
};
|
|
|
|
export const time = (time: number, format = "%H:%M") =>
|
|
GLib.DateTime.new_from_unix_local(time).format(format)!;
|
|
|
|
export const urgency = (notification: Notifd.Notification) => {
|
|
const { LOW, NORMAL, CRITICAL } = Notifd.Urgency;
|
|
|
|
switch (notification.urgency) {
|
|
case LOW:
|
|
return "low";
|
|
case CRITICAL:
|
|
return "critical";
|
|
case NORMAL:
|
|
default:
|
|
return "normal";
|
|
}
|
|
};
|
|
|
|
export const isIcon = (icon: string) => {
|
|
const display = Gdk.Display.get_default();
|
|
if (!display) return false;
|
|
const iconTheme = Gtk.IconTheme.get_for_display(display);
|
|
return iconTheme.has_icon(icon);
|
|
};
|
|
|
|
export const fileExists = (path: string) =>
|
|
GLib.file_test(path, GLib.FileTest.EXISTS);
|