From e936b9da8f0826785049d08e40c9595cf3210824 Mon Sep 17 00:00:00 2001 From: Drew Haven Date: Mon, 1 Jun 2026 16:54:06 -0700 Subject: [PATCH] [Hyprland,Eww] Refactors configs so that I can share more between Vega and Altair --- home-manager/features/eww/default.nix | 53 +++++++++-- .../features/hypr/config/autostart.lua | 5 - .../features/hypr/config/hyprland.lua | 38 ++++---- home-manager/features/hypr/hyprland.nix | 32 ++++++- home-manager/features/hyprpaper.nix | 5 +- home-manager/features/linux-desktop.nix | 13 ++- home-manager/features/wpaperd.nix | 5 +- home-manager/options/monitors.nix | 71 ++++++++++++++ system/hosts/altair/drew.nix | 78 ++++++++------- system/hosts/vega/configuration.nix | 3 +- system/hosts/vega/drew.nix | 94 ++++++++++--------- system/hosts/vega/hardware-configuration.nix | 1 + 12 files changed, 274 insertions(+), 124 deletions(-) create mode 100644 home-manager/options/monitors.nix diff --git a/home-manager/features/eww/default.nix b/home-manager/features/eww/default.nix index 3b38cf8..793fbb8 100644 --- a/home-manager/features/eww/default.nix +++ b/home-manager/features/eww/default.nix @@ -1,15 +1,48 @@ -{ pkgs, ... }: { - home = { - packages = with pkgs; [ - # For Noto Sans NF - nerd-fonts.noto - ]; - - file.".config/eww".source = ./config; + config, + pkgs, + lib, + ... +}: +{ + options = { + programs.eww.widgets = lib.mkOption { + type = lib.types.listOf lib.types.str; + default = [ ]; + }; }; - programs.eww = { - enable = true; + config = { + home = { + packages = with pkgs; [ + # For Noto Sans NF + nerd-fonts.noto + ]; + + file.".config/eww".source = ./config; + }; + + programs.eww = { + enable = true; + }; + + systemd.user.services.eww = lib.mkIf (config.programs.eww.widgets != [ ]) { + Unit = { + Description = "Eww widgets"; + After = [ "hyprland-session.target" ]; # Start only after hyprland + PartOf = [ "hyprland-session.target" ]; # Force it to exit if hyprland does + }; + + Service = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = "${pkgs.eww}/bin/eww open ${lib.concatStringsSep " " config.programs.eww.widgets}"; + ExecStop = "${pkgs.eww}/bin/eww kill"; + }; + + Install = { + WantedBy = [ "hyprland-session.target" ]; + }; + }; }; } diff --git a/home-manager/features/hypr/config/autostart.lua b/home-manager/features/hypr/config/autostart.lua index bc28578..59a68da 100644 --- a/home-manager/features/hypr/config/autostart.lua +++ b/home-manager/features/hypr/config/autostart.lua @@ -1,10 +1,5 @@ hl.on("hyprland.start", function() hl.exec_cmd("nm-applet") - -- hl.exec_cmd("sleep 2 && hyprpm reload -n") - -- hl.exec_cmd("systemctl --user start hyprpolkitagent") hl.exec_cmd("gsettings set org.gnome.desktop.interface color-scheme 'prefer-dark'") hl.exec_cmd("gsettings set org.gnome.desktop.interface gtk-theme 'Adwaita-dark'") - hl.exec_cmd("wpaperd") - hl.exec_cmd("sleep 2 && eww open-many primary-statusbar secondary-statusbar") - hl.exec_cmd("xrandr --output DP-2 --primary") end) diff --git a/home-manager/features/hypr/config/hyprland.lua b/home-manager/features/hypr/config/hyprland.lua index df0c53c..7aaf1ee 100644 --- a/home-manager/features/hypr/config/hyprland.lua +++ b/home-manager/features/hypr/config/hyprland.lua @@ -84,25 +84,25 @@ hl.device({ sensitivity = -0.200000, }) -hl.monitor({ - output = "DP-2", - mode = "3440x1440@164", - position = "0x0", -}) -hl.monitor({ - output = "DP-1", - mode = "2560x1440", - position = "-1440x-510", - -- 0 -> normal (no transforms) - -- 1 -> 90 degrees - -- 2 -> 180 degrees - -- 3 -> 270 degrees - -- 4 -> flipped - -- 5 -> flipped + 90 degrees - -- 6 -> flipped + 180 degrees - -- 7 -> flipped + 270 degrees - transform = 1, -}) +-- hl.monitor({ +-- output = "DP-2", +-- mode = "3440x1440@164", +-- position = "0x0", +-- }) +-- hl.monitor({ +-- output = "DP-1", +-- mode = "2560x1440", +-- position = "-1440x-510", +-- -- 0 -> normal (no transforms) +-- -- 1 -> 90 degrees +-- -- 2 -> 180 degrees +-- -- 3 -> 270 degrees +-- -- 4 -> flipped +-- -- 5 -> flipped + 90 degrees +-- -- 6 -> flipped + 180 degrees +-- -- 7 -> flipped + 270 degrees +-- transform = 1, +-- }) for i = 1, 10 do hl.workspace_rule({ workspace = i, monitor = "DP-1", default_name = "L" .. tostring(i) }) diff --git a/home-manager/features/hypr/hyprland.nix b/home-manager/features/hypr/hyprland.nix index ff5353a..34f2605 100644 --- a/home-manager/features/hypr/hyprland.nix +++ b/home-manager/features/hypr/hyprland.nix @@ -1,8 +1,15 @@ -{ pkgs, inputs, ... }: +{ + pkgs, + inputs, + config, + lib, + ... +}: { imports = [ ../swaylock.nix ./hypridle.nix + ../../options/monitors.nix ]; xdg.configFile = { @@ -11,9 +18,27 @@ recursive = true; }; - "hypr/base.lua" = { - source = ./config/hyprland.lua; + "hypr/monitors.lua" = { + text = lib.concatStrings ( + lib.imap0 ( + idx: + { name, value }: + let + offset = idx * 10; + in + lib.concatMapStrings ( + i: + let + ws = offset + i; + in + '' + hl.workspace_rule({ workspace = ${toString ws}, monitor = "${name}", default_name = "${name}_${toString i}" }) + '' + ) (lib.range 1 10) + ) (lib.attrsToList config.hardware.monitors) + ); }; + "hypr/config" = { source = ./config; recursive = true; @@ -43,6 +68,7 @@ ]; extraConfig = '' + require("monitors") require("config.hyprland") ''; diff --git a/home-manager/features/hyprpaper.nix b/home-manager/features/hyprpaper.nix index 886e968..5abd8d2 100644 --- a/home-manager/features/hyprpaper.nix +++ b/home-manager/features/hyprpaper.nix @@ -1,4 +1,5 @@ -monitors: _: { +{ config, ... }: +{ services.hyprpaper = { enable = true; settings = { @@ -9,7 +10,7 @@ monitors: _: { timeout = 3600; recursive = true; fit_mode = "cover"; - }) monitors; + }) (builtins.attrNames config.hardware.monitors); }; }; } diff --git a/home-manager/features/linux-desktop.nix b/home-manager/features/linux-desktop.nix index de30345..6c8ed45 100644 --- a/home-manager/features/linux-desktop.nix +++ b/home-manager/features/linux-desktop.nix @@ -1,4 +1,9 @@ -{ pkgs, inputs, ... }: +{ + config, + pkgs, + inputs, + ... +}: let zen-browser = inputs.zen-browser.packages.${pkgs.stdenv.hostPlatform.system}.default; in @@ -11,6 +16,7 @@ in ../apps/element.nix ../apps/discord.nix ./terminal.nix + ../options/monitors.nix ]; home = { @@ -59,7 +65,10 @@ in programs = { # browsers - firefox.enable = true; + firefox = { + enable = true; + configPath = "${config.xdg.configHome}/mozilla/firefox"; + }; chromium.enable = true; }; diff --git a/home-manager/features/wpaperd.nix b/home-manager/features/wpaperd.nix index 0e176a1..47950db 100644 --- a/home-manager/features/wpaperd.nix +++ b/home-manager/features/wpaperd.nix @@ -1,4 +1,5 @@ -monitors: _: { +{ config }: +{ # NOTE: Wpaperd displays wallpaper upside-down on 90ยด ccw rotated # monitors as of 26.05 services.wpaperd = { @@ -12,7 +13,7 @@ monitors: _: { # containes the current images. path = "~/Pictures/Wallpaper/${mon}"; }; - }) monitors + }) (builtins.attrNames config.hardware.monitors) ) // { default = { diff --git a/home-manager/options/monitors.nix b/home-manager/options/monitors.nix new file mode 100644 index 0000000..97b9eb6 --- /dev/null +++ b/home-manager/options/monitors.nix @@ -0,0 +1,71 @@ +{ lib, config, ... }: +{ + options = + with lib; + with types; + { + hardware.monitors = mkOption { + type = lazyAttrsOf (submodule { + options = { + mode = mkOption { + type = str; + default = "auto"; + }; + position = mkOption { + type = str; + default = "auto"; + }; + rotation = mkOption { + type = enum [ + "none" + "90" + "180" + "270" + ]; + default = "none"; + }; + flipped = mkOption { + type = bool; + default = false; + }; + }; + }); + default = { }; + description = "Monitor configuration"; + }; + }; + + # config = { + # wayland.windowManager.hyprland.settings.monitors = + # let + # transformMap = { + # "none" = { + # normal = 0; + # flipped = 4; + # }; + # "90" = { + # normal = 1; + # flipped = 5; + # }; + # "180" = { + # normal = 2; + # flipped = 6; + # }; + # "270" = { + # normal = 3; + # flipped = 7; + # }; + # }; + # + # monitorTransform = + # m: + # let + # t = transformMap.${m.rotation}; + # in + # if m.flipped then t.flipped else t.normal; + # monitorString = + # name: m: "${name}, ${m.mode}, ${m.position}, 1, transform, ${toString (monitorTransform m)}"; + # in + # lib.mapAttrsToList monitorString config.hardware.monitors; + # }; +} diff --git a/system/hosts/altair/drew.nix b/system/hosts/altair/drew.nix index 08ab9ef..9877e40 100644 --- a/system/hosts/altair/drew.nix +++ b/system/hosts/altair/drew.nix @@ -1,33 +1,24 @@ -{ ... }: -let - monitors = [ - "DP-1" - "DP-2" - ]; -in +{ pkgs, ... }: { - imports = - map (x: ../../../home-manager + x) [ - "/features/astronomy.nix" - "/features/chat.nix" - "/features/development/development.nix" - "/features/development/docker.nix" - "/features/development/haskell.nix" - "/features/development/markdown.nix" - "/features/development/typescript.nix" - "/features/development/vscode.nix" - "/features/eww" - "/features/email.nix" - "/features/gaming.nix" - "/features/image-editing.nix" - "/features/linux-desktop.nix" - "/features/mounts/mcp-archive.nix" - "/features/notes.nix" - "/features/3d-printing.nix" - ] - ++ [ - (import ../../../home-manager/features/hyprpaper.nix monitors) - ]; + imports = map (x: ../../../home-manager + x) [ + "/features/astronomy.nix" + "/features/chat.nix" + "/features/development/development.nix" + "/features/development/docker.nix" + "/features/development/haskell.nix" + "/features/development/markdown.nix" + "/features/development/typescript.nix" + "/features/development/vscode.nix" + "/features/eww" + "/features/email.nix" + "/features/gaming.nix" + "/features/image-editing.nix" + "/features/linux-desktop.nix" + "/features/mounts/mcp-archive.nix" + "/features/notes.nix" + "/features/3d-printing.nix" + "/features/hyprpaper.nix" + ]; home = { stateVersion = "24.11"; @@ -48,17 +39,34 @@ in }; }; - # TODO: Merge into lua config + hardware.monitors = { + "DP-2" = { + position = "0x0"; + mode = "3440x1440@164"; + }; + "DP-1" = { + mode = "2560x1440"; + position = "-1440x-510"; + rotation = "90"; + }; + }; + + programs.eww.widgets = [ + "primary-statusbar" + "secondary-statusbar" + ]; + + # TODO: Still merging these into the LUA config # wayland.windowManager.hyprland.settings = { - # exec-once = [ + # exec_once = [ # # Set up eww here because it's based on the monitor configuration # "sleep 2 && eww open-many primary-statusbar secondary-statusbar" # # Set DP-2 as the primary monitor, otherwise it defaults to DP-1 because it's first in the list. # "xrandr --output DP-2 --primary" # ]; - # windowrule = [ - # # Rofi doesn't center properly when I have the two asymetric monitors, so we need hyprland to manage it. - # "match:class Rofi, center on" - # ]; + # # windowrule = [ + # # # Rofi doesn't center properly when I have the two asymetric monitors, so we need hyprland to manage it. + # # "match:class Rofi, center on" + # # ]; # }; } diff --git a/system/hosts/vega/configuration.nix b/system/hosts/vega/configuration.nix index db6649e..234b323 100644 --- a/system/hosts/vega/configuration.nix +++ b/system/hosts/vega/configuration.nix @@ -9,7 +9,8 @@ # Enable networking networking.networkmanager.enable = true; # Disable wpa-supplicant to avoid conflicts with network manager. - networking.wireless.enable = false; + # Appears this is not needed as of 26.05 + # networking.wireless.enable = true; # Set your time zone. time.timeZone = "America/Los_Angeles"; diff --git a/system/hosts/vega/drew.nix b/system/hosts/vega/drew.nix index c87d5f3..4f889d3 100644 --- a/system/hosts/vega/drew.nix +++ b/system/hosts/vega/drew.nix @@ -1,58 +1,62 @@ { pkgs, ... }: { - imports = - map (x: ../../../home-manager + x) [ - "/features/chat.nix" - "/features/development/development.nix" - "/features/development/docker.nix" - "/features/development/haskell.nix" - "/features/development/markdown.nix" - "/features/development/typescript.nix" - "/features/email.nix" - "/features/eww" - "/features/image-editing.nix" - "/features/linux-desktop.nix" - "/features/notes.nix" - ] - ++ [ - (import ../../../home-manager/features/hyprpaper.nix [ "HDMI-A-1" ]) - ]; - - home.packages = with pkgs; [ - slack - zoom-us - chromium + imports = map (x: ../../../home-manager + x) [ + "/features/chat.nix" + "/features/development/development.nix" + "/features/development/docker.nix" + "/features/development/haskell.nix" + "/features/development/markdown.nix" + "/features/development/typescript.nix" + "/features/email.nix" + "/features/eww" + "/features/image-editing.nix" + "/features/linux-desktop.nix" + "/features/notes.nix" + "/features/hyprpaper.nix" ]; - home.stateVersion = "24.11"; + home = { + stateVersion = "24.11"; - home.username = "drew"; - home.homeDirectory = "/home/drew"; + username = "drew"; + homeDirectory = "/home/drew"; + }; programs.git.settings.user = { name = "Drew Haven"; email = "periodic@blazestar.net"; }; + hardware.monitors = { + "HDMI-A-1" = { + position = "0x0"; + mode = "3440x1440@75.05t s"; + }; + }; + + programs.eww.widgets = [ + "vertical-statusbar" + ]; + # TODO: Merge into LUA configs - # wayland.windowManager.hyprland.settings = { - # # Set up eww here because it's based on the monitor configuration - # # Eww is idempotent, so it's fine to just run it on every reload to make sure things are open - # exec-once = [ - # "sleep 2 && eww open-many vertical-statusbar" - # ]; - # # Set up workspaces for this system - # # See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules - # workspace = [ - # "1, defaultName:1" - # "2, defaultName:2" - # "3, defaultName:3" - # "4, defaultName:4" - # "5, defaultName:5" - # "6, defaultName:6" - # "7, defaultName:7" - # "8, defaultName:8" - # "9, defaultName:9" - # ]; - # }; + wayland.windowManager.hyprland.settings = { + # Set up eww here because it's based on the monitor configuration + # Eww is idempotent, so it's fine to just run it on every reload to make sure things are open + # exec_once = [ + # "sleep 2 && eww open-many vertical-statusbar" + # ]; + # Set up workspaces for this system + # See https://wiki.hyprland.org/Configuring/Workspace-Rules/ for workspace rules + # workspace = [ + # "1, defaultName:1" + # "2, defaultName:2" + # "3, defaultName:3" + # "4, defaultName:4" + # "5, defaultName:5" + # "6, defaultName:6" + # "7, defaultName:7" + # "8, defaultName:8" + # "9, defaultName:9" + # ]; + }; } diff --git a/system/hosts/vega/hardware-configuration.nix b/system/hosts/vega/hardware-configuration.nix index 68a8e52..a038603 100644 --- a/system/hosts/vega/hardware-configuration.nix +++ b/system/hosts/vega/hardware-configuration.nix @@ -55,4 +55,5 @@ # Graphics settings # Using the default production drivers. graphics.enable = true; + }