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);
 |