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}";
+ };
+ };
+ };
+ };
}