[Nix-dev] Easier GTK theming

William Casarin jb55 at jb55.com
Sun Apr 23 16:09:43 CEST 2017


I've been talking to NixOS newcomers and a simple pain point that they
are running into is with GTK themes. This makes sense as I have run into
the same pain points:

To get GTK themes working, I have something like this in my
nixos-config:

  { config, lib, pkgs, ... }:
  let gtk2rc = pkgs.writeText "gtk2rc" ''
        gtk-icon-theme-name = "${icon-theme.name}"
        gtk-theme-name = "${theme.name}"
      '';
      theme = {
        package = pkgs.theme-vertex;
        name = "Vertex-Dark";
      };
      icon-theme = {
        package = pkgs.numix-icon-theme;
        name = "Numix";
      };
  in {

    # I have no idea what is actually needed here, this was just me trying
    # a bunch of different things
    environment.variables = {
      GDK_PIXBUF_MODULE_FILE = "${pkgs.librsvg.out}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache";
      GTK2_RC_FILES = "${gtk2rc}:${theme.package}/share/themes/${theme.name}/gtk-2.0/gtkrc:$GTK2_RC_FILES";
      GTK_DATA_PREFIX = "${theme.package}";
      GTK_EXEC_PREFIX = "${theme.package}";
      GTK_IM_MODULE = "xim";
      GTK_PATH = "${theme.package}:${pkgs.gtk3.out}";
      GTK_THEME = "${theme.name}";
      LC_TIME="en_DK.UTF-8";
      QT_STYLE_OVERRIDE = "GTK+";
    };

    environment.systemPackages = with pkgs; [
      gtk-engine-murrine
      theme.package
      icon-theme.package
    ];
  }

I feel like a lot of this could be automated. Perhaps something like:

  environment.gtk.theme = {
    package = pkgs.theme-vertex;
    name = "Vertex-Dark;
  }

  environment.gtk.iconTheme = {
    package = pkgs.numix-icon-theme;
    name = "Numix";
  }

A thing to keep in mind is that some themes require additional packages
or libraries, for example, for numix I have to add:

  GDK_PIXBUF_MODULE_FILE = "${pkgs.librsvg.out}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache";

to get svg icon rendering to work, and for some themes I need to add
gtk-engine-murrine to my system packages.

Perhaps there could be some way for themes to represent these
requirements? I'm no NixOS infrastructure expert so I'm not sure what
would be the best way to go about this.

Some pseudo-code:

  theme-vertex = mkGtkTheme {
    # ... package stuff ...

    # better way to do this ?
    pixbufModules = [ "${pkgs.librsvg.out}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache" ];
    requiredModules = [ gtk-engine-murrine ];
  }

and then environment machinery could set up all the required environment
variables from this.

Thoughts? Has there been progress down these lines before?

Cheers,

-- 
https://jb55.com


More information about the nix-dev mailing list