diff --git a/modules/gtk/hm.nix b/modules/gtk/hm.nix index 6faa8082e..70e49f4f4 100644 --- a/modules/gtk/hm.nix +++ b/modules/gtk/hm.nix @@ -1,4 +1,4 @@ -{ pkgs, config, lib, ... }: +{ pkgs, config, lib, options, ... }: let cfg = config.stylix.targets.gtk; @@ -12,7 +12,6 @@ let cat ${baseCss} >>$out echo ${lib.escapeShellArg cfg.extraCss} >>$out ''; - in { options.stylix.targets.gtk = { enable = config.lib.stylix.mkEnableTarget @@ -29,25 +28,70 @@ in { window.background { border-radius: 0; } ''; }; + + flatpakSupport.enable = + config.lib.stylix.mkEnableTarget "support for theming Flatpak apps" true; }; - config = lib.mkIf cfg.enable { - # programs.dconf.enable = true; required in system config - gtk = { - enable = true; - font = { - inherit (config.stylix.fonts.sansSerif) package name; - size = config.stylix.fonts.sizes.applications; + config = lib.mkIf cfg.enable (lib.mkMerge [ + { + # programs.dconf.enable = true; required in system config + gtk = { + enable = true; + font = { + inherit (config.stylix.fonts.sansSerif) package name; + size = config.stylix.fonts.sizes.applications; + }; + theme = { + package = pkgs.adw-gtk3; + name = "adw-gtk3"; + }; }; - theme = { - package = pkgs.adw-gtk3; - name = "adw-gtk3"; + + xdg.configFile = { + "gtk-3.0/gtk.css".source = finalCss; + "gtk-4.0/gtk.css".source = finalCss; }; - }; + } - xdg.configFile = { - "gtk-3.0/gtk.css".source = finalCss; - "gtk-4.0/gtk.css".source = finalCss; - }; - }; + (lib.mkIf cfg.flatpakSupport.enable (lib.mkMerge [ + { + # Flatpak apps apparently don't consume the CSS config. This workaround appends it to the theme directly. + home.file.".themes/${config.gtk.theme.name}".source = pkgs.stdenvNoCC.mkDerivation { + name = "flattenedGtkTheme"; + src = "${config.gtk.theme.package}/share/themes/${config.gtk.theme.name}"; + + installPhase = '' + cp --recursive . $out + cat ${finalCss} | tee --append $out/gtk-{3,4}.0/gtk.css + ''; + }; + } + ( + let + filesystem = "${config.home.homeDirectory}/.themes/${config.gtk.theme.name}:ro"; + theme = config.gtk.theme.name; + in + if options ? services.flatpak.overrides + then { + # Let Flatpak apps read the theme and force them to use it. + # This requires nix-flatpak to be imported externally. + services.flatpak.overrides.global = { + Context.filesystems = [filesystem]; + Environment.GTK_THEME = theme; + }; + } + else { + # This is likely incompatible with other modules that write to this file. + xdg.dataFile."flatpak/overrides/global".text = '' + [Context] + filesystems=${filesystem} + + [Environment] + GTK_THEME=${theme} + ''; + } + ) + ])) + ]); }