aboutsummaryrefslogtreecommitdiff
path: root/linux/home/.config/ags/widget/bar/buttons/Workspaces.ts
blob: a59f61b10884e45f961e5dbaef32aae29e910b1f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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),
  });