import { App, Astal, Gtk, Gdk } from "astal/gtk4" import { bind, exec, GLib, Variable } from "astal" import AstalTray from "gi://AstalTray?version=0.1"; import AstalWp from "gi://AstalWp?version=0.1"; type NiriWorkspace = { id: number, idx: number, name: string | null, output: string, is_active: boolean, is_focused: boolean, active_window_id: number | null, }; function getWorkspaces(): NiriWorkspace[] { // NOTE: this works only in non-systemd environment on NixOS // TODO: try to use Niri socket if it is documented return JSON.parse(exec("niri msg -j workspaces")); } function getWorkspacesByOutput(output: string): NiriWorkspace[] { return getWorkspaces().filter(workspace => workspace.output == output).sort((a, b) => a.idx - b.idx); } function focusWorkspace(idx: number) { // NOTE: this works only in non-systemd environment on NixOS // TODO: try to use Niri socket if it is documented exec(`niri msg action focus-workspace ${idx}`); } type WorkspaceButtonArguments = { idx: number, isActive: boolean, isFocused: boolean, }; function WorkspaceButton(args: WorkspaceButtonArguments) { const classes: string[] = []; args.isActive && classes.push("active"); args.isFocused && classes.push("focused"); return