GTK 3 settings on Wayland
GTK+ is known for not picking up some variables from ${XDG_CONFIG_HOME}/gtk-3.0/settings.ini
, most notably themes.
This happens because when GTK+ uses the wayland backend, a subset of variables are pulled from the gsettings
schema org.gnome.desktop.interface
, whereas on X11 GTK talks to a XSETTINGS daemon that usually does this for you, or when missing, falls back to the user's setting.ini file.
Note that this only applies for settings that belong to org.gnome.desktop.interface
. Some settings, like gtk-application-prefer-dark-theme
, are still read from your settings.ini
.
If you only care about your GTK theme, you can export the GTK_THEME
environment variable before running your GTK programs. While this is quite simple, it's also fairly limited, since there are no environment variables to set other settings, like icon/cursor themes.
The proper workaround is to call gsettings set org.gnome.desktop.interface <key> <value>
yourself at any point before starting any GTK program, for each setting that you want set. A good place to do so is either your shell's rc files, or using exec
in your sway config.
You can list valid keys for the schema using gsettings list-keys org.gnome.desktop.interface
; you most notably want to set gtk-theme
, cursor-theme
and icon-theme
:
set $gnome-schema org.gnome.desktop.interface
exec_always {
gsettings set $gnome-schema gtk-theme 'Your theme'
gsettings set $gnome-schema icon-theme 'Your icon theme'
gsettings set $gnome-schema cursor-theme 'Your cursor Theme'
}
If you'd rather have those values picked from your settings.ini file, here is a small convenient script to just that:
#!/bin/sh
# usage: import-gsettings <gsettings key>:<settings.ini key> <gsettings key>:<settings.ini key> ...
expression=""
for pair in "$@"; do
IFS=:; set -- $pair
expressions="$expressions -e 's:^$2=(.*)$:gsettings set org.gnome.desktop.interface $1 \1:e'"
done
IFS=
eval exec sed -E $expressions "${XDG_CONFIG_HOME:-$HOME/.config}"/gtk-3.0/settings.ini >/dev/null
Importing the gtk, icon, and cursor themes:
exec_always import-gsettings \
gtk-theme:gtk-theme-name \
icon-theme:gtk-icon-theme-name \
cursor-theme:gtk-cursor-theme-name