Skip to content

Window hide/show loop (~60 Hz) when "Minimize to the tray" is enabled but no system tray exists (GNOME Wayland), breaks alt-tab session-wide #960

Description

@Giszmo

bitcoin-qt v29.0, started with -min and with "Minimize to the tray instead of the taskbar" enabled, on a desktop with no system tray (stock GNOME 48, Wayland, no AppIndicator extension), enters a loop where its window is destroyed and re-created continuously at about 60Hz window-created events.

Environment

  • Bitcoin Core v29.0 (official binaries, /home/leo/bitcoin/bitcoin-29.0/bin/bitcoin-qt -min -chain=main)
  • Debian 13 (trixie), GNOME Shell 48 on Wayland; bitcoin-qt runs via XWayland
  • No system tray: stock GNOME, no AppIndicator/StatusNotifier extension installed

Symptoms

  • A generic (icon-less) entry flickers in the alt-tab switcher / dock.
  • Every re-map re-enters the window as "most recent" in the alt-tab order and can steal focus at the moment of switching: alt-tab and overview clicks fail ~30% of the time for every application on the desktop, not just bitcoin-qt.
  • gnome-shell burns CPU constantly from the restacking (42% of one core sustained; 4+ days of CPU time accumulated over 9 days of uptime).
  • The user-visible damage started after updating to Debian Trixie (GNOME 43 to 48 probably marked the AppIndicator extension incompatible and switch it off) which removed the tray. It persisted for days; no crash-looping process exists, so ps looks clean. Only shell-level instrumentation identified the culprit.

Diagnosis

GNOME Shell hook:

global.display.connect('window-created', (d, w) =>
  log('FLICK pid=' + w.get_pid() + ' class=' + w.get_wm_class() + ' title=' + w.get_title()));

Output (repeating ~60x/second):

Aug 21 19:49:45 debian gnome-shell[3296]: FLICK pid=3475 class=Bitcoin-Qt title=Bitcoin Core type=0

pid 3475 = the bitcoin-qt process above.

In v29 src/qt/bitcoingui.cpp, BitcoinGUI::changeEvent() hides the window on minimize whenever getMinimizeToTray() is set. The option is honored even when QSystemTrayIcon::isSystemTrayAvailable() is false (that check only guards tray-icon creation). With no tray to land in, the hide/re-show cycle repeats indefinitely on this setup.

Workaround

Disable minimize to tray in the config file. In the options window it's grayed out.

Suggested fix direction

Gate the minimize-to-tray hide path on QSystemTrayIcon::isSystemTrayAvailable() (as PR bitcoin/bitcoin#691 once did for the -min startup phase), or force-disable the option at runtime when no tray exists.

Prior reports checked (none match)

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