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),
});
|