about summary refs log tree commit diff
path: root/nixos/modules/programs
diff options
context:
space:
mode:
authorMaëlys Bras de fer <mae.bdf@outlook.com>2024-05-22 20:01:05 +0200
committerMaëlys Bras de fer <mae.bdf@outlook.com>2024-05-22 20:01:05 +0200
commit95674de399b4c880f16059f8e2ce84e7388842d8 (patch)
tree36a6d762b405ffe35ced9cd18836cb391b688142 /nixos/modules/programs
parentbcbeccfa7d3fff2203ddfd4a2e4b8ba0f1f38584 (diff)
nixos/{river,hyprland}: override package using apply
Diffstat (limited to 'nixos/modules/programs')
-rw-r--r--nixos/modules/programs/wayland/hyprland.nix50
-rw-r--r--nixos/modules/programs/wayland/lib.nix12
-rw-r--r--nixos/modules/programs/wayland/river.nix13
-rw-r--r--nixos/modules/programs/wayland/sway.nix28
4 files changed, 53 insertions, 50 deletions
diff --git a/nixos/modules/programs/wayland/hyprland.nix b/nixos/modules/programs/wayland/hyprland.nix
index 7176cfbbc2d2f..f5ca741f94328 100644
--- a/nixos/modules/programs/wayland/hyprland.nix
+++ b/nixos/modules/programs/wayland/hyprland.nix
@@ -2,6 +2,8 @@
 
 let
   cfg = config.programs.hyprland;
