ags-config/widget/workspaces.tsx

55 lines
1.2 KiB
TypeScript
Raw Normal View History

2025-04-21 09:35:17 +02:00
import Hyprland from "gi://AstalHyprland"
2025-04-22 21:10:49 +02:00
import { bind, Variable } from "astal"
import { Gtk } from "astal/gtk4"
function WorkspaceButton(ws: Hyprland.Workspace) {
const hypr = Hyprland.get_default()
const classNames = Variable.derive(
[bind(hypr, "focusedWorkspace"), bind(hypr, "clients")],
(fws, _) => {
const classes = []
const active = fws.id == ws.id
active && classes.push("active")
const occupied = hypr.get_workspace(ws.id)?.get_clients()?.length > 0;
occupied && classes.push("occupied");
return classes;
})
const classes = classNames()
return (
<button
cssClasses={classes}
onDestroy={() => classNames.drop()}
// visible={classes.as(cn => cn.includes("occupied") || cn.includes("active"))}
valign={Gtk.Align.CENTER}
halign={Gtk.Align.CENTER}
onClicked={() => ws.focus()}>
</button>
)
}
2025-04-21 09:35:17 +02:00
export default function Workspaces() {
const hypr = Hyprland.get_default()
return <box cssClasses={["Workspaces"]}>
{bind(hypr, "workspaces").as((workspaces) =>
workspaces
.filter(ws => !(ws.id >= -99 && ws.id < -2))
.sort((a, b) => a.id - b.id)
.map((ws) => (
2025-04-22 21:10:49 +02:00
WorkspaceButton(ws)
2025-04-21 09:35:17 +02:00
)),
)}
</box >
2025-04-22 21:10:49 +02:00
2025-04-21 09:35:17 +02:00
}
2025-04-22 21:10:49 +02:00