// From examples on astal github page, since it looks good by default import { App, Astal, Gdk, Gtk } from "astal/gtk3" import { timeout } from "astal/time" import Variable from "astal/variable" import Brightness from "./brightness" import Wp from "gi://AstalWp" function OnScreenProgress({ visible }: { visible: Variable }) { const brightness = Brightness.get_default() const speaker = Wp.get_default()!.get_default_speaker() const iconName = Variable("") const value = Variable(0) let count = 0 function show(v: number, icon: string) { visible.set(true) value.set(v) iconName.set(icon) count++ timeout(2000, () => { count-- if (count === 0) visible.set(false) }) } return ( { self.hook(brightness, "notify::screen", () => show(brightness.screen, "display-brightness-symbolic"), ) if (speaker) { self.hook(speaker, "notify::volume", () => show(speaker.volume, speaker.volumeIcon), ) } }} revealChild={visible()} transitionType={Gtk.RevealerTransitionType.SLIDE_UP} > ) } export default function OSD(monitor: Gdk.Monitor) { const visible = Variable(false) return ( visible.set(false)}> ) }