hosts/modules/gui/gtk: hoist to sane.programs.sane-theme

This commit is contained in:
Colin 2024-05-28 16:17:42 +00:00
parent 95dc395925
commit 3c2ca46ef9
4 changed files with 333 additions and 364 deletions

View File

@ -1,7 +1,313 @@
{ config, lib, pkgs, ... }:
let
cfg = config.sane.programs.sane-theme.config;
unsortedThemes = {
# crude assortment of themes in nixpkgs; some might not be gtk themes, some gtk themes might not be in this list
inherit (pkgs)
# themes are in <repo:nixos/nixpkgs:pkgs/data/themes>
adapta-gtk-theme
adapta-kde-theme
adementary-theme
adi1090x-plymouth-themes
adw-gtk3
adwaita-qt
adwaita-qt6
albatross
amarena-theme
amber-theme
ant-bloody-theme
ant-nebula-theme
ant-theme
arc-kde-theme
arc-theme
artim-dark
ayu-theme-gtk
base16-schemes
blackbird
breath-theme
canta-theme
catppuccin-gtk
catppuccin-kde
catppuccin-kvantum
catppuccin-plymouth
clearlooks-phenix
colloid-gtk-theme
colloid-kde
dracula-theme
e17gtk
equilux-theme
flat-remix-gnome
flat-remix-gtk
fluent-gtk-theme
graphite-gtk-theme
graphite-kde-theme
greybird
gruvbox-dark-gtk
gruvbox-gtk-theme
gruvterial-theme
juno-theme
kde-gruvbox
kde-rounded-corners
layan-gtk-theme
layan-kde
lightly-boehs
lightly-qt
lounge-gtk-theme
marwaita
marwaita-manjaro
marwaita-peppermint
marwaita-pop_os
marwaita-ubuntu
matcha-gtk-theme
materia-kde-theme
materia-theme
material-kwin-decoration
mojave-gtk-theme
nixos-bgrt-plymouth
nordic
numix-gtk-theme
numix-solarized-gtk-theme
numix-sx-gtk-theme
oceanic-theme
omni-gtk-theme
onestepback
openzone-cursors
orchis-theme
orion
palenight-theme
paper-gtk-theme
pitch-black
plano-theme
plasma-overdose-kde-theme
plata-theme
pop-gtk-theme
qogir-kde
qogir-theme
rose-pine-gtk-theme
shades-of-gray-theme
sierra-breeze-enhanced
sierra-gtk-theme
skeu
snowblind
solarc-gtk-theme
spacx-gtk-theme
stilo-themes
sweet
sweet-nova
theme-jade1
theme-obsidian2
theme-vertex
tokyo-night-gtk
ubuntu-themes
venta
vimix-gtk-themes
whitesur-gtk-theme
yaru-remix-theme
yaru-theme
zuki-themes
;
inherit (pkgs.gnome)
adwaita-icon-theme
gnome-themes-extra
;
};
themes = with pkgs; {
color-scheme = {
default = emptyDirectory;
Dracula = dracula-theme;
DraculaPurple = dracula-theme;
Dracula-cursors = dracula-theme;
};
cursor-theme = {
Adwaita = gnome.adwaita-icon-theme;
};
gtk-theme = {
Adwaita = gnome.gnome-themes-extra; # gtk-3.0
Adwaita-dark = gnome.gnome-themes-extra; # gtk-3.0
Arc = arc-theme; # gtk-4.0
Arc-Dark = arc-theme; # gtk-4.0
Arc-Darker = arc-theme; # gtk-4.0
Arc-Lighter = arc-theme; # gtk-4.0
Dracula = dracula-theme; # gtk-4.0
E17gtk = e17gtk; # gtk-3.0
Fluent = fluent-gtk-theme; # gtk-4.0
Fluent-compact = fluent-gtk-theme; # gtk-4.0
Fluent-Dark = fluent-gtk-theme; # gtk-4.0
Fluent-Dark-compact = fluent-gtk-theme; # gtk-4.0
Fluent-Light = fluent-gtk-theme; # gtk-4.0
Fluent-Light-compact = fluent-gtk-theme; # gtk-4.0, NICE!
HighContrast = gnome.gnome-themes-extra; # gtk-3.0
Matcha-light-azul = matcha-gtk-theme; # gtk-4.0, NICE!
Matcha-light-sea = matcha-gtk-theme; # gtk-4.0, NICE!
# additional Matcha-* omitted
Nordic = nordic; # gtk-4.0
Nordic-bluish-accent = nordic; # gtk-4.0
Nordic-darker = nordic; # gtk-4.0
Nordic-Polar = nordic; # gtk-4.0, NICE
Numix = numix-gtk-theme; # gtk-3.20, meh
NumixSolarizedDarkBlue = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkCyan = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkGreen = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkMagenta = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkOrange = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkRed = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkViolet = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkYellow = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightBlue = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightBlueDarkTop = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightCyan = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightGreen = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightMagenta = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightOrange = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightRed = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightViolet = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightYellow = numix-solarized-gtk-theme; # gtk-3.20
NumixStandard = numix-solarized-gtk-theme; # gtk-3.20
Paper = paper-gtk-theme; # gtk-4.0
Pop = pop-gtk-theme; # gtk-4.0
Pop-dark = pop-gtk-theme; # gtk-4.0
Tokyonight-Light-B = tokyo-night-gtk; # gtk-4.0, NICE
# other Tokyonight-* omitted
};
icon-theme = {
# find icon themes via `nix-locate share/icons/Adwaita`
# then determine the name here by building and `ls result/share/icons`
# this misses quite a few icon themes that aren't Adwaita-based.
# for those, try `nix-locate share/icons`?
#
# note that adwaita apps expect exactly the icon set provided by adwaita-icon-theme:
# - most icon themes are supplementary to adwaita, rather than a full replacement.
# - i.e. most themes, unless adwaita is also installed, will cause some missing icons inside apps.
# - that's probably why so many themes here also symlink Adwaita
# my accounting of "adwaita coverage" seems to be overoptimistic somehow
# maybe some apps bundle adwaita themselves
Adwaita = gnome.adwaita-icon-theme;
Arc = arc-icon-theme; # 4.5/5, meh icon for "vertical ellipsis". 3/5 adwaita coverage
elementary-xfce = elementary-xfce-icon-theme; # does not cross compile (2023/10/03)
elementary-xfce-dark = elementary-xfce-icon-theme;
elementary-xfce-darker = elementary-xfce-icon-theme;
elementary-xfce-darkest = elementary-xfce-icon-theme;
HighContrast = gnome.gnome-themes-extra; # 5/5. 5/5 adwaita coverage (4/5 cross)
Humanity = humanity-icon-theme; # 5/5. 5/5 adwaita coverage (3.5/5 cross, unique in which icons work)
Humanity-Dark = humanity-icon-theme;
kora = kora-icon-theme;
kora-light = kora-icon-theme;
kora-light-panel = kora-icon-theme;
kora-pgrey = kora-icon-theme;
Numix = numix-icon-theme; # 4/5, meh icon for "back".
Numix-Light = numix-icon-theme;
Paper = paper-icon-theme; # 4/5, weird icon for "info". 5/5 adwaita coverage (3.5 cross, highly unique in which icons work)
Paper-Mono-Dark = paper-icon-theme;
Pop = pop-icon-theme; # 5/5. 2/5 adwaita coverage
Tela-circle = tela-circle-icon-theme;
Tela-circle-dark = tela-circle-icon-theme;
Tela-circle-light = tela-circle-icon-theme;
# themes which don't symlink Adwaita
BeautyLine = beauty-line-icon-theme; # 3.5/5. 4/5 adwaita coverage
breeze = breeze-icons;
breeze-dark = breeze-icons;
Mint-X = cinnamon.mint-x-icons;
# 10-ish other Mint-X variants omitted
# cinnamon.mint-l-icons;
# cinnamon.mint-y-icons;
Colloid = colloid-icon-theme; # 4.5/5, thin. 5/5 adwaita coverage (3/5 cross)
Colloid-dark = colloid-icon-theme;
Colloid-light = colloid-icon-theme;
bloom = deepin.deepin-icon-theme;
# 4 other deepin editions omitted
Dracula = dracula-icon-theme; # 4.5/5, a little thin. 4.5/5 adwaita coverage
Faba = faba-icon-theme; # 4/5. 4/5 adwaita coverage
Faba-Mono = faba-mono-icons;
Faba-Mono-Dark = faba-mono-icons;
Flat-Remix-Grey-Light = flat-remix-icon-theme; # 5/5. 5/5 adwaita coverage. builds on breeze, elementary
# 20-ish other flat-remix editions omitted
Fluent = fluent-icon-theme; # 5/5, though thin. 5/5 adwaita coverage (3/5 cross)
Fluent-dark = fluent-icon-theme;
gnome = gnome-icon-theme; # 3/5, icons are colored. 3/5 adwaita coverage
hicolor = hicolor-icon-theme; # 2/5 adwaita coverage; using this forces application builtin icons
la-capitaine-icon-theme = la-capitaine-icon-theme; # 4.5/5. 4.5/5 adwaita coverage. builds upon elementary
Luna = luna-icons;
# 5 other Luna variants omitted
maia = maia-icon-theme; # 3/5, icons are colored. 2/5 adwaita coverage
maia-dark = maia-icon-theme;
# mate.mate-icon-theme-faenza
mate = mate.mate-icon-theme; # 4.5/5. 4/5 adwaita coverage
menta = mate.mate-icon-theme;
Moka = moka-icon-theme; # 3/5, icons are colored. 3/5 adwaita coverage
# nixos-icons;
Nordzy = nordzy-icon-theme; # 5/5, thin. 5/5 adwaita coverage (3/5 cross)
# 10-ish Nordzy editions omitted
# numix-icon-theme-circle
# numix-icon-theme-square
oomox-gruvbox-dark = gruvbox-dark-icons-gtk;
Oranchelo = oranchelo-icon-theme;
# 3 other oranchelo editions omitted
elementary = pantheon.elementary-icon-theme; # 4.5/5. 4.5/5 adwaita coverage
Papirus = papirus-icon-theme; # 5/5. 5/5 adwaita coverage
# 4 other Papirus editions omitted
# papirus-maia-icon-theme
Qogir = qogir-icon-theme; # 5/5, thin. 5/5 adwaita coverage (2.5/5 cross)
# 5 other Qogir variants omitted
rose-pine = rose-pine-icon-theme;
rose-pine-dawn = rose-pine-icon-theme; # 5/5. 5/5 adwaita coverage (2.5 cross). looks a lot like Flat Remix...
rose-pine-moon = rose-pine-icon-theme;
SuperTinyIcons = super-tiny-icons; # 4/5. 2/5 adwaita coverage
Tango = tango-icon-theme; # 2/5. 3/5 adwaita coverage -- mostly just forwards to gnome-icon-theme
Tela = tela-icon-theme; # 5/5. 5/5 adwaita coverage
# 30-ish other Tela editions omitted
Vimix = vimix-icon-theme;
# 15-ish other Vimix editions omitted
WhiteSur = whitesur-icon-theme; # 4.5/5, thin & like iOS. 5/5 adwaita coverage (3.5/5 cross)
WhiteSur-dark = whitesur-icon-theme;
Rodent = xfce.xfce4-icon-theme;
Zafiro-icons-Dark = zafiro-icons;
Zafiro-icons-Light = zafiro-icons; # 5/5. 5/5 adwaita coverage
};
};
in
{
sane.programs.sane-theme = {
packageUnwrapped = null;
configOption = with lib; mkOption {
default = {};
type = types.submodule {
options = {
all = mkOption {
default = false;
type = types.bool;
description = "install all known gtk themes (for testing)";
};
color-scheme = mkOption {
default = "default";
type = types.str;
};
cursor-theme = mkOption {
default = "Adwaita";
type = types.str;
};
gtk-theme = mkOption {
default = "Adwaita";
type = types.str;
};
icon-theme = mkOption {
default = "Adwaita";
type = types.str;
};
};
};
};
packageUnwrapped = pkgs.symlinkJoin {
name = "sane-theme";
paths = [
themes.color-scheme."${cfg.color-scheme}"
themes.cursor-theme."${cfg.cursor-theme}"
themes.gtk-theme."${cfg.gtk-theme}"
themes.icon-theme."${cfg.icon-theme}"
] ++ lib.optionals cfg.all (lib.attrValues unsortedThemes);
};
suggestedPrograms = [
"sane-backgrounds"
];
@ -11,7 +317,33 @@
sandbox.enable = false; #< no binaries
};
environment.pathsToLink = lib.mkIf config.sane.programs.sane-backgrounds.enabled [
"/share/backgrounds"
];
sane.programs.dconf.config.site = lib.mkIf config.sane.programs.sane-theme.enabled [
(pkgs.writeTextFile {
name = "sane-theme";
destination = "/etc/dconf/db/site.d/10_gtk_settings";
text = ''
[org/gnome/desktop/interface]
color-scheme="${cfg.color-scheme}"
cursor-theme="${cfg.cursor-theme}"
gtk-theme="${cfg.gtk-theme}"
icon-theme="${cfg.icon-theme}"
'';
})
];
# XXX(2024/02/05): set GSK_RENDERER=cairo to solve graphical edge-case on moby where some JPEGs would render as black!
# - repro by loading komikku and viewing images. some fail (particularly mangadex onimai), some work.
# - run `GSK_RENDERER=help loupe` to see options.
# - TODO: see if i can enable the `vulkan` GSK_RENDERER?
# - for more on GSK_RENDERER: <https://blog.gtk.org/2024/01/28/new-renderers-for-gtk/>
# XXX(2024/02/21): GSK_RENDERER=cairo breaks `delfin` (as does GSK_RENDERER=vulkan, when gtk4 is compiled with `vulkanSupport = true`)
# - perhaps it's best to let this be defaulted and set it ONLY where needed
# - upstream gtk recommends using mesa 24.0 (latest) specifically in response to the GSK renderers triggering new driver bugs,
# so maybe i can update that before re-enabling GSK_RENDERER anywhere else.
# environment.variables.GSK_RENDERER = "cairo";
}

