parent
9d82f069da
commit
2442f99d40
@ -1,160 +0,0 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
cfg = config.gtk; |
||||
gtk2 = cfg.enable && cfg.gtk2; |
||||
|
||||
toGtk2File = key: value: |
||||
let |
||||
value' = |
||||
if isBool value then (if value then "true" else "false") |
||||
else if isString value then "\"${value}\"" |
||||
else toString value; |
||||
in |
||||
"${key} = ${value'}"; |
||||
toGtk3File = generators.toINI { |
||||
mkKeyValue = key: value: |
||||
let |
||||
value' = |
||||
if isBool value then (if value then "true" else "false") |
||||
else toString value; |
||||
in |
||||
"${key}=${value'}"; |
||||
}; |
||||
|
||||
settings = |
||||
optionalAttrs (cfg.font != null) |
||||
{ gtk-font-name = cfg.font.name; } |
||||
// |
||||
optionalAttrs (cfg.theme != null) |
||||
{ gtk-theme-name = cfg.theme.name; } |
||||
// |
||||
optionalAttrs (cfg.iconTheme != null) |
||||
{ gtk-icon-theme-name = cfg.iconTheme.name; } |
||||
// |
||||
optionalAttrs (cfg.cursorTheme != null) |
||||
{ gtk-cursor-theme-name = cfg.cursorTheme.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 { |
||||
internal = true; |
||||
type = types.nullOr types.package; |
||||
default = null; |
||||
}; |
||||
name = mkOption { |
||||
internal = true; |
||||
type = types.str; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
optionalPackage = opt: |
||||
optional (opt != null && opt.package != null) opt.package; |
||||
in |
||||
{ |
||||
options = { |
||||
gtk = { |
||||
enable = mkEnableOption "Gtk theming configuration"; |
||||
|
||||
gtk2 = mkOption { |
||||
type = types.bool; |
||||
default = true; |
||||
description = '' |
||||
Whether to enable theming for obsolete GTK2 engine. |
||||
''; |
||||
}; |
||||
|
||||
font = mkOption { |
||||
type = types.nullOr fontType; |
||||
default = null; |
||||
example = literalExample '' |
||||
{ |
||||
name = "Cantarell 11"; |
||||
package = pkgs.cantarell-fonts; |
||||
}; |
||||
''; |
||||
description = '' |
||||
The font to use in GTK+ applications. |
||||
''; |
||||
}; |
||||
|
||||
iconTheme = mkOption { |
||||
type = types.nullOr themeType; |
||||
default = null; |
||||
example = literalExample '' |
||||
{ |
||||
name = "Adwaita"; |
||||
package = pkgs.gnome3.adwaita-icon-theme; |
||||
}; |
||||
''; |
||||
description = "The icon theme to use."; |
||||
}; |
||||
|
||||
cursorTheme = mkOption { |
||||
type = types.nullOr themeType; |
||||
default = null; |
||||
example = literalExample '' |
||||
{ |
||||
name = "Adwaita"; |
||||
package = pkgs.gnome3.adwaita-icon-theme; |
||||
}; |
||||
''; |
||||
description = "The cursor theme to use."; |
||||
}; |
||||
|
||||
theme = mkOption { |
||||
type = types.nullOr themeType; |
||||
default = null; |
||||
example = literalExample '' |
||||
{ |
||||
name = "Adwaita"; |
||||
package = pkgs.gnome-themes-extra; |
||||
}; |
||||
''; |
||||
description = "The GTK+ theme to use."; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
config = mkMerge [ |
||||
|
||||
(mkIf gtk2 { |
||||
environment.etc."xdg/gtk-2.0/gtkrc".text = |
||||
concatStringsSep "\n" ( |
||||
mapAttrsToList toGtk2File settings |
||||
); |
||||
}) |
||||
|
||||
(mkIf cfg.enable { |
||||
environment.systemPackages = |
||||
optionalPackage cfg.font |
||||
++ optionalPackage cfg.theme |
||||
++ optionalPackage cfg.iconTheme |
||||
++ optionalPackage cfg.cursorTheme; |
||||
|
||||
environment.etc."xdg/gtk-3.0/settings.ini".text = |
||||
toGtk3File { Settings = settings; }; |
||||
|
||||
# TODO: support Wayland/XSettings |
||||
# once https://github.com/NixOS/nixpkgs/issues/54150 is fixed |
||||
}) |
||||
]; |
||||
|
||||
meta.maintainers = [ maintainers.gnidorah ]; |
||||
} |
@ -1,259 +0,0 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
|
||||
cfg = config.qt; |
||||
|
||||
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; }; |
||||
|
||||
qt = |
||||
optionalAttrs (cfg.font != null) |
||||
{ font = ''"${cfg.font.name}"''; } |
||||
// |
||||
{ style = "GTK+"; }; |
||||
|
||||
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 { |
||||
internal = true; |
||||
type = types.nullOr types.package; |
||||
default = null; |
||||
}; |
||||
name = mkOption { |
||||
internal = true; |
||||
type = types.str; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
optionalPackage = opt: |
||||
optional (opt != null && opt.package != null) opt.package; |
||||
|
||||
platforms = { |
||||
gtk2 = rec { |
||||
description = '' |
||||
<varlistentry> |
||||
<term><literal>gtk2</literal></term> |
||||
<listitem><para>Use GTK2 theme with |
||||
<link xlink:href="https://github.com/qt/qtstyleplugins">qtstyleplugins</link> |
||||
</para></listitem> |
||||
</varlistentry> |
||||
''; |
||||
styles = [ "cleanlooks" "gtk2" "cde" "motif" "plastique" ]; |
||||
|
||||
assertions = [ |
||||
{ |
||||
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 = "`qt.font` and `qt.iconTheme` are only supported by kde platform."; |
||||
} |
||||
]; |
||||
environment.variables.QT_QPA_PLATFORMTHEME = "gtk2"; |
||||
environment.variables.QT_STYLE_OVERRIDE = cfg.style.name; |
||||
environment.systemPackages = [ pkgs.libsForQt5.qtstyleplugins ]; |
||||
}; |
||||
qgnomeplatform = { |
||||
description = '' |
||||
<varlistentry> |
||||
<term><literal>qgnomeplatform</literal></term> |
||||
<listitem><para>Use GNOME theme with |
||||
<link xlink:href="https://github.com/FedoraQt/QGnomePlatform">qgnomeplatform</link> |
||||
</para></listitem> |
||||
</varlistentry> |
||||
''; |
||||
|
||||
assertions = [ |
||||
{ |
||||
assertion = cfg.font == null && cfg.iconTheme == null; |
||||
message = "`qt.font` and `qt.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 |
||||
environment.variables.QT_STYLE_OVERRIDE = cfg.style.name; |
||||
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 = "`qt.font` and `qt.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 |
||||
|
||||
{ |
||||
|
||||
imports = [ |
||||
(mkRenamedOptionModule [ "qt5" "style" ] [ "qt" "style" ]) |
||||
(mkRenamedOptionModule [ "qt5" "enable" ] [ "qt" "enable" ]) |
||||
(mkRenamedOptionModule [ "qt5" "platformTheme" ] [ "qt" "platformTheme" ]) |
||||
(mkRenamedOptionModule [ "qt5" "font" ] [ "qt" "font" ]) |
||||
(mkRenamedOptionModule [ "qt5" "iconTheme" ] [ "qt" "iconTheme" ]) |
||||
]; |
||||
|
||||
options = { |
||||
qt = { |
||||
|
||||
enable = mkEnableOption "Qt theming configuration"; |
||||
|
||||
qt4 = mkOption { |
||||
type = types.bool; |
||||
default = true; |
||||
description = '' |
||||
Whether to enable theming for obsolete Qt4 engine. |
||||
''; |
||||
}; |
||||
|
||||
platformTheme = mkOption { |
||||
type = types.enum (attrNames platforms); |
||||
example = head (attrNames platforms); |
||||
description = '' |
||||
Selects the platform theme to use for Qt applications.</para> |
||||
<para>The options are |
||||
<variablelist> |
||||
${concatStrings (mapAttrsToList (name: value: value.description) platforms)} |
||||
</variablelist> |
||||
''; |
||||
}; |
||||
|
||||
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; |
||||
example = literalExample '' |
||||
{ |
||||
name = "Breeze"; |
||||
package = pkgs.breeze-qt5; |
||||
}; |
||||
''; |
||||
description = "The Qt style to use."; |
||||
}; |
||||
|
||||
}; |
||||
}; |
||||
|
||||
config = mkIf cfg.enable { |
||||
|
||||
assertions = attrByPath [ cfg.platformTheme "assertions" ] [] platforms; |
||||
|
||||
environment.variables = attrByPath [ cfg.platformTheme "environment" "variables" ] {} platforms; |
||||
|
||||
environment.etc = attrByPath [ cfg.platformTheme "environment" "etc" ] {} platforms // { |
||||
"xdg/Trolltech.conf".text = |
||||
toQtIni { |
||||
Qt = qt; |
||||
}; |
||||
}; |
||||
|
||||
environment.systemPackages = attrByPath [ cfg.platformTheme "environment" "systemPackages" ] [] platforms |
||||
++ optionalPackage cfg.font |
||||
++ optionalPackage cfg.style |
||||
++ optionalPackage cfg.iconTheme; |
||||
|
||||
}; |
||||
|
||||
meta.maintainers = with maintainers; [ worldofpeace gnidorah ]; |
||||
} |
@ -0,0 +1,102 @@ |
||||
{ config, lib, pkgs, ... }: |
||||
|
||||
with lib; |
||||
|
||||
let |
||||
|
||||
cfg = config.qt5; |
||||
|
||||
isQGnome = cfg.platformTheme == "gnome" && cfg.style == "adwaita"; |
||||
isQtStyle = cfg.platformTheme == "gtk2" && cfg.style != "adwaita"; |
||||
|
||||
packages = if isQGnome then [ pkgs.qgnomeplatform pkgs.adwaita-qt ] |
||||
else if isQtStyle then [ pkgs.libsForQt5.qtstyleplugins ] |
||||
else throw "`qt5.platformTheme` ${cfg.platformTheme} and `qt5.style` ${cfg.style} are not compatible."; |
||||
|
||||
in |
||||
|
||||
{ |
||||
|
||||
options = { |
||||
qt5 = { |
||||
|
||||
enable = mkEnableOption "Qt5 theming configuration"; |
||||
|
||||
platformTheme = mkOption { |
||||
type = types.enum [ |
||||
"gtk2" |
||||
"gnome" |
||||
]; |
||||
example = "gnome"; |
||||
relatedPackages = [ |
||||
"qgnomeplatform" |
||||
["libsForQt5" "qtstyleplugins"] |
||||
]; |
||||
description = '' |
||||
Selects the platform theme to use for Qt5 applications.</para> |
||||
<para>The options are |
||||
<variablelist> |
||||
<varlistentry> |
||||
<term><literal>gtk</literal></term> |
||||
<listitem><para>Use GTK theme with |
||||
<link xlink:href="https://github.com/qt/qtstyleplugins">qtstyleplugins</link> |
||||
</para></listitem> |
||||
</varlistentry> |
||||
<varlistentry> |
||||
<term><literal>gnome</literal></term> |
||||
<listitem><para>Use GNOME theme with |
||||
<link xlink:href="https://github.com/FedoraQt/QGnomePlatform">qgnomeplatform</link> |
||||
</para></listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
''; |
||||
}; |
||||
|
||||
style = mkOption { |
||||
type = types.enum [ |
||||
"adwaita" |
||||
"cleanlooks" |
||||
"gtk2" |
||||
"motif" |
||||
"plastique" |
||||
]; |
||||
example = "adwaita"; |
||||
relatedPackages = [ |
||||
"adwaita-qt" |
||||
["libsForQt5" "qtstyleplugins"] |
||||
]; |
||||
description = '' |
||||
Selects the style to use for Qt5 applications.</para> |
||||
<para>The options are |
||||
<variablelist> |
||||
<varlistentry> |
||||
<term><literal>adwaita</literal></term> |
||||
<listitem><para>Use Adwaita Qt style with |
||||
<link xlink:href="https://github.com/FedoraQt/adwaita-qt">adwaita</link> |
||||
</para></listitem> |
||||
</varlistentry> |
||||
<varlistentry> |
||||
<term><literal>cleanlooks</literal></term> |
||||
<term><literal>gtk2</literal></term> |
||||
<term><literal>motif</literal></term> |
||||
<term><literal>plastique</literal></term> |
||||
<listitem><para>Use styles from |
||||
<link xlink:href="https://github.com/qt/qtstyleplugins">qtstyleplugins</link> |
||||
</para></listitem> |
||||
</varlistentry> |
||||
</variablelist> |
||||
''; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
config = mkIf cfg.enable { |
||||
|
||||
environment.variables.QT_QPA_PLATFORMTHEME = cfg.platformTheme; |
||||
|
||||
environment.variables.QT_STYLE_OVERRIDE = cfg.style; |
||||
|
||||
environment.systemPackages = packages; |
||||
|
||||
}; |
||||
} |
Loading…
Reference in new issue