Osiągnięcie jednolitego wyglądu GTK i Qt w XFCE to temat, który co jakiś czas powraca i nurtuje szczególnie estetów komputerowych.

Można jednak pójść jeszcze dalej i dołożyć przełącznik trybu jasny/ciemny - taki, który działa na żywo i nie wymaga relogowania. To docenimy szczególnie poza domem - w plenerze, podczas słonecznej pogody, gdy praca z ciemnym motywem bywa niemożliwa.

Poniżej opisany jest przepis na spięcie GTK i Qt tak, żeby wyglądały spójnie w XFCE, oraz prosty przełącznik jasny/ciemny działający w ramach jednej sesji - bez restartu X i bez relogowania.

Cel jest prosty: przełącznik motywu „jasny/ciemny” działający natychmiast, bez wylogowywania. GTK3 zmienia motyw z poziomu XFCE, GTK4 respektuje color-scheme, a Qt5 i Qt6 przełączają styl po zapisaniu konfiguracji.

W tle nie ma magii, tylko kilka przewidywalnych mechanizmów:

  • XFCE dostaje nowy Net/ThemeName.
  • gsettings przełącza org.gnome.desktop.interface color-scheme.
  • qt5ct i qt6ct dostają nowy style=Adwaita / style=Adwaita-Dark.

Wymagania

Poniżej konfiguracja sprawdzona na Alpine Linux w XFCE, z motywem opartym o Adwaitę.

Pakiety do instalacji:

apk add \
  adw-gtk3 \
  adwaita-icon-theme \
  adwaita-qt5 \
  adwaita-qt6 \
  qt5ct \
  qt6ct \
  xdg-desktop-portal \
  xdg-desktop-portal-gtk

W praktyce ważne są trzy rzeczy:

  • xdg-desktop-portal-gtk (żeby Qt5 przełączało się „od ręki”).
  • qt5ct i qt6ct (żeby mieć kontrolę nad stylem Qt i pliki konfiguracyjne, które da się przełączać skryptem).
  • Motyw GTK w dwóch wariantach: jasny i ciemny (tu: adw-gtk3 / adw-gtk3-dark).

W przypadku Qt6 potrzebny jest jeszcze eksport zmiennej środowiskowej przed startem sesji:

# ~/.xprofile
export QT_QPA_PLATFORMTHEME=qt6ct

Po zmianie pliku trzeba się przelogować, bo to ma działać od startu sesji.

Pierwsze uruchomienie qt5ct/qt6ct

Po instalacji warto uruchomić qt5ct i qt6ct ręcznie, żeby stworzyły się pliki konfiguracyjne. W obu przypadkach ustaw:

  • Color scheme: Style's colors (to generuje profil kolorów na podstawie aktualnego motywu).

Inaczej (np. w nextcloud-client) część elementów potrafi wyglądać obco względem motywu. qt6ct generuje plik style-colors.conf na podstawie aktualnego motywu GTK, więc jeśli po przełączeniu stylu kolory nadal są „z poprzedniego trybu”, najpewniejszym lekarstwem jest chwilowe odpalenie qt6ct i pozwolenie mu na regenerację.

Skrypt przełącznika (XFCE launcher)

Ten przełącznik najlepiej wkleić do launchera XFCE jako jeden wiersz:

/bin/sh -c 'if xfconf-query -c xsettings -p /Net/ThemeName | grep -qi dark; then xfconf-query -c xsettings -p /Net/ThemeName -s adw-gtk3 ; sed -i "s/^style=.*/style=Adwaita/" ~/.config/qt5ct/qt5ct.conf ; sed -i "s/^style=.*/style=Adwaita/" ~/.config/qt6ct/qt6ct.conf ; gsettings set org.gnome.desktop.interface color-scheme default ; else xfconf-query -c xsettings -p /Net/ThemeName -s adw-gtk3-dark ; sed -i "s/^style=.*/style=Adwaita-Dark/" ~/.config/qt5ct/qt5ct.conf ; sed -i "s/^style=.*/style=Adwaita-Dark/" ~/.config/qt6ct/qt6ct.conf ; gsettings set org.gnome.desktop.interface color-scheme prefer-dark ; fi'

Zmiana jest natychmiastowa. GTK3 podąża za XFCE, GTK4 za color-scheme, a Qt5/Qt6 za wpisem style= w swoich plikach.

Bardziej przejrzysty przykład w postaci skryptu shella poniżej.

#!/bin/sh

THEME_LIGHT_GTK="adw-gtk3"
THEME_DARK_GTK="adw-gtk3-dark"

THEME_LIGHT_QT="Adwaita"
THEME_DARK_QT="Adwaita-Dark"

QT5CT_CONF="$HOME/.config/qt5ct/qt5ct.conf"
QT6CT_CONF="$HOME/.config/qt6ct/qt6ct.conf"

if xfconf-query -c xsettings -p /Net/ThemeName | grep -qi dark; then
  xfconf-query -c xsettings -p /Net/ThemeName -s "$THEME_LIGHT_GTK"
  sed -i "s/^style=.*/style=$THEME_LIGHT_QT/" "$QT5CT_CONF"
  sed -i "s/^style=.*/style=$THEME_LIGHT_QT/" "$QT6CT_CONF"
  gsettings set org.gnome.desktop.interface color-scheme default
else
  xfconf-query -c xsettings -p /Net/ThemeName -s "$THEME_DARK_GTK"
  sed -i "s/^style=.*/style=$THEME_DARK_QT/" "$QT5CT_CONF"
  sed -i "s/^style=.*/style=$THEME_DARK_QT/" "$QT6CT_CONF"
  gsettings set org.gnome.desktop.interface color-scheme prefer-dark
fi

Ustawienia aplikacji Qt (na przykładzie KeePassXC)

Niektóre programy mają własny przełącznik motywu i potrafią go wymusić. W KeePassXC warto ustawić:

  • Theme: Automatic albo Classic (platform native)

Wtedy aplikacja nie będzie blokować stylu narzuconego przez qt5ct.

Co warto wiedzieć (praktyka)

W tym układzie QT_QPA_PLATFORMTHEME=qt5ct nie jest konieczne: Qt5 potrafi przełączać się przez xdg-desktop-portal-gtk. Mimo to qt5ct i plik ~/.config/qt5ct/qt5ct.conf są przydatne jako „magazyn stanu” - po zalogowaniu zostaje ostatnio użyty tryb, bez ręcznego klikania.