about summary refs log tree commit diff stats
path: root/modules/by-name
diff options
context:
space:
mode:
authorBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-05-20 21:22:09 +0200
committerBenedikt Peetz <benedikt.peetz@b-peetz.de>2025-05-20 21:22:09 +0200
commitfd9177b6cc728115999fb78e1266108210b2cb6d (patch)
tree184a4b2ca5879fd70ea94229f817ef5b8c09fd2d /modules/by-name
parentpkgs/{i3bar-river,i3status-rust}: Init (diff)
downloadnixos-config-fd9177b6cc728115999fb78e1266108210b2cb6d.zip
modules/{i3bar-river,i3status-rust}: Init
Diffstat (limited to '')
-rw-r--r--modules/by-name/i3/i3bar-river/module.nix197
-rw-r--r--modules/by-name/i3/i3status-rust/module.nix152
-rwxr-xr-xmodules/by-name/i3/i3status-rust/scripts/mpd_song_name.sh32
3 files changed, 381 insertions, 0 deletions
diff --git a/modules/by-name/i3/i3bar-river/module.nix b/modules/by-name/i3/i3bar-river/module.nix
new file mode 100644
index 00000000..b32ec6a5
--- /dev/null
+++ b/modules/by-name/i3/i3bar-river/module.nix
@@ -0,0 +1,197 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.programs.i3bar-river;
+
+  toColor = color:
+    if builtins.isString color
+    then lib.trivial.fromHexString color
+    else color;
+
+  substractColor = color_a: color_b: let
+    saturatingSub = a: b:
+      if a < b
+      then 0
+      else a - b;
+  in {
+    red = saturatingSub color_a.red color_b.red;
+    green = saturatingSub color_a.green color_b.green;
+    blue = saturatingSub color_a.blue color_b.blue;
+    alpha = saturatingSub color_a.alpha color_b.alpha;
+    inherit (color_a) __toString;
+  };
+
+  colorOption = red: green: blue: alpha:
+    lib.mkOption {
+      type = lib.types.submodule {
+        options = {
+          red = lib.mkOption {
+            type = lib.types.ints.between 0 255;
+            description = "The amount of red in this color";
+            default = toColor red;
+          };
+          green = lib.mkOption {
+            type = lib.types.ints.between 0 255;
+            description = "The amount of green in this color";
+            default = toColor green;
+          };
+          blue = lib.mkOption {
+            type = lib.types.ints.between 0 255;
+            description = "The amount of blue in this color";
+            default = toColor blue;
+          };
+          alpha = lib.mkOption {
+            type = lib.types.ints.between 0 255;
+            description = "The amount of alpha in this color";
+            default = toColor alpha;
+          };
+
+          __toString = lib.mkOption {
+            internal = true;
+
+            default = self: let
+              tH = num: let
+                converted = lib.trivial.toHexString num;
+              in
+                if builtins.stringLength converted == 1
+                then "0${converted}"
+                else assert (builtins.stringLength converted) == 2; converted;
+
+              output = "#${tH self.red}${tH self.green}${tH self.blue}${tH self.alpha}";
+            in
+              output;
+
+            description = "Convert this type to a string before use";
+          };
+        };
+      };
+
+      default = {
+        red = toColor red;
+        green = toColor green;
+        blue = toColor blue;
+        alpha = toColor alpha;
+      };
+
+      description = "The specific color to use for this name.";
+    };
+in {
+  options.soispha.programs.i3bar-river = {
+    enable = lib.mkEnableOption "i3bar-river";
+
+    package = lib.mkPackageOption pkgs "i3bar-river-patched" {};
+
+    colors = {
+      none = colorOption 00 00 00 00;
+
+      white = colorOption "ff" "ff" "ff" "ff";
+
+      blue = colorOption "99" "d1" "db" "ff";
+      green = colorOption "a6" "e3" "a1" "dd";
+      lavendar = colorOption "b4" "be" "fe" "dd";
+      mauve = colorOption "cb" "a6" "f7" "dd";
+      normal = colorOption "c6" "ce" "ef" "ff";
+      peach = colorOption "fa" "b3" "87" "dd";
+      sapphire = colorOption "74" "c7" "ec" "dd";
+      teal = colorOption "94" "e2" "d5" "dd";
+
+      light_gray = colorOption "58" "5b" "70" "ff";
+      gray = colorOption "45" "47" "5a" "ff";
+      dark_gray = colorOption "30" "34" "46" "ff";
+      bright_red = colorOption "e7" "82" "84" "ff";
+
+      vivid_burgundy = colorOption "9f" "1d" "35" "ff";
+
+      unfocused_offset = colorOption "33" "33" "33" "00";
+    };
+  };
+
+  config = lib.mkIf cfg.enable {
+    soispha.programs.river.init.backgroundStart = [cfg.package];
+
+    home-manager.users.soispha = {
+      programs.i3bar-river = {
+        enable = true;
+        inherit (cfg) package;
+
+        settings = {
+          theme = {
+            palette = {
+              # Colors
+              background = toString cfg.colors.none;
+              color = toString cfg.colors.white; # Only used, if blocks do not specify one
+              separator = toString cfg.colors.vivid_burgundy;
+
+              # Tag is set (but not focused or urgent)
+              tag_fg = toString cfg.colors.white;
+              tag_bg = toString cfg.colors.light_gray;
+
+              tag_urgent_fg = toString cfg.colors.white;
+              tag_urgent_bg = toString cfg.colors.bright_red;
+
+              tag_focused_fg = toString cfg.colors.white;
+              tag_focused_bg = toString cfg.colors.teal;
+
+              tag_inactive_fg = toString cfg.colors.white;
+              tag_inactive_bg = toString cfg.colors.none;
+
+              # Shop options
+              blend = true; # whether tags/blocks colors should blend with bar's background
+              hide_inactive_tags = false;
+              show_layout_name = false;
+              show_mode = true;
+              show_tags = true;
+            };
+
+            unfocused_palette = {
+              hide_inactive_tags = true;
+
+              color = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              separator = toString (substractColor cfg.colors.vivid_burgundy cfg.colors.unfocused_offset);
+
+              tag_fg = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              tag_bg = toString (substractColor cfg.colors.light_gray cfg.colors.unfocused_offset);
+
+              tag_urgent_fg = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              tag_urgent_bg = toString (substractColor cfg.colors.bright_red cfg.colors.unfocused_offset);
+
+              tag_focused_fg = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              tag_focused_bg = toString cfg.colors.vivid_burgundy;
+
+              tag_inactive_fg = toString (substractColor cfg.colors.white cfg.colors.unfocused_offset);
+              tag_inactive_bg = toString (substractColor cfg.colors.none cfg.colors.unfocused_offset);
+            };
+          };
+
+          # The font and various sizes
+          font = "SauceCodePro Nerd Font Mono:pixelsize=26";
+          height = 24;
+          margin_top = 10;
+          margin_bottom = 0;
+          margin_left = 0;
+          margin_right = 0;
+          separator_width = 0;
+          tags_r = 10.0;
+          tags_padding = 10.0;
+          tags_margin = 5.0;
+          blocks_r = 6.0;
+          blocks_overlap = 0.0;
+
+          # Misc
+          position = "top"; # either "top" or "bottom"
+          layer = "overlay"; # one of "top", "overlay", "bottom" or "background"
+          invert_touchpad_scrolling = true;
+          start_hidden = false; # whether the bar is initially in the 'hidden' state
+
+          # WM-specific options
+          wm.river = {
+            max_tag = 9; # Show only the first nine tags
+          };
+        };
+      };
+    };
+  };
+}
diff --git a/modules/by-name/i3/i3status-rust/module.nix b/modules/by-name/i3/i3status-rust/module.nix
new file mode 100644
index 00000000..fec740d7
--- /dev/null
+++ b/modules/by-name/i3/i3status-rust/module.nix
@@ -0,0 +1,152 @@
+{
+  config,
+  lib,
+  pkgs,
+  ...
+}: let
+  cfg = config.soispha.programs.i3bar-river;
+
+  mkScript = name: deps:
+    lib.getExe (pkgs.writeShellApplication {
+      inherit name;
+      text = builtins.readFile ./scripts/${name};
+
+      inheritPath = false;
+      runtimeInputs = deps;
+    });
+in {
+  options.soispha.programs.i3status-rust = {
+    enable = lib.mkEnableOption "i3status-rust";
+
+    package = lib.mkPackageOption pkgs "i3status-rust-patched" {};
+  };
+
+  config = lib.mkIf cfg.enable {
+    home-manager.users.soispha = {
+      programs.i3status-rust = {
+        enable = true;
+        inherit (cfg) package;
+
+        bars.default = {
+          settings = {
+            icons = {
+              icons = "material-nf";
+
+              overrides = {
+                cpu = [
+                  "󰍛" # nf-md-memory
+                ];
+                memory_mem = ""; # nf-fa-bars
+              };
+            };
+
+            theme = {
+              theme = "slick";
+
+              overrides = {
+                separator = "native";
+                alternating_tint_bg = "none";
+                alternating_tint_fg = "none";
+              };
+            };
+          };
+
+          blocks = [
+            {
+              block = "time";
+              format = " $timestamp.datetime(format:'%d/%m/%y (%a) %H:%M %:z') ";
+              interval = 60;
+            }
+
+            {
+              # TODO(@bpeetz): Switch to “music” when mpd gets mpris support  <2025-05-20>
+              block = "custom";
+              interval = "once";
+              persistent = true;
+              command = mkScript "mpd_song_name.sh" [pkgs.mpc pkgs.coreutils];
+              hide_when_empty = true;
+              shell = "${lib.getExe pkgs.dash}";
+              format = " $text.str(max_width:60,rot_interval:0.5) ";
+            }
+
+            {
+              block = "sound";
+              driver = "pulseaudio";
+              headphones_indicator = true;
+            }
+
+            # System info
+            {
+              block = "cpu";
+            }
+            {
+              block = "memory";
+              format = " $icon $mem_used_percents {($swap_used_percents.eng(range:1..)) | }";
+            }
+            {
+              block = "amd_gpu";
+              format = "  $icon $utilization (^icon_memory_mem $vram_used_percents) ";
+            }
+
+            {
+              block = "net";
+              format = " ^icon_net_down $speed_down.eng(prefix:Ki) ^icon_net_up $speed_up.eng(prefix:Ki) ";
+            }
+            {
+              block = "privacy";
+              driver = [
+                {name = "v4l";}
+                {name = "pipewire";}
+              ];
+            }
+
+            {
+              block = "disk_space";
+              path = "/srv";
+              info_type = "used";
+              format = " $icon $used.eng(prefix:Gi) ($percentage) ";
+              backend = "btrfs";
+
+              # warn if 80 % is used, alert after 90 % used.
+              warning = 80;
+              alert = 90;
+            }
+            {
+              block = "backlight";
+              missing_format = "";
+            }
+            {
+              block = "battery";
+              missing_format = "";
+            }
+
+            # {
+            #   block = "calendar";
+            #
+            #   source = {
+            #     calendars = ["user/calendar"];
+            #     auth = {
+            #       type = "unauthenticated";
+            #     };
+            #   };
+            # }
+            # {
+            #   block = "focused_window";
+            #   driver = "wlr_toplevel_management";
+            # }
+            # {
+            #   block = "maildir";
+            #   display_type = "new";
+            #   inboxes = ["~/.local/share/maildir/soispha/*"];
+            #   interval = 60;
+            #   threshold_critical = 10;
+            #   threshold_warning = 1;
+            # }
+          ];
+        };
+      };
+
+      programs.i3bar-river.settings.command = "${lib.getExe cfg.package} config-default.toml";
+    };
+  };
+}
diff --git a/modules/by-name/i3/i3status-rust/scripts/mpd_song_name.sh b/modules/by-name/i3/i3status-rust/scripts/mpd_song_name.sh
new file mode 100755
index 00000000..28921520
--- /dev/null
+++ b/modules/by-name/i3/i3status-rust/scripts/mpd_song_name.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env dash
+
+# nixos-config - My current NixOS configuration
+#
+# Copyright (C) 2025 Benedikt Peetz <benedikt.peetz@b-peetz.de>
+# SPDX-License-Identifier: GPL-3.0-or-later
+#
+# This file is part of my nixos-config.
+#
+# You should have received a copy of the License along with this program.
+# If not, see <https://www.gnu.org/licenses/gpl-3.0.txt>.
+
+while true; do
+    state="$(mpc status '%state%')"
+
+    if [ "$state" = "playing" ]; then
+        song="$(mpc --format '[[%artist% - ]%title%]|[%file%]' current)"
+        progress="$(mpc status "%currenttime%/%totaltime%")"
+
+        echo "$song :: $progress"
+    else
+        # The song has stopped, we are done displaying it.
+        echo ""
+
+        # Wait for a new song. (Or in this case for a new event.)
+        mpc idle
+    fi
+
+    sleep 1
+done
+
+# vim: ft=sh