GTK vs Qt w XFCE - jednolity wygląd środowiska graficznego i sprytny przełącznik trybu jasny/ciemny
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. gsettingsprzełączaorg.gnome.desktop.interface color-scheme.qt5ctiqt6ctdostają nowystyle=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”).qt5ctiqt6ct(ż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:
AutomaticalboClassic (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.