View File

@ -238,24 +238,6 @@ in
services.graphical-session.partOf = [ "default" ];
};
sane.gui.gtk = lib.mkIf cfg.enabled {
enable = lib.mkDefault true;
# gtk-theme = lib.mkDefault "Fluent-Light-compact";
gtk-theme = lib.mkDefault "Tokyonight-Light-B";
# icon-theme = lib.mkDefault "HighContrast"; # 4/5 coverage on moby
# icon-theme = lib.mkDefault "WhiteSur"; # 3.5/5 coverage on moby, but it provides a bunch for Fractal/Dino
# icon-theme = lib.mkDefault "Humanity"; # 3.5/5 coverage on moby, but it provides the bookmark icon
# icon-theme = lib.mkDefault "Paper"; # 3.5/5 coverage on moby, but it provides the bookmark icon
# icon-theme = lib.mkDefault "Nordzy"; # 3/5 coverage on moby
# icon-theme = lib.mkDefault "Fluent"; # 3/5 coverage on moby
# icon-theme = lib.mkDefault "Colloid"; # 3/5 coverage on moby
# icon-theme = lib.mkDefault "Qogir"; # 2.5/5 coverage on moby
# icon-theme = lib.mkDefault "rose-pine-dawn"; # 2.5/5 coverage on moby
# icon-theme = lib.mkDefault "Flat-Remix-Grey-Light"; # requires qtbase
};
# TODO: this can go elsewhere
hardware.bluetooth.enable = lib.mkIf cfg.enabled true;
services.blueman.enable = lib.mkIf cfg.enabled true;

