waybar: Move from wm module

This commit is contained in:
Quentin Boyer 2025-08-17 13:19:08 +02:00
parent bc3e90b9e7
commit 68431ecb32
8 changed files with 357 additions and 324 deletions

View file

@ -159,6 +159,7 @@
wayland-pipewire-idle-inhibit = inputs.wayland-pipewire-idle-inhibit.homeModules.default;
};
wm = import ./wm/hm.nix;
waybar = import ./waybar/hm.nix;
de = import ./de/hm.nix;
personal-gui = import ./personal-gui/hm.nix;
gaming = import ./gaming/hm.nix;

View file

@ -19,6 +19,7 @@
personal-cli
gui
wm
waybar
gaming
];
};

View file

@ -20,6 +20,7 @@
personal-cli
gui
wm
waybar
personal-gui
];
unfreePackages = [

View file

@ -26,6 +26,7 @@
minimal
personal-cli
gui
waybar
wm
];
};
@ -37,6 +38,7 @@
work
personal-cli
gui
waybar
wm
])
++ [

263
waybar/hm.nix Normal file
View file

@ -0,0 +1,263 @@
{
lib,
pkgs,
config,
...
}:
{
options.traxys.waybar =
let
jsonFormat = pkgs.formats.json { };
modulesListOpt = lib.mkOption {
type = lib.types.listOf (
lib.types.submodule {
options = {
name = lib.mkOption { type = lib.types.str; };
priority = lib.mkOption { type = lib.types.int; };
};
}
);
default = [ ];
apply = opt: builtins.map (v: v.name) (lib.sortOn (v: v.priority) opt);
};
in
{
enable = lib.mkEnableOption "waybar configuration";
mkIcon = lib.mkOption {
type = lib.types.functionTo lib.types.str;
readOnly = true;
default = icon: "<span font='20' rise='-3000' line_height='0.7'>${icon}</span>";
};
modules-left = modulesListOpt;
modules-center = modulesListOpt;
modules-right = modulesListOpt;
modules =
let
moduleOpt =
{
side ? "right",
enable ? true,
priority,
extraOpts ? { },
settings,
}:
{
enable = lib.mkOption {
type = lib.types.bool;
default = enable;
};
side = lib.mkOption {
type = lib.types.enum [
"left"
"center"
"right"
];
default = side;
};
priority = lib.mkOption {
type = lib.types.int;
default = priority;
};
settings = lib.mkOption {
inherit (jsonFormat) type;
default = settings;
};
}
// extraOpts;
inherit (config.traxys.waybar) mkIcon;
in
{
#
# Left
#
"custom/khal" = moduleOpt {
enable = false;
side = "left";
priority = 5;
settings = {
format = "{}";
tooltip = true;
interval = 300;
format-icons = {
default = "";
};
exec = "${lib.getExe pkgs.python3} ${./waybar-khal.py}";
return-type = "json";
};
};
"network#wifi" = moduleOpt {
enable = false;
side = "left";
priority = 10;
extraOpts = {
interface = lib.mkOption { type = lib.types.str; };
};
settings = {
inherit (config.traxys.waybar.modules."network#wifi") interface;
format-wifi = "{essid} ({signalStrength}%) ";
format-disconnected = "";
};
};
"sway/workspaces" = moduleOpt {
enable = false;
side = "left";
priority = 20;
settings = {
persistent-workspaces = {
"" = [ ];
"" = [ ];
"1:" = [ ];
};
numeric-first = true;
};
};
"sway/mode" = moduleOpt {
enable = false;
side = "left";
priority = 30;
settings = { };
};
#
# Center
#
"sway/window" = moduleOpt {
enable = false;
side = "center";
priority = 10;
settings = {
max-length = 50;
};
};
#
# Right
#
"cpu" = moduleOpt {
priority = 10;
settings = {
format = "${mkIcon ""} {load}";
};
};
"memory" = moduleOpt {
priority = 20;
settings = {
format = "${mkIcon ""} {used:.0f}G/{total:.0f}G";
};
};
"disk#home" = moduleOpt {
priority = 30;
settings = {
path = "/home";
format = "${mkIcon ""} {free}";
};
};
"disk#root" = moduleOpt {
priority = 40;
settings = {
path = "/";
format = " {percentage_free}%";
};
};
"battery" = moduleOpt {
enable = false;
priority = 50;
settings = {
format = "{capacity}% ${mkIcon "{icon}"}";
format-icons = [
""
""
""
""
""
];
};
};
"clock" = moduleOpt {
priority = 60;
settings = {
format-alt = "{:%a, %d. %b %H:%M}";
};
};
"tray" = moduleOpt {
priority = 70;
settings = { };
};
"pulseaudio" = moduleOpt {
priority = 80;
settings = { };
};
};
};
config =
let
cfg = config.traxys.waybar;
addKey =
key: value: attrs:
attrs // { ${key} = attrs.${key} // value; };
modulesList =
lib.foldlAttrs
(
acc: name: mod:
addKey mod.side { ${name} = mod; } acc
)
{
center = { };
left = { };
right = { };
}
config.traxys.waybar.modules;
enabledModulesSide = side: lib.filterAttrs (_: v: v.enable) modulesList.${side};
moduleListSide =
side:
lib.mapAttrsToList (name: v: {
inherit name;
inherit (v) priority;
}) (enabledModulesSide side);
in
lib.mkIf cfg.enable {
traxys.waybar.modules-left = moduleListSide "left";
traxys.waybar.modules-center = moduleListSide "center";
traxys.waybar.modules-right = moduleListSide "right";
programs.waybar = {
enable = true;
style = builtins.readFile ./waybar.css;
settings = [
(
{
layer = "top";
position = "bottom";
inherit (cfg) modules-left;
inherit (cfg) modules-center;
inherit (cfg) modules-right;
}
// (builtins.mapAttrs (_: v: v.settings) (lib.filterAttrs (_: v: v.enable) cfg.modules))
)
];
};
};
}

View file

@ -24,334 +24,99 @@ let
startup = startupNotifications ++ cfg.startup;
in
{
options = {
traxys.waybar =
with lib.types;
let
jsonFormat = pkgs.formats.json { };
config = mkIf (cfg.enable && cfg.kind == "sway") {
home.packages = with pkgs; [ sway ] ++ (if cfg.wallpaper != null then [ pkgs.swaybg ] else [ ]);
modulesListOpt = mkOption {
type = listOf (submodule {
options = {
name = mkOption { type = str; };
priority = mkOption { type = types.int; };
};
});
default = [ ];
apply = opt: builtins.map (v: v.name) (lib.sortOn (v: v.priority) opt);
};
in
{
modules-left = modulesListOpt;
modules-center = modulesListOpt;
modules-right = modulesListOpt;
home.sessionVariables = {
MOZ_ENABLE_WAYLAND = "1";
XDG_CURRENT_DESKTOP = "sway";
LIBSEAT_BACKEND = "logind";
_JAVA_AWT_WM_NONREPARENTING = 1;
};
modules =
let
moduleOpt =
{
side ? "right",
enable ? true,
priority,
extraOpts ? { },
settings,
}:
{
enable = mkOption {
type = bool;
default = enable;
};
programs.rofi.package = pkgs.rofi-wayland;
side = mkOption {
type = enum [
"left"
"center"
"right"
];
default = side;
};
priority = mkOption {
type = int;
default = priority;
};
settings = mkOption {
inherit (jsonFormat) type;
default = settings;
};
}
// extraOpts;
is = "<span font='20' rise='-3000' line_height='0.7'>";
ie = "</span>";
in
{
# Left
"custom/khal" = moduleOpt {
enable = false;
side = "left";
priority = 5;
settings = {
format = "{}";
tooltip = true;
interval = 300;
format-icons = {
default = "";
};
exec = "${lib.getExe pkgs.python3} ${./waybar-khal.py}";
return-type = "json";
};
};
"network#wifi" = moduleOpt {
side = "left";
enable = false;
priority = 10;
extraOpts = {
interface = mkOption { type = str; };
};
settings = {
inherit (config.traxys.waybar.modules."network#wifi") interface;
format-wifi = "{essid} ({signalStrength}%) ";
format-disconnected = "";
};
};
"sway/workspaces" = moduleOpt {
side = "left";
priority = 20;
settings = {
persistent-workspaces = {
"" = [ ];
"" = [ ];
"1:" = [ ];
};
numeric-first = true;
};
};
"sway/mode" = moduleOpt {
side = "left";
priority = 30;
settings = { };
};
# Center
"sway/window" = moduleOpt {
side = "center";
priority = 10;
settings = {
max-length = 50;
};
};
# Right
"cpu" = moduleOpt {
priority = 10;
settings = {
format = "${is}${ie} {load}";
};
};
"memory" = moduleOpt {
priority = 20;
settings = {
format = "${is}${ie} {used:.0f}G/{total:.0f}G";
};
};
"disk#home" = moduleOpt {
priority = 30;
settings = {
path = "/home";
format = "${is}${ie} {free}";
};
};
"disk#root" = moduleOpt {
priority = 40;
settings = {
path = "/";
format = " {percentage_free}%";
};
};
"battery" = moduleOpt {
enable = false;
priority = 50;
settings = {
format = "{capacity}% ${is}{icon}${ie}";
format-icons = [
""
""
""
""
""
];
};
};
"clock" = moduleOpt {
priority = 60;
settings = {
format-alt = "{:%a, %d. %b %H:%M}";
};
};
"tray" = moduleOpt {
priority = 70;
settings = { };
};
"pulseaudio" = moduleOpt {
priority = 80;
settings = { };
};
};
};
};
config =
let
addKey =
key: value: attrs:
attrs // { ${key} = attrs.${key} // value; };
modulesList =
lib.foldlAttrs
(
acc: name: mod:
addKey mod.side { ${name} = mod; } acc
)
{
center = { };
left = { };
right = { };
}
config.traxys.waybar.modules;
enabledModulesSide = side: lib.filterAttrs (_: v: v.enable) modulesList.${side};
moduleListSide =
side:
lib.mapAttrsToList (name: v: {
inherit name;
inherit (v) priority;
}) (enabledModulesSide side);
in
mkIf (cfg.enable && cfg.kind == "sway") {
traxys.waybar.modules-left = moduleListSide "left";
traxys.waybar.modules-center = moduleListSide "center";
traxys.waybar.modules-right = moduleListSide "right";
home.packages = with pkgs; [ sway ] ++ (if cfg.wallpaper != null then [ pkgs.swaybg ] else [ ]);
home.sessionVariables = {
MOZ_ENABLE_WAYLAND = "1";
XDG_CURRENT_DESKTOP = "sway";
LIBSEAT_BACKEND = "logind";
_JAVA_AWT_WM_NONREPARENTING = 1;
};
programs.rofi.package = pkgs.rofi-wayland;
services.mako = mkIf cfg.notifications.enable {
enable = true;
settings = {
inherit (cfg.notifications) font;
margin = "20,20,5,5";
default-timeout = cfg.notifications.defaultTimeout;
"mode=do-not-disturb" = {
invisible = 1;
};
};
};
programs = {
waybar = {
enable = true;
style = builtins.readFile ./waybar.css;
settings = [
(
{
layer = "top";
position = "bottom";
inherit (config.traxys.waybar) modules-left;
inherit (config.traxys.waybar) modules-center;
inherit (config.traxys.waybar) modules-right;
}
// (builtins.mapAttrs (_: v: v.settings) (
lib.filterAttrs (_: v: v.enable) config.traxys.waybar.modules
))
)
];
};
};
wm.printScreen.command = mkDefault "${pkgs.grim}/bin/grim -g \"$(${pkgs.slurp}/bin/slurp)\" - | ${pkgs.wl-clipboard}/bin/wl-copy -t image/png";
wm.exit.command = mkDefault "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'";
wayland.windowManager.sway = {
enable = true;
extraConfig = mkMerge [
(mkIf (cfg.wallpaper != null) ''
output "*" bg ${cfg.wallpaper} fill
'')
''
for_window [app_id="discord"] border none
''
];
config = {
inherit startup;
inherit (cfg) modifier;
bars = [ { command = "waybar"; } ];
input =
let
inherit (config.extraInfo) inputs;
inputsCfg = [
(
if inputs.touchpad != null then
{
name = inputs.touchpad;
value = {
dwt = "disable";
};
}
else
null
)
{
name = "type:keyboard";
value = {
xkb_layout = "fr(ergol),us";
xkb_options = "compose:102";
};
}
];
in
builtins.listToAttrs (builtins.filter (s: s != null) inputsCfg);
output = config.extraInfo.outputs;
fonts = common.mkFont cfg.font;
window = {
titlebar = true;
commands = [
{
criteria.class = "davmail-DavGateway";
command = "floating enable";
}
{
criteria.window_type = "menu";
command = "floating enable";
}
];
};
inherit (common) keybindings;
inherit (common) workspaceOutputAssign;
inherit (common) assigns;
seat."*" = {
xcursor_theme = "${config.home.pointerCursor.name} ${toString config.home.pointerCursor.size}";
};
services.mako = mkIf cfg.notifications.enable {
enable = true;
settings = {
inherit (cfg.notifications) font;
margin = "20,20,5,5";
default-timeout = cfg.notifications.defaultTimeout;
"mode=do-not-disturb" = {
invisible = 1;
};
};
};
traxys.waybar.enable = true;
traxys.waybar.modules."sway/workspaces".enable = true;
traxys.waybar.modules."sway/mode".enable = true;
traxys.waybar.modules."sway/window".enable = true;
wm.printScreen.command = mkDefault "${pkgs.grim}/bin/grim -g \"$(${pkgs.slurp}/bin/slurp)\" - | ${pkgs.wl-clipboard}/bin/wl-copy -t image/png";
wm.exit.command = mkDefault "exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'";
wayland.windowManager.sway = {
enable = true;
extraConfig = mkMerge [
(mkIf (cfg.wallpaper != null) ''
output "*" bg ${cfg.wallpaper} fill
'')
''
for_window [app_id="discord"] border none
''
];
config = {
inherit startup;
inherit (cfg) modifier;
bars = [ { command = "waybar"; } ];
input =
let
inherit (config.extraInfo) inputs;
inputsCfg = [
(
if inputs.touchpad != null then
{
name = inputs.touchpad;
value = {
dwt = "disable";
};
}
else
null
)
{
name = "type:keyboard";
value = {
xkb_layout = "fr(ergol),us";
xkb_options = "compose:102";
};
}
];
in
builtins.listToAttrs (builtins.filter (s: s != null) inputsCfg);
output = config.extraInfo.outputs;
fonts = common.mkFont cfg.font;
window = {
titlebar = true;
commands = [
{
criteria.class = "davmail-DavGateway";
command = "floating enable";
}
{
criteria.window_type = "menu";
command = "floating enable";
}
];
};
inherit (common) keybindings;
inherit (common) workspaceOutputAssign;
inherit (common) assigns;
seat."*" = {
xcursor_theme = "${config.home.pointerCursor.name} ${toString config.home.pointerCursor.size}";
};
};
};
};
}