about summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorgnidorah <gnidorah@users.noreply.github.com>2019-10-13 08:38:32 +0300
committergnidorah <gnidorah@users.noreply.github.com>2020-02-21 18:57:56 +0300
commit379c3f685c925f57dc38805a602a96d2f35db130 (patch)
tree0de692e31899fbd5e0f5cc3f82e9d24df894d53e /nixos
parent23107a32c4c637dc1091cfb89ae2fce443ce21cd (diff)
downloadnixlib-379c3f685c925f57dc38805a602a96d2f35db130.tar
nixlib-379c3f685c925f57dc38805a602a96d2f35db130.tar.gz
nixlib-379c3f685c925f57dc38805a602a96d2f35db130.tar.bz2
nixlib-379c3f685c925f57dc38805a602a96d2f35db130.tar.lz
nixlib-379c3f685c925f57dc38805a602a96d2f35db130.tar.xz
nixlib-379c3f685c925f57dc38805a602a96d2f35db130.tar.zst
nixlib-379c3f685c925f57dc38805a602a96d2f35db130.zip
nixos/qt5: extend qt5 theming support
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/config/qt5.nix120
1 files changed, 119 insertions, 1 deletions
diff --git a/nixos/modules/config/qt5.nix b/nixos/modules/config/qt5.nix
index bc3be7068a0e..fb3e03c4b3fe 100644
--- a/nixos/modules/config/qt5.nix
+++ b/nixos/modules/config/qt5.nix
@@ -6,6 +6,43 @@ let
 
   cfg = config.qt5;
 
+  toQtIni = generators.toINI {
+    mkKeyValue = key: value:
+      let
+        value' =
+          if isBool value then (if value then "true" else "false")
+          else toString value;
+      in
+        "${key}=${value'}";
+  };
+
+  general =
+    optionalAttrs (cfg.font != null)
+      {
+        font = cfg.font.name;
+        menuFont = cfg.font.name;
+        toolBarFont = cfg.font.name;
+      }
+    //
+    optionalAttrs (cfg.style != null)
+      { widgetStyle = cfg.style.name; };
+  icons =
+    optionalAttrs (cfg.iconTheme != null)
+      { Theme = cfg.iconTheme.name; };
+
+  fontType = types.submodule {
+    options = {
+      package = mkOption {
+        internal = true;
+        type = types.nullOr types.package;
+        default = null;
+      };
+      name = mkOption {
+        internal = true;
+        type = types.str;
+      };
+    };
+  };
   themeType = types.submodule {
     options = {
       package = mkOption {
@@ -40,6 +77,10 @@ let
           assertion = cfg.style != null && any (name: name == cfg.style.name) styles;
           message = "`qt5.style.name` is not one of [ ${toString styles} ].";
         }
+        {
+          assertion = cfg.font == null && cfg.iconTheme == null;
+          message = "`qt5.font` and `qt5.iconTheme` are only supported by kde platform.";
+        }
       ];
       environment.variables.QT_QPA_PLATFORMTHEME = "gtk2";
       environment.variables.QT_STYLE_OVERRIDE = cfg.style.name;
@@ -55,6 +96,12 @@ let
         </varlistentry>
       '';
 
+      assertions = [
+        {
+          assertion = cfg.font == null && cfg.iconTheme == null;
+          message = "`qt5.font` and `qt5.iconTheme` are only supported by kde platform.";
+        }
+      ];
       environment.variables.QT_QPA_PLATFORMTHEME = "qgnomeplatform";
       # TODO: make this optional once https://github.com/NixOS/nixpkgs/issues/54150 is fixed
       # qgnomeplatform reads theme and other settings from dconf db
@@ -62,6 +109,47 @@ let
       environment.variables.XDG_DATA_DIRS = [ "${pkgs.gsettings-desktop-schemas}/share/gsettings-schemas/${pkgs.gsettings-desktop-schemas.name}" ];
       environment.systemPackages = [ pkgs.qgnomeplatform ];
     };
+    gtk3 = {
+      description = ''
+        <varlistentry>
+          <term><literal>gtk3</literal></term>
+          <listitem><para>Use GNOME theme with
+            <link xlink:href="https://code.qt.io/cgit/qt/qtbase.git/tree/src/plugins/platformthemes/gtk3">gtk3</link>
+          </para></listitem>
+        </varlistentry>
+      '';
+
+      assertions = [
+        {
+          assertion = cfg.style != null;
+          message = "`qt5.platformTheme` gtk3 requires `qt5.style` to be set.";
+        }
+        {
+          assertion = cfg.font == null && cfg.iconTheme == null;
+          message = "`qt5.font` and `qt5.iconTheme` are only supported by kde platform.";
+        }
+      ];
+      environment.variables.QT_QPA_PLATFORMTHEME = "gtk3";
+      environment.variables.QT_STYLE_OVERRIDE = cfg.style.name;
+    };
+    kde = {
+      description = ''
+        <varlistentry>
+          <term><literal>kde</literal></term>
+          <listitem><para>Use Qt theme with
+            <link xlink:href="https://code.qt.io/cgit/qt/qtbase.git/tree/src/platformsupport/themes/genericunix">qkdetheme</link>
+          </para></listitem>
+        </varlistentry>
+      '';
+
+      environment.variables.XDG_CURRENT_DESKTOP = mkForce "KDE";
+      environment.variables.KDE_SESSION_VERSION = "5";
+      environment.etc."xdg/kdeglobals".text =
+        toQtIni {
+          General = general;
+          Icons = icons;
+        };
+    };
   };
 in
 
@@ -84,6 +172,32 @@ in
         '';
       };
 
+      font = mkOption {
+        type = types.nullOr fontType;
+        default = null;
+        example = literalExample ''
+          {
+            name = "Noto Sans,10,-1,5,50,0,0,0,0,0,Regular";
+            package = pkgs.noto-fonts;
+          }
+        '';
+        description = ''
+          The font to use in Qt applications.
+        '';
+      };
+
+      iconTheme = mkOption {
+        type = types.nullOr themeType;
+        default = null;
+        example = literalExample ''
+          {
+            name = "breeze";
+            package = pkgs.breeze-icons;
+          }
+        '';
+        description = "The icon theme to use.";
+      };
+
       style = mkOption {
         type = types.nullOr themeType;
         default = null;
@@ -105,8 +219,12 @@ in
 
     environment.variables = attrByPath [ cfg.platformTheme "environment" "variables" ] {} platforms;
 
+    environment.etc = attrByPath [ cfg.platformTheme "environment" "etc" ] {} platforms;
+
     environment.systemPackages = attrByPath [ cfg.platformTheme "environment" "systemPackages" ] [] platforms
-      ++ optionalPackage cfg.style;
+      ++ optionalPackage cfg.font
+      ++ optionalPackage cfg.style
+      ++ optionalPackage cfg.iconTheme;
 
   };