From e01facc34045cf0026ba61d04e69c61e11f99408 Mon Sep 17 00:00:00 2001
From: polykernel <81340136+polykernel@users.noreply.github.com>
Date: Thu, 17 Mar 2022 15:30:48 -0400
Subject: [PATCH] gtk: add cursor theme configuration (#2481)
* gtk: add cursor theme configuration
- Added the `cursorTheme` under the gtk module.
- Added tests for the gtk3 settings file generation, and renamed
the gtk2 unit test expected file for clarity.
- Added guard against generating a blank `gtk.css` when `cfg.extraCss`
is empty.
- Replaced `concatMapStrings` calls with `concatStringsSep`. The library function
`concatMapStrings` generates an intemediate list which is then passed to
`concatStringsSep`, As we are not performing other transformation except
the addition of newlines, a direct call to `concatStringsSep` is sufficient.
- Updated description of examples to be more general "~/.config" -> "$XDG_CONFIG_HOME".
- Update helper functions `toGtk3Ini` and `formatGtk2Option` to use the library
function `boolToString` and escape the separator in the key name.
* xcursor: delegate GTK cursor settings to gtk.cursorTheme
- Added deprecation warning for GTK settings in the `xsession.cursorTheme` module.
- Modified config section to use `gtk.cursorTheme` for GTK cursor settings.
---
modules/misc/gtk.nix | 104 +++++++++++++++---
modules/xcursor.nix | 16 ++-
tests/modules/misc/gtk/default.nix | 1 +
...d.conf => gtk2-basic-config-expected.conf} | 0
tests/modules/misc/gtk/gtk2-basic-config.nix | 7 +-
.../misc/gtk/gtk3-basic-settings-expected.ini | 3 +
.../modules/misc/gtk/gtk3-basic-settings.nix | 24 ++++
7 files changed, 125 insertions(+), 30 deletions(-)
rename tests/modules/misc/gtk/{gtk-basic-config-expected.conf => gtk2-basic-config-expected.conf} (100%)
create mode 100644 tests/modules/misc/gtk/gtk3-basic-settings-expected.ini
create mode 100644 tests/modules/misc/gtk/gtk3-basic-settings.nix
diff --git a/modules/misc/gtk.nix b/modules/misc/gtk.nix
index 69ff34b28..0cc9146d8 100644
--- a/modules/misc/gtk.nix
+++ b/modules/misc/gtk.nix
@@ -11,23 +11,19 @@ let
toGtk3Ini = generators.toINI {
mkKeyValue = key: value:
- let
- value' = if isBool value then
- (if value then "true" else "false")
- else
- toString value;
- in "${key}=${value'}";
+ let value' = if isBool value then boolToString value else toString value;
+ in "${escape [ "=" ] key}=${value'}";
};
formatGtk2Option = n: v:
let
v' = if isBool v then
- (if v then "true" else "false")
+ boolToString value
else if isString v then
''"${v}"''
else
toString v;
- in "${n} = ${v'}";
+ in "${escape [ "=" ] n} = ${v'}";
themeType = types.submodule {
options = {
@@ -50,6 +46,57 @@ let
};
};
+ iconThemeType = types.submodule {
+ options = {
+ package = mkOption {
+ type = types.nullOr types.package;
+ default = null;
+ example = literalExpression "pkgs.adwaita-icon-theme";
+ description = ''
+ Package providing the icon theme. This package will be installed
+ to your profile. If null then the theme
+ is assumed to already be available in your profile.
+ '';
+ };
+
+ name = mkOption {
+ type = types.str;
+ example = "Adwaita";
+ description = "The name of the icon theme within the package.";
+ };
+ };
+ };
+
+ cursorThemeType = types.submodule {
+ options = {
+ package = mkOption {
+ type = types.nullOr types.package;
+ default = null;
+ example = literalExpression "pkgs.vanilla-dmz";
+ description = ''
+ Package providing the cursor theme. This package will be installed
+ to your profile. If null then the theme
+ is assumed to already be available in your profile.
+ '';
+ };
+
+ name = mkOption {
+ type = types.str;
+ example = "Vanilla-DMZ";
+ description = "The name of the cursor theme within the package.";
+ };
+
+ size = mkOption {
+ type = types.nullOr types.int;
+ default = null;
+ example = 16;
+ description = ''
+ The size of the cursor.
+ '';
+ };
+ };
+ };
+
in {
meta.maintainers = [ maintainers.rycee ];
@@ -71,8 +118,14 @@ in {
'';
};
+ cursorTheme = mkOption {
+ type = types.nullOr cursorThemeType;
+ default = null;
+ description = "The cursor theme to use.";
+ };
+
iconTheme = mkOption {
- type = types.nullOr themeType;
+ type = types.nullOr iconThemeType;
default = null;
description = "The icon theme to use.";
};
@@ -116,7 +169,7 @@ in {
};
extraConfig = mkOption {
- type = with types; attrsOf (either bool (either int str));
+ type = with types; attrsOf (oneOf [ bool int str ]);
default = { };
example = {
gtk-cursor-blink = false;
@@ -156,7 +209,7 @@ in {
};
config = mkIf cfg.enable (let
- ini = optionalAttrs (cfg.font != null) {
+ gtkIni = optionalAttrs (cfg.font != null) {
gtk-font-name = let
fontSize =
optionalString (cfg.font.size != null) " ${toString cfg.font.size}";
@@ -164,6 +217,11 @@ in {
} // optionalAttrs (cfg.theme != null) { gtk-theme-name = cfg.theme.name; }
// optionalAttrs (cfg.iconTheme != null) {
gtk-icon-theme-name = cfg.iconTheme.name;
+ } // optionalAttrs (cfg.cursorTheme != null) {
+ gtk-cursor-theme-name = cfg.cursorTheme.name;
+ } // optionalAttrs
+ (cfg.cursorTheme != null && cfg.cursorTheme.size != null) {
+ gtk-cursor-theme-size = cfg.cursorTheme.size;
};
dconfIni = optionalAttrs (cfg.font != null) {
@@ -174,31 +232,41 @@ in {
} // optionalAttrs (cfg.theme != null) { gtk-theme = cfg.theme.name; }
// optionalAttrs (cfg.iconTheme != null) {
icon-theme = cfg.iconTheme.name;
+ } // optionalAttrs (cfg.cursorTheme != null) {
+ cursor-theme = cfg.cursorTheme.name;
+ } // optionalAttrs
+ (cfg.cursorTheme != null && cfg.cursorTheme.size != null) {
+ cursor-size = cfg.cursorTheme.size;
};
optionalPackage = opt:
optional (opt != null && opt.package != null) opt.package;
in {
- home.packages = optionalPackage cfg.font ++ optionalPackage cfg.theme
- ++ optionalPackage cfg.iconTheme;
+ home.packages = concatMap optionalPackage [
+ cfg.font
+ cfg.theme
+ cfg.iconTheme
+ cfg.cursorTheme
+ ];
home.file.${cfg2.configLocation}.text =
- concatMapStrings (l: l + "\n") (mapAttrsToList formatGtk2Option ini)
+ concatStringsSep "\n" (mapAttrsToList formatGtk2Option gtkIni)
+ cfg2.extraConfig;
home.sessionVariables.GTK2_RC_FILES = cfg2.configLocation;
xdg.configFile."gtk-3.0/settings.ini".text =
- toGtk3Ini { Settings = ini // cfg3.extraConfig; };
+ toGtk3Ini { Settings = gtkIni // cfg3.extraConfig; };
- xdg.configFile."gtk-3.0/gtk.css".text = cfg3.extraCss;
+ xdg.configFile."gtk-3.0/gtk.css" =
+ mkIf (cfg3.extraCss != "") { text = cfg3.extraCss; };
xdg.configFile."gtk-3.0/bookmarks" = mkIf (cfg3.bookmarks != [ ]) {
- text = concatMapStrings (l: l + "\n") cfg3.bookmarks;
+ text = concatStringsSep "\n" cfg3.bookmarks;
};
xdg.configFile."gtk-4.0/settings.ini".text =
- toGtk3Ini { Settings = ini // cfg4.extraConfig; };
+ toGtk3Ini { Settings = gtkIni // cfg4.extraConfig; };
dconf.settings."org/gnome/desktop/interface" = dconfIni;
});
diff --git a/modules/xcursor.nix b/modules/xcursor.nix
index 3ec2a354d..e2c5f0c2c 100644
--- a/modules/xcursor.nix
+++ b/modules/xcursor.nix
@@ -60,6 +60,11 @@ in {
platforms.linux)
];
+ warnings = [''
+ GTK cursor settings will no longer be handled in the xsession.pointerCursor module in future.
+ Please use gtk.cursorTheme for GTK cursor settings instead.
+ ''];
+
home.packages = [ cfg.package ];
xsession.initExtra = ''
@@ -73,15 +78,8 @@ in {
"Xcursor.size" = cfg.size;
};
- gtk.gtk2.extraConfig = ''
- gtk-cursor-theme-name="${cfg.name}"
- gtk-cursor-theme-size=${toString cfg.size}
- '';
-
- gtk.gtk3.extraConfig = {
- "gtk-cursor-theme-name" = cfg.name;
- "gtk-cursor-theme-size" = cfg.size;
- };
+ # TODO: deprecate after next version release.
+ gtk.cursorTheme = { 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
diff --git a/tests/modules/misc/gtk/default.nix b/tests/modules/misc/gtk/default.nix
index 0dbae61eb..a812d4ad3 100644
--- a/tests/modules/misc/gtk/default.nix
+++ b/tests/modules/misc/gtk/default.nix
@@ -1,5 +1,6 @@
{
gtk2-basic-config = ./gtk2-basic-config.nix;
gtk2-config-file-location = ./gtk2-config-file-location.nix;
+ gtk3-basic-settings = ./gtk3-basic-settings.nix;
}
diff --git a/tests/modules/misc/gtk/gtk-basic-config-expected.conf b/tests/modules/misc/gtk/gtk2-basic-config-expected.conf
similarity index 100%
rename from tests/modules/misc/gtk/gtk-basic-config-expected.conf
rename to tests/modules/misc/gtk/gtk2-basic-config-expected.conf
diff --git a/tests/modules/misc/gtk/gtk2-basic-config.nix b/tests/modules/misc/gtk/gtk2-basic-config.nix
index a49cc44e7..228b5478d 100644
--- a/tests/modules/misc/gtk/gtk2-basic-config.nix
+++ b/tests/modules/misc/gtk/gtk2-basic-config.nix
@@ -13,9 +13,10 @@ with lib;
nmt.script = ''
assertFileExists home-files/.gtkrc-2.0
- assertFileContent home-files/.gtkrc-2.0 ${
- ./gtk-basic-config-expected.conf
- }
+
+ assertFileContent home-files/.gtkrc-2.0 \
+ ${./gtk2-basic-config-expected.conf}
+
assertFileRegex home-path/etc/profile.d/hm-session-vars.sh \
'GTK2_RC_FILES=.*/.gtkrc-2.0'
'';
diff --git a/tests/modules/misc/gtk/gtk3-basic-settings-expected.ini b/tests/modules/misc/gtk/gtk3-basic-settings-expected.ini
new file mode 100644
index 000000000..f1218b069
--- /dev/null
+++ b/tests/modules/misc/gtk/gtk3-basic-settings-expected.ini
@@ -0,0 +1,3 @@
+[Settings]
+gtk-cursor-blink=false
+gtk-recent-files-limit=20
diff --git a/tests/modules/misc/gtk/gtk3-basic-settings.nix b/tests/modules/misc/gtk/gtk3-basic-settings.nix
new file mode 100644
index 000000000..438357112
--- /dev/null
+++ b/tests/modules/misc/gtk/gtk3-basic-settings.nix
@@ -0,0 +1,24 @@
+{ config, lib, pkgs, ... }:
+
+with lib;
+
+{
+ config = {
+ gtk = {
+ enable = true;
+ gtk3.extraConfig = {
+ gtk-cursor-blink = false;
+ gtk-recent-files-limit = 20;
+ };
+ };
+
+ test.stubs.dconf = { };
+
+ nmt.script = ''
+ assertPathExists home-files/.config/gtk-3.0
+
+ assertFileContent home-files/.config/gtk-3.0/settings.ini \
+ ${./gtk3-basic-settings-expected.ini}
+ '';
+ };
+}