diff --git a/modules/misc/news.nix b/modules/misc/news.nix index 4faa369d2..b0ce1549b 100644 --- a/modules/misc/news.nix +++ b/modules/misc/news.nix @@ -57,7 +57,13 @@ let isNixFile = n: v: v == "regular" && lib.hasSuffix ".nix" n; # builtins.attrNames return the values in alphabetical order newsFiles = builtins.attrNames (lib.filterAttrs isNixFile (builtins.readDir ./news)); - newsEntries = builtins.map (newsFile: import (./news + "/${newsFile}")) newsFiles; + newsEntries = builtins.map ( + newsFile: + let + imported = import (./news + "/${newsFile}"); + in + if builtins.isFunction imported then imported { inherit pkgs; } else imported + ) newsFiles; in { meta.maintainers = [ lib.maintainers.rycee ]; diff --git a/modules/misc/news/2025-04-10_10-10-18.nix b/modules/misc/news/2025-04-10_10-10-18.nix new file mode 100644 index 000000000..3f2e26d62 --- /dev/null +++ b/modules/misc/news/2025-04-10_10-10-18.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: + +{ + time = "2025-04-10T08:10:18+00:00"; + condition = pkgs.stdenv.hostPlatform.isLinux; + message = '' + A new module is available: 'services.way-displays'. + + A service to automatically configure your displays on wlroots-based + wayland compositors. + ''; +} diff --git a/modules/modules.nix b/modules/modules.nix index fa4fb7346..923cc2f46 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -435,6 +435,7 @@ let ./services/unison.nix ./services/vdirsyncer.nix ./services/volnoti.nix + ./services/way-displays.nix ./services/window-managers/awesome.nix ./services/window-managers/bspwm/default.nix ./services/window-managers/fluxbox.nix diff --git a/modules/services/way-displays.nix b/modules/services/way-displays.nix new file mode 100644 index 000000000..7c0074969 --- /dev/null +++ b/modules/services/way-displays.nix @@ -0,0 +1,112 @@ +{ + config, + lib, + pkgs, + ... +}: + +let + inherit (lib) + attrsets + lists + literalExpression + maintainers + mkEnableOption + mkIf + mkOption + types + ; + mergeSets = sets: lists.fold attrsets.recursiveUpdate { } sets; + cfg = config.services.way-displays; + yaml = pkgs.formats.yaml { }; +in +{ + meta.maintainers = [ maintainers.jolars ]; + + options.services.way-displays = { + enable = mkEnableOption "way-displays"; + + package = lib.mkPackageOption pkgs "way-displays" { }; + + settings = mkOption { + type = yaml.type; + default = { }; + example = literalExpression '' + { + ORDER = [ + "DP-2" + "Monitor Maker ABC123" + "!^my_regex_here[0-9]+" + "'!.*$'" + ]; + SCALING = false; + MODE = [ + { + NAME_DESC = "HDMI-A-1"; + WIDTH = 1920; + HEIGHT = 1080; + HZ = 60; + } + ]; + TRANSFORM = [ + { + NAME_DESC = "eDP-1" + TRANSFORM = "FLIPPED-90"; + } + ]; + }; + ''; + description = '' + The way-displays configuration written to + {file}`$XDG_CONFIG_HOME/way-displays/cfg.yml`. See + for a + description of available options. + ''; + }; + + systemdTarget = mkOption { + type = types.str; + default = config.wayland.systemd.target; + defaultText = literalExpression "config.wayland.systemd.target"; + description = '' + Systemd target to bind to. + ''; + }; + }; + + config = mkIf cfg.enable { + assertions = [ + (lib.hm.assertions.assertPlatform "services.way-displays" pkgs lib.platforms.linux) + ]; + + xdg.configFile."way-displays/cfg.yaml".source = + yaml.generate "way-displays-config.yaml" + (mergeSets [ + { + CALLBACK_CMD = lib.mkDefault "${pkgs.libnotify}/bin/notify-send \"way-displays \${CALLBACK_LEVEL}\" \"\${CALLBACK_MSG}\""; + } + cfg.settings + ]); + + systemd.user.services.way-displays = { + Unit = { + Description = "Display configuration service"; + Documentation = "man:way-displays(1)"; + ConditionEnvironment = "WAYLAND_DISPLAY"; + PartOf = cfg.systemdTarget; + Requires = cfg.systemdTarget; + After = cfg.systemdTarget; + }; + + Install = { + WantedBy = [ cfg.systemdTarget ]; + }; + + Service = { + Type = "simple"; + ExecStart = "${lib.getExe cfg.package}"; + Restart = "always"; + }; + }; + }; +} diff --git a/tests/default.nix b/tests/default.nix index 07f5a1340..da435570d 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -621,6 +621,7 @@ import nmtSrc { ./modules/services/twmn ./modules/services/udiskie ./modules/services/volnoti + ./modules/services/way-displays ./modules/services/window-managers/bspwm ./modules/services/window-managers/herbstluftwm ./modules/services/window-managers/hyprland diff --git a/tests/modules/services/way-displays/configuration.nix b/tests/modules/services/way-displays/configuration.nix new file mode 100644 index 000000000..7ee5751ab --- /dev/null +++ b/tests/modules/services/way-displays/configuration.nix @@ -0,0 +1,43 @@ +{ config, ... }: +{ + config = { + services.way-displays = { + enable = true; + package = config.lib.test.mkStubPackage { }; + settings = { + CALLBACK_CMD = "notify-send \"way-displays \${CALLBACK_LEVEL}\" \"\${CALLBACK_MSG}\""; + ORDER = [ + "eDP-1" + "DELL U2419HC" + "DELL U2415" + "HP E24 G5" + "HP E24 G5" + ]; + ALIGN = "MIDDLE"; + VRR_OFF = [ + "DELL U2419HC" + "DELL U2415" + ]; + TRANSFORM = [ + { + NAME_DESC = "DELL U2419HC"; + TRANSFORM = "90"; + } + { + NAME_DESC = "HP E24 G5"; + TRANSFORM = "90"; + } + ]; + }; + }; + + nmt.script = '' + serviceFile=home-files/.config/systemd/user/way-displays.service + assertFileExists $serviceFile + + assertFileExists home-files/.config/way-displays/cfg.yaml + assertFileContent home-files/.config/way-displays/cfg.yaml \ + ${./configuration.yaml} + ''; + }; +} diff --git a/tests/modules/services/way-displays/configuration.yaml b/tests/modules/services/way-displays/configuration.yaml new file mode 100644 index 000000000..e8c280740 --- /dev/null +++ b/tests/modules/services/way-displays/configuration.yaml @@ -0,0 +1,16 @@ +ALIGN: MIDDLE +CALLBACK_CMD: notify-send "way-displays ${CALLBACK_LEVEL}" "${CALLBACK_MSG}" +ORDER: +- eDP-1 +- DELL U2419HC +- DELL U2415 +- HP E24 G5 +- HP E24 G5 +TRANSFORM: +- NAME_DESC: DELL U2419HC + TRANSFORM: '90' +- NAME_DESC: HP E24 G5 + TRANSFORM: '90' +VRR_OFF: +- DELL U2419HC +- DELL U2415 diff --git a/tests/modules/services/way-displays/default.nix b/tests/modules/services/way-displays/default.nix new file mode 100644 index 000000000..88e53c4c0 --- /dev/null +++ b/tests/modules/services/way-displays/default.nix @@ -0,0 +1,3 @@ +{ + way-displays-configuration = ./configuration.nix; +}