GTK - Enable/set dark theme on a per-application basis
Solution 1
With gtk+ ≥ 3.12
you can load a specific theme and its variant (dark, light) on a per-application1 basis via the environment variable GTK_THEME=theme:variant
. As per the gtk+
reference manual:
GTK_THEME. If set, makes GTK+ use the named theme instead of the theme that is
specified by the gtk-theme-name setting [...] It is also possible to specify a
theme variant to load, by appending the variant name with a colon, like this:
GTK_THEME=Adwaita:dark.
So, to load2 the dark variant you would run:
GTK_THEME=Adwaita:dark gedit
Likewise, to achieve the opposite (when the default theme is dark), you load the light variant:
GTK_THEME=Adwaita:light gedit
Note that if you want to use it via a custom launcher (.desktop
file) you'll have to prepend env
to the command in the Exec
line:
Exec=env GTK_THEME=Adwaita:dark eog %U
1: Worth noting that - as per the devs decision - newer gnome-terminal
has its own configuration via menu > preferences and it ignores the theme. Also, since this is rather new stuff, some gtk+ 3 applications might not (yet) honor the GTK_THEME
environment variable.
2: This doesn't seem to work if you already have a running instance of that application e.g. if nautilus
is already running in dark mode then running GTK_THEME=Adwaita:light nautilus
will open a new nautilus
window but still in dark mode. I don't know if this is a feature or a bug...
Solution 2
For GTK+-3 applications, you can enforce the dark theme variant using GtkSettings' settings.ini:
$ mkdir -p $HOME/.config/gnome-terminal/gtk-3.0 # the path before gtk-3.0 is arbitrary
$ cat >> $HOME/.config/gnome-terminal/gtk-3.0/settings.ini << EOF
[Settings]
gtk-application-prefer-dark-theme=true
EOF
$ echo 'alias gnome-terminal="XDG_CONFIG_HOME=$HOME/.config/gnome-terminal gnome-terminal" >> $HOME/.bashrc
For non-GTK+ applications like vnc
, you can still enforce dark window decorations by setting the _GTK_THEME_VARIANT
X property of type UTF8_STRING
to dark
. To do this with xprop
, type the following command and click the window afterwards:
$ xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark"
xprop
can also select windows by the WM_NAME
property (the title bar label) or by window id:
$ xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark" -name "Spotify Premium - Linux Preview"
$ xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark" -id 0x380002b
To get window ids and names, use xlsclients -l
.
Solution 3
Here is a bash script I have used to launch a application with a different theme. Haven't used it in years though, so I don't know if it will work with the current GTK.
#!/bin/bash
# lauch a gtk application with a different theme
# set GTKRCFILE variable to your favourite theme
GTKRCFILE=Clearlooks
GTK2_RC_FILES=/usr/share/themes/"$GTKRCFILE"/gtk-2.0/gtkrc "$@"
Here is a bit of info I got off the ubuntu fourms archives. Not sure if it will be a problem. (here) There is also a blog post detailing this method a little more. (here) and (here). There is also a similar question on this site that has already been answered. (here)
Under gnome, apps get their theme from the gnome-settings-daemon. This instantaneously applies any theme change to all active applications, making per-appplication theme changing impossible.
Solution 4
If somebody still need it, I've created simple app that will automatically set dark theme for specified apps.
You can find it here: https://github.com/galczo5/gnome-dark-apps
Solution 5
I wrote a little wrapper script for that:
#!/bin/bash
if [ $# -eq 0 ]; then
xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark"
exit $?
fi
GTK_THEME="$(gsettings get org.gnome.desktop.interface gtk-theme)"
export GTK_THEME="${a%%:*}:dark"
export GTK_THEME_VARIANT="dark"
"$@" & PID="$!"
echo "started darkening for PID=$PID"
cnt=0
while :; do
if [ $cnt -lt 1000 ]; then
sleep .1
let 'x=x-1'
else
sleep 5
fi
if ! kill -0 $PID 2>/dev/null; then
echo "darkening for PID=$PID done"
exit 0
fi
REGEX="$(echo $PID | cat - <(command ps -o pid:1 --no-headers --ppid $PID) | paste -sd "|" -)"
wmctrl -lp \
| rg -i "^(0x[a-f0-9]+)\s+\d+\s+($REGEX)\s" -o --replace '$1' \
| xargs -I @ xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark" -id @
done
It'S using https://github.com/BurntSushi/ripgrep for REGEX
colin
Updated on September 18, 2022Comments
-
colin over 1 year
Is there a way to set gtk-application-prefer-dark-theme for an application?
This is normally set in the code by the application. Apps such as Eye of Gnome and Totem turn it on. I want to, as a user turn it on, on a per application bases.
For gnome-terminal, I normally use a white text on black background color scheme, and having the dark window border would improve the overall look.
I also want to turn it on for vlc.
-
Admin over 3 yearsMaybe someone still needs a solution to this problem. I wrote a small script: github.com/catvitalio/dark-headers. Works as a systemd daemon.
-
-
Peter.O almost 13 yearsTypo or mistake? ('gnome-settings-demon")... The word is daemon (not demon).. It has a very different root meaning:
…(in ancient Greek belief) Daemons are good or benevolent supernatural beings between mortals and gods
... daemon=good / demon=bad ... en.wikipedia.org/wiki/Daemon_%28classical_mythology%29 .. (pronounced day-mon) -
giodamelio almost 13 yearsTypo, that's what happens when you don't spell check everything :|
-
XTL about 9 yearsSo you can name a specific theme, but can't say "dark variant of whatever theme is set"?
-
don_crissti about 9 years@XTL - Exactly. Though
GTK_THEME=:light eog
seems to be working too... -
Smallen almost 9 yearsThis doesn't seem to work for most applications.
-
Smallen almost 9 yearsI haven't been able to find an application that this works for yet, when I have a dark theme.
-
don_crissti almost 9 years@Thayne - as per the first line in my post, this works for systems/apps using gtk3 version 3.12 or higher (but the apps must honor the GTK_THEME env variable).
-
Florian Shu over 8 years@Peter.O: Different meaning in present day English, but same origin indeed. etymonline.com/index.php?term=demon
-
MattSturgeon about 8 yearsFor some reason
gnome-terminal
has decided it's too much effort to keep the code for the Dark theme, so unless your distro has patched this back in this wont work forgnome-terminal
-
aBarocio80 almost 8 yearsI have tried the above (for .
desktop
files), but it doesn't work, not even with theenv
. When launched from terminal it works prefectly. I use gtk 3.14.5-1+deb8u1, and tried with gedit 3.14.0-3, running on Debian "jessie/stable" 8. -
don_crissti almost 8 years@aBarocio80 - works fine here (archlinux + gnome 3 - up to date). Any custom launcher I create in
~/.local/share/applications/
(including forgedit
) honors theenv GTK_THEME
directive in theExec
field so most likely something is wrong on your setup but since I don't use debian/derivatives I can't help you. -
Admin over 6 years
sh -c
can be used here instead ofenv
-
Robbi Nespu over 5 yearstried with
GTK2_RC_FILES=/usr/share/themes/Adwaita/gtk-2.0/gtkrc /opt/ide/eclipse
and does't worked -
Nick Bull over 4 yearsSpecifically for
gnome-terminal
, you can use the followinggsettings set org.gnome.Terminal.Legacy.Settings theme-variant 'dark'
-
Coder Guy over 4 yearsThis works well for gapcmon
-
Martin Marconcini over 4 yearsFor Charles Proxy (a big Java app), at least on Pop!_OS it's very hard to read on Dark Mode, so I changed
/usr/share/applications/charles-proxy.desktop
and changed the Exec line to look like:Exec=env GTK_THEME=Adwaita:light /usr/bin/charles4 %F
this makes Charles a bright lamp, but readable. -
Scott - Слава Україні about 4 yearsPlease describe how this app can be used to answer the question.
-
chus over 3 years@aBarocio80 -
Exec=env GTK_THEME=Adwaita:dark geany %F
in a.desktop
file works for Ubuntu 18.04, gtk 3.22.30-1ubu. I have also addedalias geany='GTK_THEME=Adwaita:dark geany'
in.bash_aliases
for launches from the terminal. -
Admin about 2 yearsThis appears (superficially) to be similar to Black Rain’s answer. Can you explain how yours is different, and why you are using
xdotool
(i.e., what good does it do)? … … … … … … … … … … Please do not respond in comments; edit your answer to make it clearer and more complete. -
Admin almost 2 years
xlsclients
won't get the right ids (I don't know why). I usedwmctrl -lp
instead