From 68431ecb32e3f651190890dd7f01b84e065a282a Mon Sep 17 00:00:00 2001 From: Quentin Boyer Date: Sun, 17 Aug 2025 13:19:08 +0200 Subject: [PATCH] waybar: Move from wm module --- flake.nix | 1 + hostconfig/ZeNixLaptop/default.nix | 1 + hostconfig/gandalf/default.nix | 1 + hostconfig/thinkpad-nixos/default.nix | 2 + waybar/hm.nix | 263 ++++++++++++++++ {wm => waybar}/waybar-khal.py | 0 {wm => waybar}/waybar.css | 0 wm/sway.nix | 413 ++++++-------------------- 8 files changed, 357 insertions(+), 324 deletions(-) create mode 100644 waybar/hm.nix rename {wm => waybar}/waybar-khal.py (100%) rename {wm => waybar}/waybar.css (100%) diff --git a/flake.nix b/flake.nix index bab1a89..89cddf6 100644 --- a/flake.nix +++ b/flake.nix @@ -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; diff --git a/hostconfig/ZeNixLaptop/default.nix b/hostconfig/ZeNixLaptop/default.nix index f78fc29..8547cc5 100644 --- a/hostconfig/ZeNixLaptop/default.nix +++ b/hostconfig/ZeNixLaptop/default.nix @@ -19,6 +19,7 @@ personal-cli gui wm + waybar gaming ]; }; diff --git a/hostconfig/gandalf/default.nix b/hostconfig/gandalf/default.nix index b70de05..022be28 100644 --- a/hostconfig/gandalf/default.nix +++ b/hostconfig/gandalf/default.nix @@ -20,6 +20,7 @@ personal-cli gui wm + waybar personal-gui ]; unfreePackages = [ diff --git a/hostconfig/thinkpad-nixos/default.nix b/hostconfig/thinkpad-nixos/default.nix index 1a3149f..da9159f 100644 --- a/hostconfig/thinkpad-nixos/default.nix +++ b/hostconfig/thinkpad-nixos/default.nix @@ -26,6 +26,7 @@ minimal personal-cli gui + waybar wm ]; }; @@ -37,6 +38,7 @@ work personal-cli gui + waybar wm ]) ++ [ diff --git a/waybar/hm.nix b/waybar/hm.nix new file mode 100644 index 0000000..f07b9b6 --- /dev/null +++ b/waybar/hm.nix @@ -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: "${icon}"; + }; + + 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)) + ) + ]; + }; + }; + +} diff --git a/wm/waybar-khal.py b/waybar/waybar-khal.py similarity index 100% rename from wm/waybar-khal.py rename to waybar/waybar-khal.py diff --git a/wm/waybar.css b/waybar/waybar.css similarity index 100% rename from wm/waybar.css rename to waybar/waybar.css diff --git a/wm/sway.nix b/wm/sway.nix index 1c1aefd..218e351 100644 --- a/wm/sway.nix +++ b/wm/sway.nix @@ -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 = ""; - ie = ""; - 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}"; + }; + }; + }; + }; }