{ config, lib, pkgs, ... }: with lib; let cfg = config.qt; # Maps known lowercase style names to style packages. Non-exhaustive. stylePackages = with pkgs; { bb10bright = libsForQt5.qtstyleplugins; bb10dark = libsForQt5.qtstyleplugins; cleanlooks = libsForQt5.qtstyleplugins; gtk2 = libsForQt5.qtstyleplugins; motif = libsForQt5.qtstyleplugins; cde = libsForQt5.qtstyleplugins; plastique = libsForQt5.qtstyleplugins; adwaita = adwaita-qt; adwaita-dark = adwaita-qt; adwaita-highcontrast = adwaita-qt; adwaita-highcontrastinverse = adwaita-qt; breeze = libsForQt5.breeze-qt5; kvantum = libsForQt5.qtstyleplugin-kvantum; }; in { meta.maintainers = [ maintainers.rycee ]; imports = [ (mkChangedOptionModule [ "qt" "useGtkTheme" ] [ "qt" "platformTheme" ] (config: if getAttrFromPath [ "qt" "useGtkTheme" ] config then "gtk" else null)) ]; options = { qt = { enable = mkEnableOption "Qt 4 and 5 configuration"; platformTheme = mkOption { type = types.nullOr (types.enum [ "gtk" "gnome" "qtct" "kde" ]); default = null; example = "gnome"; relatedPackages = [ "qgnomeplatform" [ "libsForQt5" "qtstyleplugins" ] [ "libsForQt5" "qt5ct" ] [ "qt6Packages" "qt6ct" ] [ "libsForQt5" "plasma-integration" ] [ "libsForQt5" "systemsettings" ] ]; description = '' Platform theme to use for Qt applications. The options are gtk Use GTK theme with qtstyleplugins gnome Use GNOME theme with qgnomeplatform qtct Use Qt style set using qt5ct and qt6ct applications kde Use Qt settings from Plasma ''; }; style = { name = mkOption { type = types.nullOr types.str; default = null; example = "adwaita-dark"; relatedPackages = [ "adwaita-qt" "breeze-qt5" [ "libsForQt5" "qtstyleplugins" ] [ "libsForQt5" "qtstyleplugin-kvantum" ] ]; description = '' Style to use for Qt5 applications. Case-insensitive. Some examples are adwaita adwaita-dark adwaita-highcontrast adwaita-highcontrastinverse Use the Adwaita style from adwaita breeze Use the Breeze style from breeze bb10bright bb10dark cde cleanlooks gtk2 motif plastique Use styles from qtstyleplugins kvantum Use styles from kvantum ''; }; package = mkOption { type = types.nullOr types.package; default = null; example = literalExpression "pkgs.adwaita-qt"; description = '' Theme package to be used in Qt5 applications. Auto-detected from if possible. ''; }; }; }; }; config = mkIf (cfg.enable && cfg.platformTheme != null) { assertions = [{ assertion = cfg.platformTheme == "gnome" -> cfg.style.name != null && cfg.style.package != null; message = '' `qt.platformTheme` "gnome" must have `qt.style` set to a theme that supports both Qt and Gtk, for example "adwaita", "adwaita-dark", or "breeze". ''; }]; qt.style.package = mkIf (cfg.style.name != null) (mkDefault (stylePackages.${toLower cfg.style.name} or null)); # Necessary because home.sessionVariables doesn't support mkIf home.sessionVariables = filterAttrs (n: v: v != null) { QT_QPA_PLATFORMTHEME = if cfg.platformTheme == "gtk" then "gtk2" else if cfg.platformTheme == "qtct" then "qt5ct" else cfg.platformTheme; QT_STYLE_OVERRIDE = cfg.style.name; }; home.packages = if cfg.platformTheme == "gnome" then [ pkgs.qgnomeplatform ] ++ lib.optionals (cfg.style.package != null) [ cfg.style.package ] else if cfg.platformTheme == "qtct" then [ pkgs.libsForQt5.qt5ct pkgs.qt6Packages.qt6ct ] else if cfg.platformTheme == "kde" then [ pkgs.libsForQt5.plasma-integration pkgs.libsForQt5.systemsettings ] else [ pkgs.libsForQt5.qtstyleplugins ]; xsession.importedVariables = [ "QT_QPA_PLATFORMTHEME" ] ++ lib.optionals (cfg.style.name != null) [ "QT_STYLE_OVERRIDE" ]; # Enable GTK+ style for Qt4 in either case. # It doesn’t support the platform theme packages. home.activation.useGtkThemeInQt4 = hm.dag.entryAfter [ "writeBoundary" ] '' $DRY_RUN_CMD ${pkgs.crudini}/bin/crudini $VERBOSE_ARG \ --set "${config.xdg.configHome}/Trolltech.conf" Qt style GTK+ ''; }; }