Skip to content

Instantly share code, notes, and snippets.

@gwallet
Last active May 21, 2025 12:18
Show Gist options
  • Save gwallet/6e586f87e17db127c0734ffa6c49e280 to your computer and use it in GitHub Desktop.
Save gwallet/6e586f87e17db127c0734ffa6c49e280 to your computer and use it in GitHub Desktop.
Service to sync GTK Theme with Color Scheme on GNOME Desktop Enviroment (and maybe compatible)

Sync GTK Theme with Dark Mode in GNOME ≥47

org.gnome.desktop.interface/color-scheme is the settings that GNOME uses to change the color scheme of GTK 4 apps themed with libadwaita. Some GTK apps will not trigger theme change because they're sentitive to org.gnome.desktop.interface/gtk-theme.

gtk_theme_sync_service.sh is a service that ensure both settings are in sync. org.gnome.desktop.interface/color-scheme is the source of truth.

Works on Fedora Workstation 41 + GNOME 47 and Night Theme Switcher GNOME Extension

Workaround inspired by this proposal

Installation

Save gtk_theme_sync_service.sh where it can then be accessible:

install -m 755 gtk_theme_sync_service.sh ${TARGET}/gtk_theme_sync_service

with ${TARGET} choosen among:

  • /opt
  • /usr/local/bin
  • ${HOME}/.local/bin

Edit and save the systemd unit file:

systemctl [--user] edit --full --force gtk_theme_sync.service
# ... copy/paste, adapt ExecStart then save
systemctl [--user] enable --now gtk_theme_sync.service

Note: use --user if shellscript is installed under user's home directory

It's ready to rock!

systemctl [--user] edit --full gtk_theme_sync.service

Sublime Text

Be sure to enable Adaptive on each theme (dark and light) and auto color scheme:

{
  //...
  "theme": "auto",
  "dark_theme": "Adaptive.sublime-theme",
  "light_theme": "Adaptive.sublime-theme",
  "color_scheme": "auto",
  "dark_color_scheme": "Mariana.sublime-color-scheme",
  "light_color_scheme": "Breakers.sublime-color-scheme",
  //...
 }
[Unit]
Description=GTK Theme Sync Service
[Service]
ExecStart=/target/path/to/gtk_theme_sync_service
Restart=on-failure
[Install]
WantedBy=gnome-session.target
#!/usr/bin/env bash
#set -x
set -o errexit
set -o nounset
set -o pipefail
function log {
local -r message="$1"; shift
echo "$(date +"%F %T"): ${message}"
}
function on_new_color_scheme {
local -r color_scheme="$1"; shift
log "Switched to ${color_scheme}"
local GTK_THEME="Adwaita"
case "${color_scheme}" in
(*dark*)
GTK_THEME="Adwaita-dark"
;;
(*default*)
GTK_THEME="Adwaita"
;;
esac
readonly GTK_THEME
log "Applying ${GTK_THEME} GTK theme..."
gsettings set org.gnome.desktop.interface gtk-theme "${GTK_THEME}"
}
log "Listening to 'org.gnome.desktop.interface/color-scheme' change ..."
while read -r COLOR_SCHEME
do
on_new_color_scheme "${COLOR_SCHEME}"
done < <(gsettings monitor org.gnome.desktop.interface color-scheme)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment