diff --git a/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx b/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx index 416565d..8996e97 100644 --- a/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx +++ b/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx @@ -20,7 +20,7 @@ function getHyprlandMonitor(gdkmonitor: Gdk.Monitor) { } } -export default (monitor: Gdk.Monitor, index: number) => { + let maybeWorkspace: Variable; + let occupied: Variable; + + try { + const workspace = hyprland.get_workspace(id); + maybeWorkspace = Variable(workspace); + occupied = Variable(workspace.clients.length > 0); + } catch (_) { + maybeWorkspace = Variable(undefined); + occupied = Variable(false); + } + + const active = Variable.derive( + [bind(hyprland, "focusedWorkspace")], + focused => focused.id == id + ); + + hyprland.connect("workspace-added", (_, workspace) => { + if (workspace.id != id) return; + maybeWorkspace.set(workspace); + occupied.set(workspace.clients.length > 0); + workspace.connect("clients", clients => occupied.set(clients.length > 0)) + }); + + hyprland.connect("workspace-removed", (_, workspaceId) => { + if (workspaceId != id) return; + maybeWorkspace.set(undefined); + occupied.set(false); + }); -const Workspace = ({ workspace }: { workspace: Hyprland.Workspace }) => { const className = Variable.derive( - [bind(hyprland, "focusedWorkspace"), bind(workspace, "clients")], - (focused, clients) => { - if (focused.id == workspace.id) return "button active"; - if (clients.length > 0) return "button occupied"; + [active, occupied], + (active, occupied) => { + if (active) return "button active"; + if (occupied) return "button occupied"; return "button"; - }, + } ); return - hyprland.dispatch("workspace", `${workspace.id}`)} - > -