diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index c282d2ac..1f365b61 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -16,6 +16,8 @@ /modules/misc/gtk.nix @rycee +/modules/config/home-cursor.nix @polykernel @league + /modules/config/i18n.nix @midchildan /tests/modules/config/i18n @midchildan @@ -440,8 +442,6 @@ /modules/systemd.nix @rycee -/modules/xcursor.nix @league - /modules/xresources.nix @rycee /modules/xsession.nix @rycee diff --git a/modules/config/home-cursor.nix b/modules/config/home-cursor.nix new file mode 100644 index 00000000..53c99a3c --- /dev/null +++ b/modules/config/home-cursor.nix @@ -0,0 +1,157 @@ +{ config, options, lib, pkgs, ... }: + +with lib; + +let + + cfg = config.home.pointerCursor; + + pointerCursorModule = types.submodule { + options = { + package = mkOption { + type = types.package; + example = literalExpression "pkgs.vanilla-dmz"; + description = "Package providing the cursor theme."; + }; + + name = mkOption { + type = types.str; + example = "Vanilla-DMZ"; + description = "The cursor name within the package."; + }; + + size = mkOption { + type = types.int; + default = 32; + example = 64; + description = "The cursor size."; + }; + + x11 = { + enable = mkEnableOption '' + x11 config generation for + ''; + + defaultCursor = mkOption { + type = types.str; + default = "left_ptr"; + example = "X_cursor"; + description = "The default cursor file to use within the package."; + }; + }; + + gtk = { + enable = mkEnableOption '' + gtk config generation for + ''; + }; + }; + }; + + cursorPath = "${cfg.package}/share/icons/${escapeShellArg cfg.name}/cursors/${ + escapeShellArg cfg.defaultCursor + }"; + +in { + meta.maintainers = [ maintainers.polykernel maintainers.league ]; + + imports = [ + (mkAliasOptionModule [ "xsession" "pointerCursor" "package" ] [ + "home" + "pointerCursor" + "package" + ]) + (mkAliasOptionModule [ "xsession" "pointerCursor" "name" ] [ + "home" + "pointerCursor" + "name" + ]) + (mkAliasOptionModule [ "xsession" "pointerCursor" "size" ] [ + "home" + "pointerCursor" + "size" + ]) + (mkAliasOptionModule [ "xsession" "pointerCursor" "defaultCursor" ] [ + "home" + "pointerCursor" + "x11" + "defaultCursor" + ]) + + ({ ... }: { + warnings = optional (any (x: + getAttrFromPath + ([ "xsession" "pointerCursor" ] ++ [ x ] ++ [ "isDefined" ]) + options) [ "package" "name" "size" "defaultCursor" ]) '' + The option `xsession.pointerCursor` has been merged into `home.pointerCursor` and will be removed + in the future. Please change to set `home.pointerCursor` directly and enable `home.pointerCursor.x11.enable` + to generate x11 specific cursor configurations. You can refer to the documentation for more details. + ''; + }) + ]; + + options = { + home.pointerCursor = mkOption { + type = types.nullOr pointerCursorModule; + default = null; + description = '' + Cursor configuration. Set to null to disable. + + Top-level options declared under this submodule are backend indepedent + options. Options declared under namespaces such as x11 + are backend specific options. By default, only backend independent cursor + configurations are generated. If you need configurations for specific + backends, you can toggle them via the enable option. For example, + home.pointerCursor.x11.enable + will enable x11 cursor configurations. + ''; + }; + }; + + config = mkIf (cfg != null) (mkMerge [ + { + assertions = [ + (hm.assertions.assertPlatform "home.pointerCursor" pkgs platforms.linux) + ]; + + home.packages = [ cfg.package ]; + + # Set name in icons theme, for compatibility with AwesomeWM etc. See: + # https://github.com/nix-community/home-manager/issues/2081 + # https://wiki.archlinux.org/title/Cursor_themes#XDG_specification + home.file.".icons/default/index.theme".text = '' + [icon theme] + Name=Default + Comment=Default Cursor Theme + Inherits=${cfg.name} + ''; + + # Set directory to look for cursors in, needed for some applications + # that are unable to find cursors otherwise. See: + # https://github.com/nix-community/home-manager/issues/2812 + # https://wiki.archlinux.org/title/Cursor_themes#Environment_variable + home.sessionVariables = { + XCURSOR_PATH = mkDefault ("$XCURSOR_PATH\${XCURSOR_PATH:+:}" + + concatStringsSep ":" + [ "${config.home.profileDirectory}/share/icons" ]); + }; + } + + (mkIf cfg.x11.enable { + xsession.initExtra = '' + ${pkgs.xorg.xsetroot}/bin/xsetroot -xcf ${cursorPath} ${ + toString cfg.size + } + ''; + + xresources.properties = { + "Xcursor.theme" = cfg.name; + "Xcursor.size" = cfg.size; + }; + }) + + (mkIf cfg.gtk.enable { + gtk.cursorTheme = mkDefault { inherit (cfg) package name size; }; + }) + ]); +} diff --git a/modules/modules.nix b/modules/modules.nix index 51db04be..fdeaf941 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -15,6 +15,7 @@ let modules = [ ./accounts/email.nix + ./config/home-cursor.nix ./config/i18n.nix ./files.nix ./home-environment.nix @@ -272,7 +273,6 @@ let ./systemd.nix ./targets/darwin ./targets/generic-linux.nix - ./xcursor.nix ./xresources.nix ./xsession.nix ./misc/nix.nix diff --git a/modules/xcursor.nix b/modules/xcursor.nix deleted file mode 100644 index a91f79ee..00000000 --- a/modules/xcursor.nix +++ /dev/null @@ -1,90 +0,0 @@ -{ config, lib, pkgs, ... }: - -with lib; - -let - - cfg = config.xsession.pointerCursor; - - cursorType = types.submodule { - options = { - package = mkOption { - type = types.package; - example = literalExpression "pkgs.vanilla-dmz"; - description = "Package providing the cursor theme."; - }; - - name = mkOption { - type = types.str; - example = "Vanilla-DMZ"; - description = "The cursor name within the package."; - }; - - size = mkOption { - type = types.int; - default = 32; - example = 64; - description = "The cursor size."; - }; - - defaultCursor = mkOption { - type = types.str; - default = "left_ptr"; - example = "X_cursor"; - description = "The default cursor file to use within the package."; - }; - }; - }; - - cursorPath = "${cfg.package}/share/icons/${escapeShellArg cfg.name}/cursors/${ - escapeShellArg cfg.defaultCursor - }"; - -in { - meta.maintainers = [ maintainers.league ]; - - options = { - xsession.pointerCursor = mkOption { - type = types.nullOr cursorType; - default = null; - description = '' - The X cursor theme and settings. The package - xorg.xcursorthemes contains cursors named - whiteglass, redglass, and handhelds. The package - vanilla-dmz contains cursors named Vanilla-DMZ - and Vanilla-DMZ-AA. Note: handhelds does not seem to work at - custom sizes. - ''; - }; - }; - - config = mkIf (cfg != null) { - assertions = [ - (hm.assertions.assertPlatform "xsession.pointerCursor" pkgs - platforms.linux) - ]; - - home.packages = [ cfg.package ]; - - xsession.initExtra = '' - ${pkgs.xorg.xsetroot}/bin/xsetroot -xcf ${cursorPath} ${toString cfg.size} - ''; - - xresources.properties = { - "Xcursor.theme" = cfg.name; - "Xcursor.size" = cfg.size; - }; - - gtk.cursorTheme = mkDefault { inherit (cfg) package name size; }; - - # Set name in icons theme, for compatibility with AwesomeWM etc. See: - # https://github.com/nix-community/home-manager/issues/2081 - # https://wiki.archlinux.org/title/Cursor_themes#XDG_specification - home.file.".icons/default/index.theme".text = '' - [icon theme] - Name=Default - Comment=Default Cursor Theme - Inherits=${cfg.name} - ''; - }; -}