133 lines
4.9 KiB
Nix
133 lines
4.9 KiB
Nix
# nwg-panel: a wayland status bar (like waybar, etc)
|
|
# documentation is in the GitHub Wiki:
|
|
# - <https://github.com/nwg-piotr/nwg-panel/wiki/Configuration>
|
|
#
|
|
# interactively configure with: `nwg-panel-config`
|
|
# ^ note that this may interfere with the `nwg-panel` service
|
|
{ config, lib, pkgs, ... }:
|
|
let
|
|
cfg = config.sane.programs.nwg-panel;
|
|
mkEnableOption' = default: description: lib.mkOption {
|
|
type = lib.types.bool;
|
|
inherit default description;
|
|
};
|
|
in
|
|
{
|
|
sane.programs.nwg-panel = {
|
|
configOption = with lib; mkOption {
|
|
default = {};
|
|
type = types.submodule {
|
|
options = {
|
|
clockFontSize = mkOption {
|
|
type = types.int;
|
|
# what looks good:
|
|
# - 15px on moby
|
|
# - 24px on lappy
|
|
default = lib.min 24 (cfg.config.fontSize - 1);
|
|
};
|
|
fontSize = mkOption {
|
|
type = types.int;
|
|
default = 16;
|
|
};
|
|
height = mkOption {
|
|
type = types.int;
|
|
default = 40;
|
|
description = ''
|
|
height of the top bar in px.
|
|
'';
|
|
};
|
|
battery = mkEnableOption' true "display battery status";
|
|
brightness = mkEnableOption' true "display backlight level and slider";
|
|
mediaTitle = mkEnableOption' true "display title of current song/media";
|
|
mediaPrevNext = mkEnableOption' true "display prev/next button in media";
|
|
windowIcon = mkEnableOption' true "display icon of active window";
|
|
windowTitle = mkEnableOption' true "display title of active window";
|
|
workspaceNumbers = mkOption {
|
|
type = types.listOf types.str;
|
|
default = [
|
|
# TODO: workspace 10 should be rendered as "TV"
|
|
"1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
|
|
];
|
|
description = ''
|
|
workspaces to monitor
|
|
'';
|
|
};
|
|
workspaceHideEmpty = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
};
|
|
};
|
|
};
|
|
};
|
|
|
|
packageUnwrapped = (pkgs.nwg-panel.override {
|
|
# XXX(2024/06/13): hyprland does not cross compile
|
|
hyprland = null;
|
|
# XXX(2024/06/13): wlr-randr does not cross compile
|
|
wlr-randr = null; #< only used if not on sway/hyprland; or if using dwl
|
|
}).overrideAttrs (base: {
|
|
patches = (base.patches or []) ++ lib.optionals (!cfg.config.mediaPrevNext) [
|
|
./playerctl-no-prev-next.diff
|
|
];
|
|
|
|
# - disable the drop-down chevron by the controls.
|
|
# it's precious space on moby, doesn't do much to help on lappy either.
|
|
# - disable brightness indicator for same reason.
|
|
# - *leave* the volume indicator: one *could* remove it, however on desko that would leave the controls pane empty
|
|
# making the dropdown inaccessible
|
|
postPatch = (base.postPatch or "") + ''
|
|
substituteInPlace nwg_panel/modules/controls.py --replace-fail \
|
|
'box.pack_start(self.pan_image, False, False, 4)' \
|
|
'# box.pack_start(self.pan_image, False, False, 4)'
|
|
substituteInPlace nwg_panel/modules/controls.py --replace-fail \
|
|
'box.pack_start(self.bri_image, False, False, 4)' \
|
|
'# box.pack_start(self.bri_image, False, False, 4)'
|
|
|
|
# substituteInPlace nwg_panel/modules/controls.py --replace-fail \
|
|
# 'box.pack_start(self.vol_image, False, False, 4)' \
|
|
# '# box.pack_start(self.vol_image, False, False, 4)'
|
|
'';
|
|
|
|
# XXX(2024/06/13) the bluetooth stuff doesn't cross compile, so disable it
|
|
propagatedBuildInputs = lib.filter (p: p.pname != "pybluez") base.propagatedBuildInputs;
|
|
|
|
strictDeps = true;
|
|
});
|
|
|
|
suggestedPrograms = [
|
|
"pactl" # pactl required by `per-app-volume` component.
|
|
];
|
|
|
|
fs.".config/nwg-panel/style.css".symlink.target = pkgs.substituteAll {
|
|
src = ./style.css;
|
|
inherit (cfg.config) fontSize clockFontSize;
|
|
};
|
|
fs.".config/nwg-panel/config".symlink.target = pkgs.writers.writeJSON "config" (import ./config.nix {
|
|
inherit (cfg.config) height windowIcon windowTitle workspaceHideEmpty workspaceNumbers;
|
|
# component order matters, mostly for the drop-down.
|
|
# default for most tools (e.g. swaync) is brightness control above volume.
|
|
components =
|
|
lib.optionals cfg.config.brightness [
|
|
"brightness"
|
|
] ++ [
|
|
"volume"
|
|
"per-app-volume"
|
|
] ++ lib.optionals cfg.config.battery [
|
|
"battery"
|
|
]
|
|
;
|
|
playerctlChars = if cfg.config.mediaTitle then 60 else 0;
|
|
});
|
|
|
|
services.nwg-panel = {
|
|
description = "nwg-panel status/topbar for wayland";
|
|
partOf = [ "graphical-session" ];
|
|
|
|
# to debug styling, run with GTK_DEBUG=interactive
|
|
# N.B.: G_MESSAGES_DEBUG=all causes the swaync icon to not render
|
|
# command = "env G_MESSAGES_DEBUG=all nwg-panel";
|
|
command = "nwg-panel";
|
|
};
|
|
};
|
|
}
|