56 lines
No EOL
1.6 KiB
TypeScript
56 lines
No EOL
1.6 KiB
TypeScript
import { Gtk } from "ags/gtk4";
|
|
import { createEffect } from "ags";
|
|
import { niriAction, niriEvent } from "../../lib/niri";
|
|
|
|
/**
|
|
* Bar widget showing niri workspaces as clickable buttons.
|
|
*/
|
|
export function NiriWorkspaces() {
|
|
const root = new Gtk.Box({
|
|
cssClasses: ["niri-workspaces"],
|
|
});
|
|
|
|
createEffect(() => {
|
|
const workspaces = niriEvent.workspaces();
|
|
const focusedId = niriEvent.focusedWorkspaceId();
|
|
|
|
// Remove existing children
|
|
let child = root.get_first_child();
|
|
while (child) {
|
|
const next = child.get_next_sibling();
|
|
root.remove(child);
|
|
child = next;
|
|
}
|
|
|
|
// Sort by idx (the display number)
|
|
const sorted = [...workspaces].sort((a, b) => a.idx - b.idx);
|
|
|
|
for (const ws of sorted) {
|
|
const isFocused = ws.id === focusedId;
|
|
const cssClasses = ["workspace-btn"];
|
|
|
|
if (isFocused) {
|
|
cssClasses.push("active");
|
|
} else if (ws.is_urgent) {
|
|
cssClasses.push("urgent");
|
|
} else {
|
|
cssClasses.push("inactive");
|
|
}
|
|
|
|
const btn = new Gtk.Button({
|
|
label: `${ws.idx}`,
|
|
cssClasses,
|
|
});
|
|
|
|
btn.connect("clicked", () => {
|
|
// Use the action client instead of subprocess
|
|
niriAction.send({ Action: { FocusWorkspace: { reference: { Index: ws.idx } } } })
|
|
.catch(err => console.error(err));
|
|
});
|
|
|
|
root.append(btn);
|
|
}
|
|
});
|
|
|
|
return root;
|
|
} |