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
|
|
|
|
|
|
|
|