diff --git a/hosts/common/configs/system/upower/default.nix b/hosts/common/configs/system/upower/default.nix new file mode 100644 index 0000000..fa3f089 --- /dev/null +++ b/hosts/common/configs/system/upower/default.nix @@ -0,0 +1,8 @@ +{ ... }: +{ + services.upower = { + enable = true; + allowRiskyCriticalPowerAction = true; + criticalPowerAction = "Ignore"; + }; +} diff --git a/hosts/common/configs/user/gui/astal/config/app.ts b/hosts/common/configs/user/gui/astal/config/app.ts index bbedb42..4ad657e 100644 --- a/hosts/common/configs/user/gui/astal/config/app.ts +++ b/hosts/common/configs/user/gui/astal/config/app.ts @@ -1,8 +1,10 @@ import { App } from "astal/gtk3"; -import Bar from "./widget/Bar"; import { monitorFile } from "astal/file"; import { exec } from "astal/process"; import GLib from "gi://GLib"; +import Left from "./widget/Left"; +import Center from "./widget/Center"; +import Right from "./widget/Right"; const HOME = GLib.getenv("HOME"); const css = `${HOME}/.config/astal/theme.css`; @@ -18,6 +20,10 @@ exec(`sassc ${scss} ${css}`); App.start({ css, main() { - App.get_monitors().map(Bar); + App.get_monitors().map((monitor) => { + Left(monitor); + Center(monitor); + Right(monitor); + }); }, }); diff --git a/hosts/common/configs/user/gui/astal/config/lib.ts b/hosts/common/configs/user/gui/astal/config/lib.ts index 82e7577..70035fb 100644 --- a/hosts/common/configs/user/gui/astal/config/lib.ts +++ b/hosts/common/configs/user/gui/astal/config/lib.ts @@ -1,3 +1,16 @@ +import { Gdk } from "astal/gtk3"; +import Hyprland from "gi://AstalHyprland"; + export const range = (length: number, start = 1) => { return Array.from({ length }, (n, i) => i + start); }; + +export const getHyprlandMonitor = (gdkmonitor: Gdk.Monitor) => { + const hyprland = Hyprland.get_default() + const display = Gdk.Display.get_default()!; + const screen = display.get_default_screen(); + for (let i = 0; i < display.get_n_monitors(); ++i) { + if (gdkmonitor === display.get_monitor(i)) + return hyprland.get_monitor_by_name(screen.get_monitor_plug_name(i)!); + } +} diff --git a/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx b/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx deleted file mode 100644 index 3b9597e..0000000 --- a/hosts/common/configs/user/gui/astal/config/widget/Bar.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { App, Astal, Gtk, Gdk } from "astal/gtk3"; -import Launcher from "./components/Launcher"; -import Workspace from "./components/Workspaces"; -import Date from "./components/Date"; -import Systray from "./components/Tray"; -import Hyprland from "gi://AstalHyprland"; - -const anchor = - Astal.WindowAnchor.TOP | Astal.WindowAnchor.LEFT | Astal.WindowAnchor.RIGHT; - -const hyprland = Hyprland.get_default(); - -function getHyprlandMonitor(gdkmonitor: Gdk.Monitor) { - const display = Gdk.Display.get_default()!; - const screen = display.get_default_screen(); - for (let i = 0; i < display.get_n_monitors(); ++i) { - if (gdkmonitor === display.get_monitor(i)) - return hyprland.get_monitor_by_name(screen.get_monitor_plug_name(i)!); - } -} - -export default (monitor: Gdk.Monitor) => ( - - - - - - - - - - - - - - -); diff --git a/hosts/common/configs/user/gui/astal/config/widget/Center.tsx b/hosts/common/configs/user/gui/astal/config/widget/Center.tsx new file mode 100644 index 0000000..f86e7e8 --- /dev/null +++ b/hosts/common/configs/user/gui/astal/config/widget/Center.tsx @@ -0,0 +1,19 @@ +import { App, Astal, Gtk, Gdk } from "astal/gtk3"; +import Date from "./components/Date"; +import Hidden from "./components/Hidden"; + +export default (monitor: Gdk.Monitor) => ( + + + + + + + +); diff --git a/hosts/common/configs/user/gui/astal/config/widget/Left.tsx b/hosts/common/configs/user/gui/astal/config/widget/Left.tsx new file mode 100644 index 0000000..fb4039f --- /dev/null +++ b/hosts/common/configs/user/gui/astal/config/widget/Left.tsx @@ -0,0 +1,22 @@ +import { App, Astal, Gtk, Gdk } from "astal/gtk3"; +import Launcher from "./components/Launcher"; +import Workspace from "./components/Workspaces"; +import Hidden from "./components/Hidden"; +import { getHyprlandMonitor } from "../lib"; + +export default (monitor: Gdk.Monitor) => ( + + + + + + + + +); diff --git a/hosts/common/configs/user/gui/astal/config/widget/Right.tsx b/hosts/common/configs/user/gui/astal/config/widget/Right.tsx new file mode 100644 index 0000000..07cbb1b --- /dev/null +++ b/hosts/common/configs/user/gui/astal/config/widget/Right.tsx @@ -0,0 +1,21 @@ +import { App, Astal, Gtk, Gdk } from "astal/gtk3"; +import Systray from "./components/Tray"; +import Hidden from "./components/Hidden"; +import Battery from "./components/Battery"; + +export default (monitor: Gdk.Monitor) => ( + + + + + + + + +); diff --git a/hosts/common/configs/user/gui/astal/config/widget/components/Battery.tsx b/hosts/common/configs/user/gui/astal/config/widget/components/Battery.tsx new file mode 100644 index 0000000..c496adf --- /dev/null +++ b/hosts/common/configs/user/gui/astal/config/widget/components/Battery.tsx @@ -0,0 +1,30 @@ +import { bind, Variable } from "astal"; +import AstalBattery from "gi://AstalBattery"; + +const battery = AstalBattery.get_default(); + +const formatTime = (seconds: number) => seconds > 0 + ? `${String(Math.floor(seconds / 3600)).padStart(2, "0")}:${String(Math.floor((seconds % 3600) / 60)).padStart(2, "0")}` + : "--:--"; + +export default () => { + const percentage = bind(battery, "percentage").as((p) => Math.round(p * 100) + "%"); + const charging = bind(battery, "charging"); + const timeToFull = bind(battery, "timeToFull"); + const timeToEmpty = bind(battery, "timeToEmpty"); + + const time = Variable.derive([charging, timeToFull, timeToEmpty], (charging, full, empty) => + formatTime(charging ? full : empty) + ); + + const label = Variable.derive([percentage, charging, time], (percentage, charging, time) => { + const arrow = charging ? "▲" : "▼"; + return `${percentage} (${time}) ${arrow}`; + }); + + return ( + + ); +}; diff --git a/hosts/common/configs/user/gui/astal/config/widget/components/Date.tsx b/hosts/common/configs/user/gui/astal/config/widget/components/Date.tsx index 909cbc0..66f6ffc 100644 --- a/hosts/common/configs/user/gui/astal/config/widget/components/Date.tsx +++ b/hosts/common/configs/user/gui/astal/config/widget/components/Date.tsx @@ -1,13 +1,15 @@ -import { Variable } from "astal/variable"; +import { bind, Variable } from "astal"; import { GLib } from "astal"; -const time = Variable("").poll( - 1000, - () => GLib.DateTime.new_now_local().format("%H:%M - %A, %d %B %Y")!, -); +export default () => { + const time = Variable(GLib.DateTime.new_now_local().format("%H:%M - %A, %d %B %Y")!).poll( + 1000, + () => GLib.DateTime.new_now_local().format("%H:%M - %A, %d %B %Y")!, + ); -export default () => ( - -); + return ( + + ); +} diff --git a/hosts/common/configs/user/gui/astal/config/widget/components/Hidden.tsx b/hosts/common/configs/user/gui/astal/config/widget/components/Hidden.tsx new file mode 100644 index 0000000..a792c3a --- /dev/null +++ b/hosts/common/configs/user/gui/astal/config/widget/components/Hidden.tsx @@ -0,0 +1,32 @@ +import { Gtk } from "astal/gtk3"; +import { Variable, bind, timeout } from "astal"; + +export default function Hidden({ + child, + children, + orientation = Gtk.Orientation.VERTICAL, + transitionType = Gtk.RevealerTransitionType.SLIDE_DOWN, +}: { + child?: JSX.Element; + children?: JSX.Element | JSX.Element[]; + orientation?: Gtk.Orientation; + transitionType?: Gtk.RevealerTransitionType; +}) { + const show = Variable(true); + const contents = child ?? children; + + return ( + show.set(true)} + onHoverLost={() => show.set(false)} + > + + timeout(2000, () => self.revealChild = false)} revealChild={bind(show)} transitionType={transitionType}> + {Array.isArray(contents) ? (<>{contents}) : (contents)} + + + + + ); +} diff --git a/hosts/common/configs/user/gui/astal/default.nix b/hosts/common/configs/user/gui/astal/default.nix index fe7f493..6eaa2ee 100644 --- a/hosts/common/configs/user/gui/astal/default.nix +++ b/hosts/common/configs/user/gui/astal/default.nix @@ -25,6 +25,7 @@ in extraPackages = with pkgs; [ inputs.ags.packages.${system}.hyprland inputs.ags.packages.${system}.tray + inputs.ags.packages.${system}.battery sassc hyprland nixos-icons diff --git a/hosts/common/configs/user/gui/astal/theme.sass b/hosts/common/configs/user/gui/astal/theme.sass index 61a1ed6..641cfdb 100644 --- a/hosts/common/configs/user/gui/astal/theme.sass +++ b/hosts/common/configs/user/gui/astal/theme.sass @@ -1,5 +1,5 @@ -.bar - background-color: {{colors.surface.default.hex}} +.root + background-color: transparent @mixin interactive min-height: {{custom.font_size}}pt @@ -16,8 +16,16 @@ &:active background-color: {{colors.surface_container_highest.default.hex}} + .trigger-guard + min-height: 5pt + background-color: transparent + .widgets - padding: 2pt + margin: 5pt + padding: 5pt + background-color: {{colors.surface.default.hex}} + border-radius: {{custom.font_size}}pt + border: 2px solid {{colors.outline.default.hex}} .launcher @include interactive @@ -71,3 +79,6 @@ font-size: {{custom.font_size}}pt padding: 0 2pt color: {{colors.on_surface.default.hex}} + + .battery + @include interactive diff --git a/hosts/eirene/default.nix b/hosts/eirene/default.nix index f452e17..35890ee 100644 --- a/hosts/eirene/default.nix +++ b/hosts/eirene/default.nix @@ -42,6 +42,7 @@ ../common/configs/system/tlp ../common/configs/system/tmux ../common/configs/system/tree + ../common/configs/system/upower ../common/configs/system/users ../common/configs/system/zsh diff --git a/hosts/elara/default.nix b/hosts/elara/default.nix index e43a17b..559d4f3 100644 --- a/hosts/elara/default.nix +++ b/hosts/elara/default.nix @@ -45,6 +45,7 @@ ../common/configs/system/tlp ../common/configs/system/tmux ../common/configs/system/tree + ../common/configs/system/upower ../common/configs/system/users ../common/configs/system/zsh diff --git a/hosts/himalia/default.nix b/hosts/himalia/default.nix index 4268791..8a24daf 100644 --- a/hosts/himalia/default.nix +++ b/hosts/himalia/default.nix @@ -41,6 +41,7 @@ ../common/configs/system/tlp ../common/configs/system/tmux ../common/configs/system/tree + ../common/configs/system/upower ../common/configs/system/users ../common/configs/system/zsh diff --git a/hosts/himalia/users/nick/default.nix b/hosts/himalia/users/nick/default.nix index 298606f..571cbb4 100644 --- a/hosts/himalia/users/nick/default.nix +++ b/hosts/himalia/users/nick/default.nix @@ -45,8 +45,7 @@ in (import ../../../common/configs/user/console/yt-dlp { inherit user home; }) (import ../../../common/configs/user/console/zsh { inherit user home; }) - # TODO - # (import ../../../common/configs/user/gui/astal { inherit user home; }) + (import ../../../common/configs/user/gui/astal { inherit user home; }) (import ../../../common/configs/user/gui/bluetooth { inherit user home; }) (import ../../../common/configs/user/gui/brightnessctl { inherit user home; }) (import ../../../common/configs/user/gui/btop { inherit user home; })