Skip to content

Tray icon never appears on GNOME: SNI properties are refused when the object is addressed by its unique bus name #1568

Description

@pashcock

Tray icon never appears on GNOME: SNI properties are refused when the object is addressed by its unique bus name

Summary

On Ubuntu 26.04.1 with GNOME Shell 50.1 (Wayland), Docker Desktop registers a
StatusNotifierItem, but no tray icon is drawn — only an empty placeholder. The
cause is that the D-Bus object at /StatusNotifierItem answers a
org.freedesktop.DBus.Properties.Get call only when the message destination is
the well-known name org.freedesktop.StatusNotifierItem-<pid>-1. When the same
object is addressed by the unique connection name that currently owns that
well-known name, every Get fails with
org.freedesktop.DBus.Error.Failed: error occurred in Get.

GNOME's ubuntu-appindicators extension resolves the well-known name to the
unique name before building its proxy, so every property read fails and the
indicator is never constructed.

Under D-Bus routing, the two forms of address reach the same connection and the
same object, so both should behave identically. This looks like a defect in the
bundled Chromium/Electron StatusNotifierItem implementation rather than in the
shell extension.

Environment

Component Version
Docker Desktop 4.90.0-238679 (binary dated 2026-09-04)
Bundled Electron 43.4.0
Bundled Chromium 150.0.7871.224
Docker Engine 29.7.2
OS Ubuntu 26.04.1 LTS (resolute)
Desktop GNOME Shell 50.1, Wayland session
Tray extension ubuntu-appindicators@ubuntu.com, package gnome-shell-ubuntu-extensions 50.26.04.7ubuntu
Kernel 7.0.0-31-generic

The same behaviour was present on this machine before the OS upgrade, under
Ubuntu 24.04.5 with GNOME Shell 46.

Steps to reproduce

  1. Run Docker Desktop on a GNOME session with the ubuntu-appindicators
    extension enabled.
  2. Observe the panel: no whale icon appears. Depending on the extension version
    you get either nothing at all or a placeholder showing three dots with no
    working menu.

Evidence

Docker Desktop does publish the item and reports it as active:

$ busctl --user list --acquired | grep StatusNotifierItem
org.freedesktop.StatusNotifierItem-103439-1    103439 Docker Desktop  ps  :1.127

$ busctl --user call org.freedesktop.DBus /org/freedesktop/DBus \
    org.freedesktop.DBus GetNameOwner s org.freedesktop.StatusNotifierItem-103439-1
s ":1.127"

Reading a property through the well-known name succeeds:

$ busctl --user call org.freedesktop.StatusNotifierItem-103439-1 /StatusNotifierItem \
    org.freedesktop.DBus.Properties Get ss org.kde.StatusNotifierItem Id
v s "Docker Desktop_status_icon_1"

Reading the same property through the unique name that owns it fails:

$ busctl --user call :1.127 /StatusNotifierItem \
    org.freedesktop.DBus.Properties Get ss org.kde.StatusNotifierItem Id
Call failed: error occurred in Get

This affects every property, including Id and Menu, which the extension
treats as mandatory. Separately, IconPixmap fails even through the well-known
name, while the neighbouring OverlayIconPixmap and AttentionIconPixmap
correctly return an empty array — that inconsistency may be worth a look too:

$ busctl --user get-property org.freedesktop.StatusNotifierItem-103439-1 \
    /StatusNotifierItem org.kde.StatusNotifierItem IconPixmap
Failed to get property IconPixmap on interface org.kde.StatusNotifierItem: error occurred in Get

$ busctl --user get-property org.freedesktop.StatusNotifierItem-103439-1 \
    /StatusNotifierItem org.kde.StatusNotifierItem OverlayIconPixmap
a(iiay) 0

What the shell extension logs as a result:

gnome-shell[...]: While initalizing proxy for org.freedesktop.StatusNotifierItem-...-1:
  Gio.DBusError: GDBus.Error:org.freedesktop.DBus.Error.Failed: error occurred in Get
    getProperty@.../ubuntu-appindicators@ubuntu.com/dbusProxy.js:89:33
    refreshProperty@.../appIndicator.js:306:48
    _checkNeededProperties@.../appIndicator.js:505:66
    _setupProxy@.../appIndicator.js:431:24
    _registerItem@.../statusNotifierWatcher.js:95:31
    RegisterStatusNotifierItemAsync@.../statusNotifierWatcher.js:205:24

ubuntu-appindicators@ubuntu.com[...]: org.freedesktop.StatusNotifierItem-...-1,
  Impossible to get basic properties: Gio.DBusError: GDBus.Error:org.freedesktop.DBus.Error...

Docker Desktop's own log also recorded a failed registration attempt on an
earlier run, when the watcher was momentarily unavailable. Chromium calls
RegisterStatusNotifierItem once and never retries:

[2026-09-09T19:41:32Z] ERROR:dbus/object_proxy.cc:590] Failed to call method:
org.kde.StatusNotifierWatcher.RegisterStatusNotifierItem: object_path=/StatusNotifierWatcher:
org.freedesktop.DBus.Error.UnknownMethod: No such method "RegisterStatusNotifierItem"

Workaround

Patching the extension to skip the unique-name resolution makes the icon and its
menu appear immediately. In
/usr/share/gnome-shell/extensions/ubuntu-appindicators@ubuntu.com/statusNotifierWatcher.js,
inside RegisterStatusNotifierItemAsync, replacing

busName = await DBusUtils.getUniqueBusName(invocation.get_connection(),
    service, this._cancellable);

with

busName = service;

resolves it. This is only a local workaround: it is overwritten by package
updates and it papers over the underlying behaviour rather than fixing it.

Suggested fix

Make the StatusNotifierItem object answer Properties.Get regardless of whether
the message destination is the well-known name or the unique connection name,
and return an empty array from IconPixmap when no pixmap is set, matching what
OverlayIconPixmap and AttentionIconPixmap already do. Retrying
RegisterStatusNotifierItem when the watcher appears later would also help, so
that a tray icon is not lost for the lifetime of the process when Docker Desktop
happens to start before the shell's watcher is ready.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions