Current standalone status:
- The extracted code now builds as an independent Meson project from
theme-daemon/. - The standalone daemon keeps the theme, icon, cursor, font, Xft, GTK modules, and XSETTINGS logic.
- The standalone daemon now reads runtime settings from
~/.config/vaxp/theme-daemon.ini. - Cursor changes are applied through both persistent config files and a live GTK runtime sync path, so running GTK applications update immediately.
Build:
cd theme-daemon
meson setup builddir
ninja -C builddirOutput binary:
builddir/plugins/xsettings/theme-daemon
Config example:
theme-daemon.ini.example
D-Bus control:
- Bus name:
org.vaxp.ThemeDaemon - Object path:
/org/vaxp/ThemeDaemon - Interface:
org.vaxp.ThemeDaemon - Methods:
SetGtkTheme,SetIconTheme,SetCursorTheme,SetCursorSize,SetInterfaceMode,SetFontName,SetTextScalingFactor,Reload,GetConfigPath
Cursor handling notes:
XSETTINGSandXcursorare still updated for general desktop clients.- The daemon also writes cursor settings to:
~/.config/gtk-3.0/settings.ini,~/.config/gtk-4.0/settings.ini,~/.gtkrc-2.0, and~/.icons/default/index.theme. - For immediate GTK updates, the daemon initializes GTK at startup and applies
gtk-cursor-theme-nameandgtk-cursor-theme-sizethroughGtkSettingsbefore refreshing the root-window cursor.
Interface mode notes:
interface-modeis read from the[interface]section and accepts:system,light, ordark.- The daemon syncs this mode to GTK runtime settings and to the per-user GTK
config files so
lightanddarkapply immediately and persist across new application launches.
Modern portal support:
- A dedicated backend now exists for
org.freedesktop.impl.portal.Settings. - It exports
org.freedesktop.appearance/color-schemefrom the sameinterface-modevalue used by the theme daemon. - Portal integration is installed for both
vaxpandvenomdesktop IDs, so sessions exportingXDG_CURRENT_DESKTOP=Venomcan select the backend. - After installing portal files, restart
xdg-desktop-portalin the user session before testing GTK4, Chrome, VS Code, or other modern apps. - On
xdg-desktop-portal 1.18.x, the Settings portal may still probe unrelated GTK/GNOME backends and fail before exportingorg.freedesktop.portal.Settings. To avoid that on VAXP/Venom sessions, the installer also ships localgtk.portalandgnome.portaloverrides that remove only theorg.freedesktop.impl.portal.Settingsinterface, leaving the rest of those backends untouched. - On the user's current system,
xdg-desktop-portalreads portal configuration from/usr/local/share/xdg-desktop-portal, but it only scanned implementation descriptors from/usr/share/xdg-desktop-portal/portals. For that reason, the installer places the.portalfiles and D-Bus service registration in/usr/shareso the backend is actually discoverable. - This is the path used by newer GTK4 applications, browsers, and other modern clients that listen to the portal settings API instead of legacy XSETTINGS.
Post-install checklist:
- Install the daemon and support files:
sudo bash install.sh- Make sure your session manager starts the daemon on login:
/usr/local/bin/theme-daemon- After every install or portal-related update, refresh the user portal environment and restart the portal services:
systemctl --user import-environment XDG_CURRENT_DESKTOP DESKTOP_SESSION
systemctl --user restart xdg-desktop-portal.service
systemctl --user restart xdg-desktop-portal-gtk.service- Confirm the modern appearance portal is active:
gdbus introspect --session \
--dest org.freedesktop.portal.Desktop \
--object-path /org/freedesktop/portal/desktopYou should see org.freedesktop.portal.Settings in the output.
- Confirm the exported color-scheme value:
gdbus call --session \
--dest org.freedesktop.portal.Desktop \
--object-path /org/freedesktop/portal/desktop \
--method org.freedesktop.portal.Settings.Read \
org.freedesktop.appearance color-schemeExpected values:
0=system1=dark2=light
- Confirm the daemon config file exists:
~/.config/vaxp/theme-daemon.ini-
If you change cursor, GTK theme, icon theme, or interface mode from your own control center, make sure it talks to the daemon D-Bus API instead of editing unrelated desktop settings.
-
If GTK4, Chrome, VS Code, or other modern apps do not react after a fresh install, restart those applications after step 3 so they reconnect to the active portal instance.
Notes:
- Legacy applications rely on the daemon's XSETTINGS and GTK config file sync.
- Modern applications rely on the Settings portal path.
- Both paths must be active for a fully consistent desktop.