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

Open Beginner friendly
#960 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
2/5
Estimated time
1-3 hours
Newbie friendliness
85/100
Issue type
Bug
Clarity
Clearly specified
Activity status
Active
Tech stack
cpp
Domain
desktop

Research direction

Start in src/qt/bitcoingui.cpp at BitcoinGUI::changeEvent(), where minimize-to-tray handling hides the window. Check how QSystemTrayIcon::isSystemTrayAvailable() relates to the existing tray-icon creation guard. Done means the minimize-to-tray path no longer loops when no system tray exists, while tray behavior remains available when one exists.

Written by the indexing model from the issue text.

Description

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)

  • bitcoin/bitcoin#788 (2012, xmonad window flicker — same symptom family, ancient, closed)
  • bitcoin/bitcoin#3789 (2014, -min + no tray → orphaned window; the "hide" half without the loop)
  • bitcoin-core/gui#903 / #904 / #914 (2025, Qt6-native-Wayland flicker via bringToFront() — different mechanism; this box runs Qt5/XWayland)
  • bitcoin-core/gui#405 (window disappears on Cinnamon)
  • bitcoin-core/gui#748/#749 (-min vs. wallet loading dialog)
Dominant language
C++
Stars
742
Forks
371
PR merge metrics
No merged PRs in 30d

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from bitcoin-core/gui

All issues in bitcoin-core/gui

Similar issues

More C++ issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.