+
+  wayland-lib = import ./lib.nix { inherit lib; };
 in
 {
   options.programs.hyprland = {
@@ -11,36 +13,26 @@ in
       A configuration file will be generated in {file}`~/.config/hypr/hyprland.conf`.
       See <https://wiki.hyprland.org> for more information'';
 
-    package = lib.mkPackageOption pkgs "hyprland" { };
-
-    finalPackage = lib.mkOption {
-      type = lib.types.package;
-      readOnly = true;
-      default = cfg.package.override {
+    package = lib.mkPackageOption pkgs "hyprland" {
+      extraDescription = ''
+        If the package is not overridable with `enableXWayland`, then the module option
+        {option}`xwayland` will have no effect.
+      '';
+    } // {
+      apply = p: wayland-lib.genFinalPackage p {
         enableXWayland = cfg.xwayland.enable;
       };
-      defaultText = lib.literalMD ''
-        `programs.hyprland.package` with applied configuration
-      '';
-      description = ''
-        The Hyprland package after applying configuration.
-      '';
     };
 
-    portalPackage = lib.mkPackageOption pkgs "xdg-desktop-portal-hyprland" { };
-
-    finalPortalPackage = lib.mkOption {
-      type = lib.types.package;
-      readOnly = true;
-      default = cfg.portalPackage.override {
-        hyprland = cfg.finalPackage;
-      };
-      defaultText = lib.literalMD ''
-        `programs.hyprland.portalPackage` with applied configuration
-      '';
-      description = ''
-        The Hyprland Portal package after applying configuration.
+    portalPackage = lib.mkPackageOption pkgs "xdg-desktop-portal-hyprland" {
+      extraDescription = ''
+        If the package is not overridable with `hyprland`, then the Hyprland package
+        used by the portal may differ from the one set in the module option {option}`package`.
       '';
+    } // {
+      apply = p: wayland-lib.genFinalPackage p {
+        hyprland = cfg.package;
+      };
     };
 
     xwayland.enable = lib.mkEnableOption "XWayland" // { default = true; };
@@ -58,14 +50,14 @@ in
 
   config = lib.mkIf cfg.enable (lib.mkMerge [
     {
-      environment.systemPackages = [ cfg.finalPackage ];
+      environment.systemPackages = [ cfg.package ];
 
       # To make a Hyprland session available if a display manager like SDDM is enabled:
-      services.displayManager.sessionPackages = [ cfg.finalPackage ];
+      services.displayManager.sessionPackages = [ cfg.package ];
 
       xdg.portal = {
-        extraPortals = [ cfg.finalPortalPackage ];
-        configPackages = lib.mkDefault [ cfg.finalPackage ];
+        extraPortals = [ cfg.portalPackage ];
+        configPackages = lib.mkDefault [ cfg.package ];
       };
 
       systemd = lib.mkIf cfg.systemd.setPath.enable {
diff --git a/nixos/modules/programs/wayland/lib.nix b/nixos/modules/programs/wayland/lib.nix
new file mode 100644
index 0000000000000..0f275d3f18c56
--- /dev/null
+++ b/nixos/modules/programs/wayland/lib.nix
@@ -0,0 +1,12 @@
+{ lib }:
+
+{
+  genFinalPackage = pkg: args:
+    let
+      expectedArgs = with lib;
+        lib.naturalSort (lib.attrNames args);
+      existingArgs = with lib;
+        naturalSort (intersectLists expectedArgs (attrNames (functionArgs pkg.override)));
+    in
+      if existingArgs != expectedArgs then pkg else pkg.override args;
+}
diff --git a/nixos/modules/programs/wayland/river.nix b/nixos/modules/programs/wayland/river.nix
index ef8fbbd3489b6..0980bd28cf828 100644
--- a/nixos/modules/programs/wayland/river.nix
+++ b/nixos/modules/programs/wayland/river.nix
@@ -2,6 +2,8 @@
 
 let
   cfg = config.programs.river;
+
+  wayland-lib = import ./lib.nix { inherit lib; };
 in
 {
   options.programs.river = {
@@ -9,13 +11,18 @@ in
 
     package = lib.mkPackageOption pkgs "river" {
       nullable = true;
-      default = pkgs.river.override {
-        xwaylandSupport = cfg.xwayland.enable;
-      };
       extraDescription = ''
+        If the package is not overridable with `xwaylandSupport`, then the module option
+        {option}`xwayland` will have no effect.
+
         Set to `null` to not add any River package to your path.
         This should be done if you want to use the Home Manager River module to install River.
       '';
+    } // {
+      apply = p: if p == null then null else
+        wayland-lib.genFinalPackage p {
+          xwaylandSupport = cfg.xwayland.enable;
+        };
     };
 
     xwayland.enable = lib.mkEnableOption "XWayland" // { default = true; };
diff --git a/nixos/modules/programs/wayland/sway.nix b/nixos/modules/programs/wayland/sway.nix
index 20c4ea648479a..31821a84a5bd7 100644
--- a/nixos/modules/programs/wayland/sway.nix
+++ b/nixos/modules/programs/wayland/sway.nix
@@ -3,23 +3,7 @@
 let
   cfg = config.programs.sway;
 
-  genFinalPackage = pkg:
-    let
-      args = {
-        extraSessionCommands = cfg.extraSessionCommands;
-        extraOptions = cfg.extraOptions;
-        withBaseWrapper = cfg.wrapperFeatures.base;
-        withGtkWrapper = cfg.wrapperFeatures.gtk;
-        enableXWayland = cfg.xwayland.enable;
-        isNixOS = true;
-      };
-
-      expectedArgs = with lib;
-        lib.naturalSort (lib.attrNames args);
-      existingArgs = with lib;
-        naturalSort (intersectLists expectedArgs (attrNames (functionArgs pkg.override)));
-    in
-      if existingArgs != expectedArgs then pkg else pkg.override args;
+  wayland-lib = import ./lib.nix { inherit lib; };
 in
 {
   options.programs.sway = {
@@ -42,7 +26,15 @@ in
         This should be done if you want to use the Home Manager Sway module to install Sway.
       '';
     } // {
-      apply = p: if p == null then null else genFinalPackage p;
+      apply = p: if p == null then null else
+        wayland-lib.genFinalPackage p {
+          extraSessionCommands = cfg.extraSessionCommands;
+          extraOptions = cfg.extraOptions;
+          withBaseWrapper = cfg.wrapperFeatures.base;
+          withGtkWrapper = cfg.wrapperFeatures.gtk;
+          enableXWayland = cfg.xwayland.enable;
+          isNixOS = true;
+        };
     };
 
     wrapperFeatures = {