189 lines
5.4 KiB
JavaScript
189 lines
5.4 KiB
JavaScript
const css = `${App.configDir}/style.css`;
|
|
const hyprland = await Service.import("hyprland");
|
|
const systray = await Service.import("systemtray");
|
|
const battery = await Service.import("battery");
|
|
const audio = await Service.import('audio')
|
|
|
|
import { NotificationPopups } from "./notifications.js"
|
|
import { BatteryPopup } from "./battery.js"
|
|
import { cpuProgress, ramProgress } from "./cpu.js"
|
|
|
|
const laptop = Utils.exec(`hostname`) === "syl";
|
|
// const display = Gdk.Display.get_default();
|
|
console.log(laptop ? "Running on syl" : "Running on kaladin");
|
|
|
|
function map_workspaces(id) {
|
|
switch (id) {
|
|
case 1:
|
|
return Widget.Label("");
|
|
break;
|
|
case 2:
|
|
return Widget.Label("");
|
|
break;
|
|
case "browse":
|
|
return Widget.Label("");
|
|
break;
|
|
case 3:
|
|
return Widget.Label("");
|
|
break;
|
|
case 4:
|
|
return Widget.Label("");
|
|
break;
|
|
case 5:
|
|
return Widget.Label("");
|
|
break;
|
|
case 9:
|
|
return Widget.Label("");
|
|
break;
|
|
default:
|
|
return Widget.Label(`${id}`);
|
|
}
|
|
}
|
|
|
|
function workspaces() {
|
|
const active = hyprland.active.workspace.bind("id");
|
|
const workspaces = hyprland.bind("workspaces")
|
|
.as(ws => ws.map(({ id }) => id === -99 ? "" : Widget.Button({
|
|
onClicked: () => hyprland.messageAsync(`dispatch workspace ${id}`),
|
|
child: map_workspaces(id),
|
|
class_name: active.as(i => `${i === id ? "focused" : ""}`),
|
|
})))
|
|
return Widget.Box({
|
|
class_name: "workspaces",
|
|
spacing: 6,
|
|
children: workspaces,
|
|
})
|
|
}
|
|
|
|
function client_name() {
|
|
const client_class = hyprland.active.client.bind("class");
|
|
return Widget.Box({
|
|
class_name: "window-title-box",
|
|
spacing: 6,
|
|
children: [
|
|
Widget.Icon({
|
|
class_name: "client-icon",
|
|
icon: client_class.as(c => `${c === "ff" ? "firefox" : c}`),
|
|
}),
|
|
Widget.Label({
|
|
class_name: "client-title",
|
|
label: hyprland.active.client.bind("title"),
|
|
maxWidthChars: 54,
|
|
truncate: "end",
|
|
}),
|
|
],
|
|
})
|
|
}
|
|
|
|
function system_tray() {
|
|
/** @param {import('types/service/systemtray').TrayItem} item */
|
|
const systray_item = item => Widget.Button({
|
|
child: Widget.Icon().bind('icon', item, 'icon'),
|
|
tooltipMarkup: item.bind('tooltip_markup'),
|
|
onPrimaryClick: (_, event) => item.activate(event),
|
|
onSecondaryClick: (_, event) => item.openMenu(event),
|
|
});
|
|
return Widget.Box({
|
|
class_name: "systemtray",
|
|
children: systray.bind("items").as(i => i.map(systray_item)),
|
|
|
|
})
|
|
}
|
|
|
|
function battery_function() {
|
|
const bat = battery.bind("percent");
|
|
const charging = battery.bind("charging");
|
|
const time_left = battery.bind("time-remaining");
|
|
return Widget.CircularProgress({
|
|
start_at: 0.75,
|
|
rounded: true,
|
|
value: bat.as(p => p / 100),
|
|
class_name: battery.bind("charging").as(c => c ? "battery_dial_charging" : "battery_dial"),
|
|
child: Widget.Icon({
|
|
class_name: "battery_icon",
|
|
icon: battery.bind("icon-name"),
|
|
}),
|
|
tooltip_text: time_left.as(t => "Time till full charge: " + t),
|
|
})
|
|
}
|
|
|
|
const date = Variable("", {
|
|
poll: [1000, 'date "+\%a \%b \%d, \%-I:\%M \%p"'],
|
|
})
|
|
|
|
const expander = Widget.Label({
|
|
hexpand: true,
|
|
label: "",
|
|
})
|
|
|
|
const volume_indicator = Widget.Button({
|
|
on_clicked: () => audio.speaker.is_muted = !audio.speaker.is_muted,
|
|
child: Widget.Icon().hook(audio.speaker, self => {
|
|
const vol = audio.speaker.volume * 100;
|
|
const icon = [
|
|
[101, 'overamplified'],
|
|
[67, 'high'],
|
|
[34, 'medium'],
|
|
[1, 'low'],
|
|
[0, 'muted'],
|
|
].find(([threshold]) => threshold <= vol)?.[1];
|
|
|
|
self.icon = `audio-volume-${icon}-symbolic`;
|
|
self.tooltip_text = `Volume ${Math.floor(vol)}%`;
|
|
}),
|
|
})
|
|
|
|
function Bar(monitor = 0) {
|
|
const myLabel = Widget.Label({
|
|
label: 'some example content',
|
|
})
|
|
|
|
const clock = Widget.Label({
|
|
class_name: "clock",
|
|
label: date.bind(),
|
|
truncate: "end",
|
|
})
|
|
|
|
return Widget.Window({
|
|
monitor,
|
|
name: `bar${monitor}`, // this name has to be unique
|
|
anchor: [laptop ? 'bottom' : 'top', 'left', 'right'],
|
|
exclusivity: "exclusive",
|
|
margins: [0, 20, 0, 20],
|
|
child: Widget.CenterBox({
|
|
css: laptop ? "margin-bottom: 1em; margin-top: 0.4em" : "margin-bottom: 1em; margin-top: 1em;",
|
|
class_name: "windowbox",
|
|
startWidget: Widget.Box({
|
|
spacing: 0,
|
|
children: [
|
|
workspaces(),
|
|
client_name(),
|
|
],
|
|
}),
|
|
centerWidget: clock,
|
|
endWidget: Widget.Box({
|
|
hexpand: true,
|
|
css: "margin-right: 1em;",
|
|
children: [
|
|
expander,
|
|
ramProgress,
|
|
cpuProgress,
|
|
volume_indicator,
|
|
system_tray(),
|
|
laptop ? battery_function() : null
|
|
],
|
|
}),
|
|
}),
|
|
})
|
|
}
|
|
|
|
App.config({
|
|
style: css,
|
|
windows: [
|
|
Bar(laptop ? 0 : 1), // can be instantiated for each monitor
|
|
NotificationPopups(),
|
|
(laptop ? BatteryPopup() : null)
|
|
],
|
|
})
|
|
|