diff options
| author | srdusr <trevorgray@srdusr.com> | 2025-08-30 19:22:59 +0200 |
|---|---|---|
| committer | srdusr <trevorgray@srdusr.com> | 2025-08-30 19:22:59 +0200 |
| commit | 19120d4f9761c67d99ed1ce3da6084b83f5a49c9 (patch) | |
| tree | f234cad1bdad88114a63c9702144da487024967a /linux/home/.config/ags/widget/bar/buttons/Workspaces.ts | |
| parent | 5928998af5404ae2be84c6cecc10ebf84bd3f3ed (diff) | |
| download | dotfiles-19120d4f9761c67d99ed1ce3da6084b83f5a49c9.tar.gz dotfiles-19120d4f9761c67d99ed1ce3da6084b83f5a49c9.zip | |
Linux-specific dotfiles
Diffstat (limited to 'linux/home/.config/ags/widget/bar/buttons/Workspaces.ts')
| -rw-r--r-- | linux/home/.config/ags/widget/bar/buttons/Workspaces.ts | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/linux/home/.config/ags/widget/bar/buttons/Workspaces.ts b/linux/home/.config/ags/widget/bar/buttons/Workspaces.ts new file mode 100644 index 0000000..a59f61b --- /dev/null +++ b/linux/home/.config/ags/widget/bar/buttons/Workspaces.ts @@ -0,0 +1,66 @@ +import PanelButton from '../PanelButton'; +import options from 'options'; +import { sh, range } from 'lib/utils'; + +const hyprland = await Service.import('hyprland'); +const { workspaces } = options.bar.workspaces; + +const dispatch = arg => { + sh(`hyprctl dispatch workspace ${arg}`); +}; + +const Workspaces = ws => + Widget.Box({ + children: range(ws || 20).map(i => + Widget.Label({ + attribute: i, + vpack: 'center', + label: `${i}`, + setup: self => { + const updateState = () => { + const monitorData = JSON.parse(hyprland.message('j/monitors')); + const activeWorkspaceId = monitorData[0]?.activeWorkspace?.id; + const workspaceData = hyprland.getWorkspace(i); + + if (activeWorkspaceId !== undefined) { + self.toggleClassName('active', activeWorkspaceId === i); + } + self.toggleClassName('occupied', (workspaceData?.windows || 0) > 0); + }; + + // Hook to Hyprland for updates + self.hook(hyprland, updateState); + + // Initial update + updateState(); + }, + }), + ), + setup: box => { + box.hook(hyprland, () => { + const monitorData = JSON.parse(hyprland.message('j/monitors')); + const activeWorkspaceId = monitorData[0]?.activeWorkspace?.id; + + if (activeWorkspaceId !== undefined) { + for (const btn of box.children) { + const workspaceId = btn.attribute; + btn.toggleClassName('active', workspaceId === activeWorkspaceId); + + if (ws === 0) { + btn.visible = hyprland.workspaces.some(workspace => workspace.id === workspaceId); + } + } + } + }); + }, + }); + +export default () => + PanelButton({ + window: 'overview', + class_name: 'workspaces', + on_scroll_up: () => dispatch('m+1'), + on_scroll_down: () => dispatch('m-1'), + on_clicked: () => App.toggleWindow('overview'), + child: workspaces.bind().as(Workspaces), + }); |
