From 000a7c2a4c4bda36f655f6489b5bac3211515a5d Mon Sep 17 00:00:00 2001 From: "eric.marin" Date: Wed, 18 Dec 2024 21:06:41 +0100 Subject: niri and fuzzel --- ags/modules/bar.js | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 ags/modules/bar.js (limited to 'ags/modules/bar.js') diff --git a/ags/modules/bar.js b/ags/modules/bar.js new file mode 100644 index 0000000..28fdaee --- /dev/null +++ b/ags/modules/bar.js @@ -0,0 +1,131 @@ +const hyprland = await Service.import("hyprland") +const audio = await Service.import("audio") +const battery = await Service.import("battery") +const network = await Service.import("network") + +const hour = Variable("", { + poll: [60000, 'date "+%H:%M"'] +}) + +function IconLabel(icon, label) { + return [ + Widget.Icon({ icon }), + Widget.Label({ label }), + ] +} + +function Workspaces() { + const active = hyprland.active.workspace.bind("id") + const workspaces = hyprland.bind("workspaces") + .as(ws => ws.map(({ id }) => Widget.Button({ + on_clicked: () => hyprland.messageAsync(`dispatch workspace ${id}`), + child: Widget.Label(`${id}`), + class_name: active.as(i => `${i === id ? "focused" : ""}`) + }))) + return Widget.Box({ + class_name: "workspaces", + children: workspaces, + }) +} + +//function SysTray() { +// +//} + +function Clock() { + return Widget.Label({ + class_name: "clock", + label: hour.bind(), + }) +} + +function Network() { + const label = network.wifi.bind("strength").as(s => ` ${s}`) + return Widget.Box({ + class_name: "network", + children: [ + Widget.Label({ label }) + ] + }) +} + +function Volume() { + const icons = { + 101: "overamplified", + 67: "high", + 34: "medium", + 1: "low", + 0: "muted", + } + function getIcon() { + const icon = audio.speaker.is_muted ? 0 : [101, 67, 34, 1, 0].find( + threshold => threshold <= audio.speaker.volume * 100) + + return `audio-volume-${icons[icon]}-symbolic` + } + + const icon = Utils.watch(getIcon(), audio.speaker, getIcon) + const label = audio.speaker.bind("volume").as(v => ` ${Math.floor(v * 100 + 0.01)}%`) + + return Widget.Box({ + class_name: "volume", + children: IconLabel(icon, label) + }) +} + +function Battery() { + const label = battery.bind("percent").as(p => ` ${p}%`) + const icon = battery.bind("percent").as(p => + `battery-level-${Math.floor(p / 10) * 10}-symbolic` + ) + + return Widget.Box({ + class_name: "battery", + children: IconLabel(icon, label) + }) +} + +function Left() { + return Widget.Box({ + spacing: 10, + children: [ + Workspaces(), + //SysTray(), + ] + }) +} +function Center() { + return Widget.Box({ + spacing: 10, + children: [ + Clock(), + ] + }) +} +function Right() { + return Widget.Box({ + hpack: "end", + spacing: 10, + children: [ + Network(), + Volume(), + Battery(), + ] + }) +} + +export function Bar(monitor = 0) { + return Widget.Window({ + name: `bar-${monitor}`, + class_name: "bar", + monitor, + anchor: ["top", "left", "right"], + exclusivity: "exclusive", + child: Widget.CenterBox({ + start_widget: Left(), + center_widget: Center(), + end_widget: Right(), + }), + }) +} + -- cgit v1.2.3