1
0
Fork 0
mirror of https://github.com/nix-community/home-manager.git synced 2025-12-02 15:11:03 +01:00
home-manager/modules/misc/gtk/gtk4.nix
Fugi ae9f38e889 gtk4: don't enable theme by default
This is not officially supported and causes issues in some cases.
Also adds a warning to the option.
2025-11-28 14:14:32 -06:00

155 lines
4.1 KiB
Nix
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{ config, lib, ... }:
let
inherit (lib)
literalExpression
mkEnableOption
mkIf
mkOption
types
;
cfg = config.gtk;
cfg4 = config.gtk.gtk4;
gtkLib = import ./lib.nix { inherit lib; };
toIni = lib.generators.toINI {
mkKeyValue =
key: value:
let
value' = if lib.isBool value then lib.boolToString value else toString value;
in
"${lib.escape [ "=" ] key}=${value'}";
};
in
{
options.gtk.gtk4 = {
enable = mkEnableOption "GTK 4 configuration" // {
default = true;
};
font = mkOption {
type = types.nullOr lib.hm.types.fontType;
default = cfg.font;
defaultText = literalExpression "config.gtk.font";
description = "Font for GTK 4 applications.";
};
theme = mkOption {
type = types.nullOr (
gtkLib.mkThemeType {
typeName = "theme";
packageExample = "pkgs.gnome.gnome-themes-extra";
}
);
default = if lib.versionOlder config.home.stateVersion "26.05" then cfg.theme else null;
defaultText = literalExpression ''if lib.versionOlder config.home.stateVersion "26.05" then cfg.theme else null'';
description = ''
Theme for GTK 4 applications.
Warning: This is not officially supported and applied using a workaround.
It may cause issues with some apps.
For context, see [Please dont theme our apps](https://stopthemingmy.app/)
and [Restyling apps at scale](https://blogs.gnome.org/tbernard/2018/10/15/restyling-apps-at-scale/).
'';
};
iconTheme = mkOption {
type = types.nullOr (
gtkLib.mkThemeType {
typeName = "icon theme";
packageExample = "pkgs.adwaita-icon-theme";
}
);
default = cfg.iconTheme;
defaultText = literalExpression "config.gtk.iconTheme";
description = "Icon theme for GTK 4 applications.";
};
cursorTheme = mkOption {
type = types.nullOr (
gtkLib.mkThemeType {
typeName = "cursor theme";
hasSize = true;
packageExample = "pkgs.vanilla-dmz";
nameExample = "Vanilla-DMZ";
}
);
default = cfg.cursorTheme;
defaultText = literalExpression "config.gtk.cursorTheme";
description = "Cursor theme for GTK 4 applications.";
};
colorScheme = mkOption {
type = types.nullOr (
types.enum [
"dark"
"light"
]
);
default = cfg.colorScheme;
defaultText = literalExpression "config.gtk.colorScheme";
description = "Color scheme for GTK 4 applications.";
};
extraConfig = mkOption {
type =
with types;
attrsOf (oneOf [
bool
int
str
]);
default = { };
example = {
gtk-cursor-blink = false;
gtk-recent-files-limit = 20;
};
description = "Extra settings for {file}`$XDG_CONFIG_HOME/gtk-4.0/settings.ini`.";
};
extraCss = mkOption {
type = types.lines;
default = "";
description = "Extra CSS for {file}`$XDG_CONFIG_HOME/gtk-4.0/gtk.css`.";
};
};
config = mkIf (cfg.enable && cfg4.enable) {
xdg.configFile = {
"gtk-4.0/settings.ini" = {
text = toIni {
Settings =
gtkLib.mkGtkSettings {
gtkVersion = 4;
inherit (cfg4)
font
theme
iconTheme
cursorTheme
colorScheme
;
}
// cfg4.extraConfig;
};
};
"gtk-4.0/gtk.css" =
mkIf (cfg4.extraCss != "" || (cfg4.theme != null && cfg4.theme.package != null))
{
text =
lib.optionalString (cfg4.theme != null && cfg4.theme.package != null) ''
/**
* GTK 4 reads the theme configured by gtk-theme-name, but ignores it.
* It does however respect user CSS, so import the theme from here.
**/
@import url("file://${cfg4.theme.package}/share/themes/${cfg4.theme.name}/gtk-4.0/gtk.css");
''
+ cfg4.extraCss;
};
};
};
}