Skip to content

Platform support

Feature Windows 10/11 GNOME 42+ KDE Plasma 5/6 XFCE Hyprland Sway Generic X11
Theme detection ✅ ✅ ✅ ✅ ⚠️ ⚠️ ⚠️
Accent colour ✅ ✅ ⚠️ ⚠️ ❌ ❌ ❌
Wallpaper ✅ ✅ ✅ ✅ ✅ ✅ ✅
Notification ✅1 ✅ ✅ ✅ ⚠️ ⚠️ ⚠️
Notification icon ✅ ✅ ✅ ✅ ✅ ✅ ✅
Notification actions ⚠️2 ✅ ✅ ✅ ✅ ✅ ✅
Wake lock ✅ ✅ ✅ ✅ ⚠️ ⚠️ ⚠️
System tray ✅ ✅ ✅ ⚠️ ✅ ✅ ✅
Media control ✅ ✅ ✅ ✅ ✅ ✅ ✅
Session lock ✅ ✅ ✅ ✅ ✅ ✅ ✅
Session logout ✅ ✅ ✅ ⚠️ ⚠️ ⚠️ ⚠️
Suspend / hibernate ✅ ✅ ✅ ✅ ✅ ✅ ✅
Reboot / shutdown ✅ ✅ ✅ ✅ ✅ ✅ ✅

✅ verified against the real backend · ⚠️ best-effort, or needs an extra component · ❌ the platform has no such concept.

The symbols are only a static hint. The real answer at runtime always comes from capabilities() / support_level() — never assume from this table:

Entry What the fallback does Reported as
Theme detection on Hyprland / Sway / X11 No system-wide colour scheme; reads GSettings if a GTK app has written a value Theme::Unknown when every probe comes up empty
Notifications on tilers / X11 org.freedesktop.Notifications works, but actions and images depend on the installed daemon actions render only if the daemon supports them
Wake lock on tilers / X11 The call fails outright when the ScreenSaver service is absent a UdaError (connection failure); this module has no graded report
Tray on XFCE SNI works through the AppIndicator-compatible watcher, but there is no native double-click event DoubleClick reports SupportLevel::None
use uda_core::capability::SupportLevel;
use uda_core::tray::{TrayFeature, TrayManager};
let manager = uda_platform_linux::LinuxTrayManager::new();
let level = manager.support_level(TrayFeature::DoubleClick);
match level {
SupportLevel::Full => { /* draw the double-click action */ }
SupportLevel::Partial(reason) => { warn!("double click is degraded on this backend: {reason}") }
SupportLevel::None => { /* hide it */ }
}

From a C host the same information is available through uda_session_capabilities and the module capabilities() functions.

Environment Backend
Windows Registry AppsUseLightTheme
GNOME Portal org.freedesktop.appearance → gsettings color-scheme
KDE kreadconfig6/5 reads Colors:Scheme
XFCE xfconf-query -c xsettings
Wayland tiling WM ⚠️ cannot be determined reliably; returns UNKNOWN

The wallpaper backend does not use the XDG Desktop Portal: org.freedesktop.portal.Wallpaper exists but is never called.

Environment Mechanism
GNOME the gsettings CLI, writing picture-uri and picture-uri-dark as a pair
KDE D-Bus org.kde.plasmashell → /PlasmaShell → evaluateScript
Hyprland the hyprpaper CLI, falling back to swww
Sway the swww CLI
Generic X11 the feh CLI, falling back to nitrogen
Windows SystemParametersInfoW(SPI_SETDESKWALLPAPER)
Environment Backend Icon Actions
Any Linux DE org.freedesktop.Notifications ✅ ✅
Windows WinRT ToastNotificationManager ✅ ⚠️2

A Wayland tiling WM needs a notification daemon running (mako, swaync, dunst, …), otherwise the Notify call fails with ServiceUnknown.

Environment Backend Note
Linux org.kde.StatusNotifierItem + com.canonical.dbusmenu GNOME needs the AppIndicator extension
Windows Shell_NotifyIconW (NOTIFYICON_VERSION_4) dedicated worker thread + message pump
Environment Backend
Linux MPRIS v2 over session D-Bus
Windows WinRT SMTC
Action Linux Windows
Lock ScreenSaver Lock → loginctl lock-session LockWorkStation()
Logout GNOME/KDE D-Bus methods ExitWindowsEx(EWX_LOGOFF)
Suspend / hibernate logind Suspend / Hibernate SetSuspendState
Reboot / shutdown logind Reboot / PowerOff ExitWindowsEx + SeShutdownPrivilege

The Linux side of logout depends on the DE providing a D-Bus method; on an unrecognised desktop the capability bit for that action is false.

SupportLevel has exactly three variants: Full, Partial(reason) and None. Partial must carry its reason — a host that wants to explain a degradation to the user should not have to guess why.

Feature × environment Level Reason
Theme detection × Wayland tiling Partial no standard query path; every probe comes up empty
Accent colour × KDE/XFCE None no system-level accent colour
Notification actions × Windows unpackaged Partial needs an MSIX-registered COM activator
Tray × XFCE None SNI has no double-click event, so the feature is not reported
Wake lock × Wayland tiling None the call fails outright when ScreenSaver is absent; there is no CLI fallback
Environment Minimum version
Windows 10 (toasts are complete on 10/11)
GNOME 42
KDE Plasma 5
XFCE 4.14+
Rust 1.70
Python 3.9
Node.js 16

Global shortcuts, the multi-format clipboard with change listening, audio endpoint routing and display brightness are in progress — see plans/phase3_plan.md.

  1. A Store-installed runtime shows the notification source as the host’s package family name — see docs/internals/notification_specs.md §3.1. ↩

  2. In an unpackaged host, action buttons degrade to a read-only text card — see §3.2. ↩ ↩2