← Otto Developer GuideXDG specifications

The inventory of the freedesktop.org/XDG file and D-Bus standards Otto implements, and the system services it talks to. For each one: which side Otto takes (producer or consumer of the files, server or client of the interface), how complete the support is, and where the code lives. What this means to a user is Open standards.

Why Otto keeps its state in the standard locations, even where a private format would be less work, is argued once in How we see the Linux desktop. The gaps at the bottom of this page are measured against it.

The xdg_* Wayland protocols, like every other protocol Otto serves, are in Wayland Protocols. Fonts are Text rendering.

File specifications

SpecificationRoleImplementation
Base DirectoryRead + write. XDG_CONFIG_HOME, XDG_CONFIG_DIRS, XDG_DATA_HOME, XDG_DATA_DIRS, XDG_CACHE_HOME, XDG_STATE_HOME are honoured everywhere paths are resolved; the session log is $XDG_STATE_HOME/otto/otto.logsrc/config/mod.rs (config layering), components/otto-foundations/src/xdg.rs, src/session_log.rs
Desktop EntryRead. Name, Icon, Exec, Categories, StartupWMClass, and [Desktop Action …] groups; the dock’s right-click menu is an entry’s own Actions=components/otto-kit/src/desktop_entry.rs, src/workspaces/apps_info.rs, components/otto-launcher/
Desktop Entry — associations (mimeapps.list)Read + write. Resolves the default application for a MIME type, following the standard search order. Files’ Open With, with Always use this app, writes [Default Applications] and [Added Associations] in $XDG_CONFIG_HOME/mimeapps.listsrc/config/default_apps.rs, components/otto-kit/src/mime_apps.rs (set_default), components/otto-files/src/app/open_with.rs
Shared MIME-infoRead. mime/globs2 and mime/subclasses from every XDG data dir, with the spec’s glob precedence; content sniffing on topcomponents/otto-kit/src/filetype/ (db.rs, glob.rs)
Icon ThemeRead. Theme lookup with hicolor fallback, SVG and rastercomponents/otto-kit/src/icons.rs, src/utils/mod.rs, via the freedesktop-icons crate
Cursor theme (Xcursor)Read. XCURSOR_THEME / XCURSOR_SIZE, loaded per named cursor and scalesrc/cursor.rs
Sound ThemeRead. sound_theme names the theme; event sounds are looked up by name with fallbackcomponents/otto-kit/src/sound.rs, src/audio/sound_player.rs
TrashRead + write. The home trash ($XDG_DATA_HOME/Trash) and each mounted filesystem’s own can ($topdir/.Trash/$uid or .Trash-$uid), with .trashinfo sidecars for Put Back and directorysizes for folders. A topdir can is used only if it is safe (owned by the user, not a symlink); the rules are in trash.rs’s module docs. The dock watches every can to draw a full bincomponents/otto-kit/src/trash.rs (trashing, cans), components/otto-files/src/model.rs (listing, restore, delete), src/workspaces/trash.rs (dock)
Thumbnail Managing StandardRead. $XDG_CACHE_HOME/thumbnails/<size>/<md5 of URI>.png, validated by the Thumb::MTime PNG text chunk, honouring failure markers under thumbnails/fail/otto-files/. Otto writes nothing into the cache. Implemented directly, no dependencycomponents/otto-peek/src/thumbcache.rs
AutostartRead. $XDG_CONFIG_DIRS/autostart then $XDG_CONFIG_HOME/autostart, user entries overriding system ones by filename. Gated on xdg_autostart in the configOtto::launch_xdg_autostart in src/input/actions.rs
XDG user directoriesRead. user-dirs.dirs supplies the Files sidebar’s Desktop, Downloads, Documents… places, and the portal’s screenshot foldercomponents/otto-foundations/src/xdg.rs (user_dirs), used by components/otto-files/src/model.rs
Fontconfig (not an XDG spec)Read. Family lookup, aliases and the user’s fonts.conf; rendering preferences per family. How it is applied and what Otto publishes to other toolkits is Text renderingcomponents/otto-kit/src/text_rendering.rs

D-Bus interfaces

SpecificationRoleImplementation
Desktop NotificationsServer, spec 1.2. org.freedesktop.Notifications: Notify, CloseNotification, ActionInvoked, capabilities body, body-markup, actions, persistence, icon-static, action-icons. Notifications are drawn by the Dynamic Islandcomponents/otto-islands/src/notifications.rs, per-app permission in notification_permission.rs
XDG Desktop PortalBackend. org.freedesktop.impl.portal.{ScreenCast, Settings, Access, Screenshot, FileChooser}, registered in otto.portal. See xdg-desktop-portal-otto; the Settings keys are in Color Schemecomponents/xdg-desktop-portal-otto/src/portal/
XDG portal PermissionStoreClient. Remembered screencast and notification choicescomponents/xdg-desktop-portal-otto/src/portal/remembered.rs
StatusNotifierItem / StatusNotifierWatcherHost. The top bar’s system tray registers as the watcher and tracks itemscomponents/otto-bar/src/tray.rs
DBusMenuClient: menus for tray items that expose no ContextMenu method. Server: an otto-kit app’s menu bar, and otto-rdp’s indicatorcomponents/otto-bar/src/dbusmenu.rs, components/otto-kit/src/app_menu.rs, components/otto-rdp/src/indicator.rs
Global menu: com.canonical.AppMenu.RegistrarServer. The top bar shows the focused app’s exported menucomponents/otto-bar/src/appmenu.rs; Qt’s equivalent is a Wayland protocol, see Wayland Protocols
MPRISClient. Media keys and the Dynamic Island’s playersrc/audio/media_control.rs, components/otto-islands/src/mpris.rs
AT-SPI, org.freedesktop.a11yServer. Chrome and otto-kit apps are AT-SPI apps through AccessKit; the compositor serves KeyboardMonitor and PointerLocatorsrc/a11y/, components/otto-kit/src/accessibility/

System services

ServiceRoleImplementation
systemd-logindClient. Lock, PrepareForSleep with a delay inhibitor, power actions; seat access through libseatsrc/lock.rs, components/otto-dbus/src/login1.rs
UPower, power-profiles-daemonClient. Battery and power mode in the top barcomponents/otto-dbus/src/upower.rs, components/otto-bar/src/power.rs
polkitAuthentication agent (libpolkit-agent-1), supervised by the compositor; the compositor is also an Authority clientcomponents/otto-authorize/src/polkit/, src/polkit_agent.rs, src/settings_service.rs
AccountsServiceClient. Name, picture and passwordcomponents/otto-settings/src/panes/account.rs, components/otto-auth-ui/src/user.rs
greetdClient. The login greetercomponents/otto-greeter/src/greetd.rs
PipeWireProducer (screencast streams) and client (volume, visualiser, RDP capture)src/screenshare/pipewire_stream.rs, src/audio/volume.rs
LocalSearch (Tracker 3)Client over SPARQL; the compositor sets its miner’s GSettingscomponents/otto-search/, src/search_index.rs

Known gaps