From a467f953bb24074a468c0c6cbdba716126eea797 Mon Sep 17 00:00:00 2001 From: Nikolaos Karaolidis Date: Sun, 16 Feb 2025 17:15:28 +0000 Subject: [PATCH] Update multi-display workspace handling Signed-off-by: Nikolaos Karaolidis --- .../user/gui/astal/config/widget/Bar.tsx | 2 +- .../config/widget/components/Workspaces.tsx | 57 ++++++++++++++----- .../configs/user/gui/hyprland/scripts/bind.sh | 28 ++++----- hosts/eirene/hardware/display.nix | 40 ++++++------- 4 files changed, 78 insertions(+), 49 deletions(-) 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}`)} - > -