// https://github.com/Aylur/dotfiles/blob/f03e58ba0d3b56f1144631c179ab27357e466753/.config/ags/modules/hyprland.js#L4 import Gdk from 'gi://Gdk'; const display = Gdk.Display.get_default(); const { App } = ags; const { Hyprland, Applications } = ags.Service; const { execAsync, lookUpIcon } = ags.Utils; const { Box, Button, EventBox, Label, Icon } = ags.Widget; export const Workspace = ({ i, } = {}) => EventBox({ onPrimaryClickRelease: () => execAsync(`hyprctl dispatch workspace ${i}`).catch(print), onHover: box => { box.window.set_cursor(Gdk.Cursor.new_from_name(display, 'pointer')); }, onHoverLost: box => { box.window.set_cursor(null); }, child: Box({ className: 'button', child: Label(`${i}`), connections: [ [Hyprland, btn => { const { workspaces, active } = Hyprland; const occupied = workspaces.has(i) && workspaces.get(i).windows > 0; btn.toggleClassName('active', active.workspace.id === i); btn.toggleClassName('occupied', occupied); btn.toggleClassName('empty', !occupied); }] ], }), }); var prev = Hyprland.active.workspace.id; export const Workspaces = props => Box({ className: 'workspaces panel-button', children: [EventBox({ child: Box({ connections: [[Hyprland, box => { let workspaces = []; new Promise(resolve => { Hyprland.workspaces.forEach(ws => { if (ws.id > 0) { workspaces.push(ws); } }); resolve(); }).then(value => { if (workspaces.length > 0) { let currentId = Hyprland.active.workspace.id; let qtyChange = Number(currentId - box.children.length); if (qtyChange != 0 && currentId != prev) { box.get_children().forEach(ch => ch.destroy()); box.children = Array.from( { length: Math.max(...workspaces.map(ws => ws.id)) }, (_, i) => i + 1).map(i => Workspace({ i: i})); } prev = currentId; } }); }]], }), })], });