View File

@ -6,10 +6,6 @@ let
};
in
{
imports = [
./gtk.nix
];
sane.programs.gameApps = declPackageSet [
"animatch"
"gnome-2048"

View File

@ -1,341 +0,0 @@
# gtk apps search XDG_ICON_DIRS for icons (nixos specific)
# nixos ships the hi-color icon theme by default, which has *some* icons,
# but leaves a lot of standard ones unavailable.
#
# system-wide theme components live in:
# - /run/current-system/sw/share/color-schemes/${theme}
# - /run/current-system/sw/share/icons/${theme}
# - /run/current-system/sw/share/icons/${theme}/cursors (cursor-theme)
# - /run/current-system/sw/share/themes/${theme}/gtk-4.0
{ config, lib, pkgs, ... }:
let
cfg = config.sane.gui.gtk;
unsortedThemes = {
# crude assortment of themes in nixpkgs; some might not be gtk themes, some gtk themes might not be in this list
inherit (pkgs)
# themes are in <repo:nixos/nixpkgs:pkgs/data/themes>
adapta-gtk-theme
adapta-kde-theme
adementary-theme
adi1090x-plymouth-themes
adw-gtk3
adwaita-qt
adwaita-qt6
albatross
amarena-theme
amber-theme
ant-bloody-theme
ant-nebula-theme
ant-theme
arc-kde-theme
arc-theme
artim-dark
ayu-theme-gtk
base16-schemes
blackbird
breath-theme
canta-theme
catppuccin-gtk
catppuccin-kde
catppuccin-kvantum
catppuccin-plymouth
clearlooks-phenix
colloid-gtk-theme
colloid-kde
dracula-theme
e17gtk
equilux-theme
flat-remix-gnome
flat-remix-gtk
fluent-gtk-theme
graphite-gtk-theme
graphite-kde-theme
greybird
gruvbox-dark-gtk
gruvbox-gtk-theme
gruvterial-theme
juno-theme
kde-gruvbox
kde-rounded-corners
layan-gtk-theme
layan-kde
lightly-boehs
lightly-qt
lounge-gtk-theme
marwaita
marwaita-manjaro
marwaita-peppermint
marwaita-pop_os
marwaita-ubuntu
matcha-gtk-theme
materia-kde-theme
materia-theme
material-kwin-decoration
mojave-gtk-theme
nixos-bgrt-plymouth
nordic
numix-gtk-theme
numix-solarized-gtk-theme
numix-sx-gtk-theme
oceanic-theme
omni-gtk-theme
onestepback
openzone-cursors
orchis-theme
orion
palenight-theme
paper-gtk-theme
pitch-black
plano-theme
plasma-overdose-kde-theme
plata-theme
pop-gtk-theme
qogir-kde
qogir-theme
rose-pine-gtk-theme
shades-of-gray-theme
sierra-breeze-enhanced
sierra-gtk-theme
skeu
snowblind
solarc-gtk-theme
spacx-gtk-theme
stilo-themes
sweet
sweet-nova
theme-jade1
theme-obsidian2
theme-vertex
tokyo-night-gtk
ubuntu-themes
venta
vimix-gtk-themes
whitesur-gtk-theme
yaru-remix-theme
yaru-theme
zuki-themes
;
inherit (pkgs.gnome)
adwaita-icon-theme
gnome-themes-extra
;
};
themes = with pkgs; {
color-scheme = {
default = emptyDirectory;
Dracula = dracula-theme;
DraculaPurple = dracula-theme;
Dracula-cursors = dracula-theme;
};
cursor-theme = {
Adwaita = gnome.adwaita-icon-theme;
};
gtk-theme = {
Adwaita = gnome.gnome-themes-extra; # gtk-3.0
Adwaita-dark = gnome.gnome-themes-extra; # gtk-3.0
Arc = arc-theme; # gtk-4.0
Arc-Dark = arc-theme; # gtk-4.0
Arc-Darker = arc-theme; # gtk-4.0
Arc-Lighter = arc-theme; # gtk-4.0
Dracula = dracula-theme; # gtk-4.0
E17gtk = e17gtk; # gtk-3.0
Fluent = fluent-gtk-theme; # gtk-4.0
Fluent-compact = fluent-gtk-theme; # gtk-4.0
Fluent-Dark = fluent-gtk-theme; # gtk-4.0
Fluent-Dark-compact = fluent-gtk-theme; # gtk-4.0
Fluent-Light = fluent-gtk-theme; # gtk-4.0
Fluent-Light-compact = fluent-gtk-theme; # gtk-4.0, NICE!
HighContrast = gnome.gnome-themes-extra; # gtk-3.0
Matcha-light-azul = matcha-gtk-theme; # gtk-4.0, NICE!
Matcha-light-sea = matcha-gtk-theme; # gtk-4.0, NICE!
# additional Matcha-* omitted
Nordic = nordic; # gtk-4.0
Nordic-bluish-accent = nordic; # gtk-4.0
Nordic-darker = nordic; # gtk-4.0
Nordic-Polar = nordic; # gtk-4.0, NICE
Numix = numix-gtk-theme; # gtk-3.20, meh
NumixSolarizedDarkBlue = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkCyan = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkGreen = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkMagenta = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkOrange = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkRed = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkViolet = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedDarkYellow = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightBlue = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightBlueDarkTop = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightCyan = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightGreen = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightMagenta = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightOrange = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightRed = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightViolet = numix-solarized-gtk-theme; # gtk-3.20
NumixSolarizedLightYellow = numix-solarized-gtk-theme; # gtk-3.20
NumixStandard = numix-solarized-gtk-theme; # gtk-3.20
Paper = paper-gtk-theme; # gtk-4.0
Pop = pop-gtk-theme; # gtk-4.0
Pop-dark = pop-gtk-theme; # gtk-4.0
Tokyonight-Light-B = tokyo-night-gtk; # gtk-4.0, NICE
# other Tokyonight-* omitted
};
icon-theme = {
# find icon themes via `nix-locate share/icons/Adwaita`
# then determine the name here by building and `ls result/share/icons`
# this misses quite a few icon themes that aren't Adwaita-based.
# for those, try `nix-locate share/icons`?
#
# note that adwaita apps expect exactly the icon set provided by adwaita-icon-theme:
# - most icon themes are supplementary to adwaita, rather than a full replacement.
# - i.e. most themes, unless adwaita is also installed, will cause some missing icons inside apps.
# - that's probably why so many themes here also symlink Adwaita
# my accounting of "adwaita coverage" seems to be overoptimistic somehow
# maybe some apps bundle adwaita themselves
Adwaita = gnome.adwaita-icon-theme;
Arc = arc-icon-theme; # 4.5/5, meh icon for "vertical ellipsis". 3/5 adwaita coverage
elementary-xfce = elementary-xfce-icon-theme; # does not cross compile (2023/10/03)
elementary-xfce-dark = elementary-xfce-icon-theme;
elementary-xfce-darker = elementary-xfce-icon-theme;
elementary-xfce-darkest = elementary-xfce-icon-theme;
HighContrast = gnome.gnome-themes-extra; # 5/5. 5/5 adwaita coverage (4/5 cross)
Humanity = humanity-icon-theme; # 5/5. 5/5 adwaita coverage (3.5/5 cross, unique in which icons work)
Humanity-Dark = humanity-icon-theme;
kora = kora-icon-theme;
kora-light = kora-icon-theme;
kora-light-panel = kora-icon-theme;
kora-pgrey = kora-icon-theme;
Numix = numix-icon-theme; # 4/5, meh icon for "back".
Numix-Light = numix-icon-theme;
Paper = paper-icon-theme; # 4/5, weird icon for "info". 5/5 adwaita coverage (3.5 cross, highly unique in which icons work)
Paper-Mono-Dark = paper-icon-theme;
Pop = pop-icon-theme; # 5/5. 2/5 adwaita coverage
Tela-circle = tela-circle-icon-theme;
Tela-circle-dark = tela-circle-icon-theme;
Tela-circle-light = tela-circle-icon-theme;
# themes which don't symlink Adwaita
BeautyLine = beauty-line-icon-theme; # 3.5/5. 4/5 adwaita coverage
breeze = breeze-icons;
breeze-dark = breeze-icons;
Mint-X = cinnamon.mint-x-icons;
# 10-ish other Mint-X variants omitted
# cinnamon.mint-l-icons;
# cinnamon.mint-y-icons;
Colloid = colloid-icon-theme; # 4.5/5, thin. 5/5 adwaita coverage (3/5 cross)
Colloid-dark = colloid-icon-theme;
Colloid-light = colloid-icon-theme;
bloom = deepin.deepin-icon-theme;
# 4 other deepin editions omitted
Dracula = dracula-icon-theme; # 4.5/5, a little thin. 4.5/5 adwaita coverage
Faba = faba-icon-theme; # 4/5. 4/5 adwaita coverage
Faba-Mono = faba-mono-icons;
Faba-Mono-Dark = faba-mono-icons;
Flat-Remix-Grey-Light = flat-remix-icon-theme; # 5/5. 5/5 adwaita coverage. builds on breeze, elementary
# 20-ish other flat-remix editions omitted
Fluent = fluent-icon-theme; # 5/5, though thin. 5/5 adwaita coverage (3/5 cross)
Fluent-dark = fluent-icon-theme;
gnome = gnome-icon-theme; # 3/5, icons are colored. 3/5 adwaita coverage
hicolor = hicolor-icon-theme; # 2/5 adwaita coverage; using this forces application builtin icons
la-capitaine-icon-theme = la-capitaine-icon-theme; # 4.5/5. 4.5/5 adwaita coverage. builds upon elementary
Luna = luna-icons;
# 5 other Luna variants omitted
maia = maia-icon-theme; # 3/5, icons are colored. 2/5 adwaita coverage
maia-dark = maia-icon-theme;
# mate.mate-icon-theme-faenza
mate = mate.mate-icon-theme; # 4.5/5. 4/5 adwaita coverage
menta = mate.mate-icon-theme;
Moka = moka-icon-theme; # 3/5, icons are colored. 3/5 adwaita coverage
# nixos-icons;
Nordzy = nordzy-icon-theme; # 5/5, thin. 5/5 adwaita coverage (3/5 cross)
# 10-ish Nordzy editions omitted
# numix-icon-theme-circle
# numix-icon-theme-square
oomox-gruvbox-dark = gruvbox-dark-icons-gtk;
Oranchelo = oranchelo-icon-theme;
# 3 other oranchelo editions omitted
elementary = pantheon.elementary-icon-theme; # 4.5/5. 4.5/5 adwaita coverage
Papirus = papirus-icon-theme; # 5/5. 5/5 adwaita coverage
# 4 other Papirus editions omitted
# papirus-maia-icon-theme
Qogir = qogir-icon-theme; # 5/5, thin. 5/5 adwaita coverage (2.5/5 cross)
# 5 other Qogir variants omitted
rose-pine = rose-pine-icon-theme;
rose-pine-dawn = rose-pine-icon-theme; # 5/5. 5/5 adwaita coverage (2.5 cross). looks a lot like Flat Remix...
rose-pine-moon = rose-pine-icon-theme;
SuperTinyIcons = super-tiny-icons; # 4/5. 2/5 adwaita coverage
Tango = tango-icon-theme; # 2/5. 3/5 adwaita coverage -- mostly just forwards to gnome-icon-theme
Tela = tela-icon-theme; # 5/5. 5/5 adwaita coverage
# 30-ish other Tela editions omitted
Vimix = vimix-icon-theme;
# 15-ish other Vimix editions omitted
WhiteSur = whitesur-icon-theme; # 4.5/5, thin & like iOS. 5/5 adwaita coverage (3.5/5 cross)
WhiteSur-dark = whitesur-icon-theme;
Rodent = xfce.xfce4-icon-theme;
Zafiro-icons-Dark = zafiro-icons;
Zafiro-icons-Light = zafiro-icons; # 5/5. 5/5 adwaita coverage
};
};
in
{
options = with lib; {
sane.gui.gtk.enable = mkOption {
default = false;
type = types.bool;
description = "apply theme to gtk4 apps";
};
sane.gui.gtk.all = mkOption {
default = false;
type = types.bool;
description = "install all known gtk themes (for testing)";
};
sane.gui.gtk.color-scheme = mkOption {
default = "default";
type = types.str;
};
sane.gui.gtk.cursor-theme = mkOption {
default = "Adwaita";
type = types.str;
};
sane.gui.gtk.gtk-theme = mkOption {
default = "Adwaita";
type = types.str;
};
sane.gui.gtk.icon-theme = mkOption {
default = "Adwaita";
type = types.str;
};
};
config.sane.programs.dconf.config.site = lib.mkIf cfg.enable [
(pkgs.writeTextFile {
name = "dconf-sway-settings";
destination = "/etc/dconf/db/site.d/10_gtk_settings";
text = ''
[org/gnome/desktop/interface]
color-scheme="${cfg.color-scheme}"
cursor-theme="${cfg.cursor-theme}"
gtk-theme="${cfg.gtk-theme}"
icon-theme="${cfg.icon-theme}"
'';
})
];
# environment.systemPackages = lib.attrValues themes;
config.environment.systemPackages = lib.mkIf cfg.enable ([
themes.color-scheme."${cfg.color-scheme}"
themes.cursor-theme."${cfg.cursor-theme}"
themes.gtk-theme."${cfg.gtk-theme}"
themes.icon-theme."${cfg.icon-theme}"
] ++ lib.optionals cfg.all (lib.attrValues unsortedThemes));
# XXX(2024/02/05): set GSK_RENDERER=cairo to solve graphical edge-case on moby where some JPEGs would render as black!
# - repro by loading komikku and viewing images. some fail (particularly mangadex onimai), some work.
# - run `GSK_RENDERER=help loupe` to see options.
# - TODO: see if i can enable the `vulkan` GSK_RENDERER?
# - for more on GSK_RENDERER: <https://blog.gtk.org/2024/01/28/new-renderers-for-gtk/>
# XXX(2024/02/21): GSK_RENDERER=cairo breaks `delfin` (as does GSK_RENDERER=vulkan, when gtk4 is compiled with `vulkanSupport = true`)
# - perhaps it's best to let this be defaulted and set it ONLY where needed
# - upstream gtk recommends using mesa 24.0 (latest) specifically in response to the GSK renderers triggering new driver bugs,
# so maybe i can update that before re-enabling GSK_RENDERER anywhere else.
# environment.variables.GSK_RENDERER = "cairo";
}