Skip to content

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

Open

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

  1. LuisPicoES commented on Sep 13, 2026

    @LuisPicoES

    I can reproduce this on Ubuntu 24.04 with GNOME Shell 46.0 on X11.

    Environment:

    • Ubuntu 24.04
    • GNOME Shell 46
    • X11
    • ubuntu-appindicators@ubuntu.com 58-1ubuntu24.04.1
    • Docker Desktop 4.90.0

    The AppIndicator extension is enabled and the StatusNotifierWatcher is registered normally. Docker does create org.freedesktop.StatusNotifierItem-<PID>-1, but it does not appear in RegisteredStatusNotifierItems.

    The symptom is exactly as described here: no Docker tray icon, with the three-dot placeholder appearing briefly on some launches.

    I can also reproduce the org.freedesktop.DBus.Error.Failed: error occurred in Get behaviour when accessing /StatusNotifierItem through the unique bus name, while the same property access through the well-known name succeeds.

    Interestingly, ChatGPT's Electron-based tray icon works normally on the same system, so the AppIndicator host itself appears to be functioning.

    This appears to be a useful reproduction on Ubuntu 24.04/GNOME 46/X11 in addition to the newer Ubuntu 26.04/Wayland reports.

  2. 0Ky commented on Sep 14, 2026

    @0Ky

    Related to issue #661. It looks like an upstream problem that was suppose to be fixed in electron/electron#53215. Docker Desktop Version 4.91.0 (239619) is bundled with Electron 43.4.0, the fix is in Electron v43.5.0.

  3. LuisPicoES commented on Sep 22, 2026

    @LuisPicoES

    Updated to Docker Desktop v4.92.0. Issue is still there, so the underlying issue has not been resolved.

  4. 0Ky commented on Sep 22, 2026

    @0Ky

    @LuisPicoES The fix will come when Docker decides to update the bundled Electron to version ≥ 43.5.0. The updated Docker Desktop v4.92.0 is still shipping with Chrome/150.0.7871.224 Electron/43.4.0, an old version of Electron that was released in 12 August, 2026.

  5. LuisPicoES commented on Sep 23, 2026

    @LuisPicoES

    @0Ky Yes, I guess that the fix will come when the developers bump the bundled Electron/Chrome. Interesting what they say here. I have been reading about this topic because it affects several apps (Docker, Obsidian, Goose, LM Studio(?)<---not entirely sure about this one, it's been broken for a long time), but not others (AnyDesk, Claude, ChatGPT or Livepatch).

    • Electron <43.3.0 (Claude Desktop, likely ChatGPT if it's on an older build) → unaffected, predates the bug
    • Electron 43.3.0–43.4.x (Docker Desktop, Obsidian, likely Goose and LM Studio) → broken, caught in the regression window
    • Electron ≥43.5.0 or ≥44.1.0 → fixed again, once apps update past it
    • Non-Electron apps entirely (AnyDesk/Qt, LivePatch/native GTK) → never in scope at all
  6. haisher commented on Sep 30, 2026

    @haisher

    Hit this too, on Debian 13 (GNOME Shell 48.7, gnome-shell-extension-appindicator 59-4, Docker Desktop 4.93.0). Tray shows the three dots for a second, then the icon disappears. gnome-shell logs error occurred in Get from appIndicator.js.

    I dug through the extension and there are actually two places where it trips over Electron, not one:

    1. RegisterStatusNotifierItem resolves the well-known name to a unique name, and every property read after that fails. This is the one already described above.
    2. Even with that fixed, the icon still ended up hidden. The proxy's initial GetAll also goes to the unique name owner (that's how GDBusProxy works for well-known names), so it fails silently. The extension sets Status to PASSIVE before init and relies on that GetAll to overwrite it. It never does, so the item is "ready" but permanently PASSIVE. Id and Menu come through because they get refreshed separately via the well-known name.

    Quick check that it's the unique-name thing: Get on org.freedesktop.StatusNotifierItem-<pid>-1 works, same call on the :1.xxx name fails.

    Workaround that works for me (icon and menu both fine). Copy the extension to ~/.local/share/gnome-shell/extensions/ so you don't touch the packaged one, then patch two files.

    statusNotifierWatcher.js:

             } else if (service.match(Util.BUS_ADDRESS_REGEX)) {
    -            try {
    -                busName = await Util.getUniqueBusName(invocation.get_connection(),
    -                    service, this._cancellable);
    -            } catch (e) {
    -                logError(e);
    -            }
    +            busName = service;
                 objPath = DEFAULT_ITEM_OBJECT_PATH;

    appIndicator.js, in _setupProxy():

                 await this._proxy.initAsync(cancellable);
    +            // reload everything via the well-known name, the proxy's own
    +            // GetAll goes to the unique name and fails
    +            try {
    +                await this._proxy.refreshAllProperties();
    +            } catch (e) {
    +                if (e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED))
    +                    throw e;
    +            }
                 this._checkIfReady();

    Then log out and back in (Wayland needs it, and the shell caches the module, so toggling the extension isn't enough).

    Not a proper fix, since it just works around Electron only answering on the well-known name. Whichever side ends up changing, I'd guess Docker Desktop's tray should answer on both names, like other SNI implementations do. Happy to test anything.

  7. transferred this issue fromdocker/for-linuxon Oct 9, 2026
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