From 684dedeb1a527a74de31cb405168ad39ec802a51 Mon Sep 17 00:00:00 2001 From: Mora Unie Youer Date: Sun, 2 Mar 2025 14:16:48 +0300 Subject: feat: basic topbar features --- widget/Bar.tsx | 124 ++++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 93 insertions(+), 31 deletions(-) (limited to 'widget') diff --git a/widget/Bar.tsx b/widget/Bar.tsx index c2db8c5..02aa3ba 100644 --- a/widget/Bar.tsx +++ b/widget/Bar.tsx @@ -1,36 +1,98 @@ import { App, Astal, Gtk, Gdk } from "astal/gtk4" -import { Variable } from "astal" +import { exec, GLib, Variable } from "astal" + +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 - - - - - + const { TOP, LEFT, RIGHT } = Astal.WindowAnchor + + return + + + + + + + + + + + + } -- cgit v1.2.3-70-g09d2