Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.

Inbox
ReportR-4948GitHub issuePublicReceived

System Tray / Bar Click Areas Become Misaligned After Tray Model Changes

Reported by Rambo176 · filed Sep 7, 2026Closed upstream on 2026-09-20 by bjarneo via an automated message, as a duplicate of #10030 (R-1008). GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked yet.

At a glance

1 · What is claimed?
Only the report text below — no validator has restated it as checkable claims yet.
2 · What does it affect?
Not yet mapped to any requirement or component.
3 · Is it reproducible?
No validation has been run yet.
4 · What remains unclear?
  • Not validated yet: no claims, no reproducer.
5 · What happens next?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.

Original report

System Tray / Bar Click Areas Become Misaligned After Tray Model Changesrevision 1 · captured 2026-10-04 12:10 UTC via poll

System details

Ryzen 5600x with 3060ti and 32 gb of ram

What's wrong?

There appears to be a race condition in the Omarchy bar's System Tray handling that can cause some right-side bar widgets to have incorrect click/hit areas.

The visual position of the widgets remains correct, but their effective clickable area can shift toward the absolute top edge of the screen. As a result, clicking directly on the visible widget may not work.

The issue can affect:

  • System Tray
  • Dropbox
  • Tailscale
  • Agents
  • Audio / Speaker

Interestingly, some other right-side widgets such as Network and Monitor can remain clickable normally.

Observed behavior

The problem is intermittent but reproducible during System Tray activity.

Examples of behavior observed:

  1. After the issue appears, clicking a visible Tray/Dropbox/Tailscale/Agents/Audio widget may not trigger it.
  2. Moving the mouse to the absolute top edge can make the click register.
  3. Right-clicking a Telegram or Discord tray icon can immediately restore normal click behavior.
  4. Closing the tray menu does not necessarily reintroduce the problem.
  5. Quitting a tray application can cause the problem to return after a short delay.
  6. Restarting/reloading the Omarchy shell fixes the issue.
  7. Changing the bar position also temporarily fixes the issue.
  8. Telegram and Discord tray menus can sometimes appear as a blank popup (popup frame visible but menu entries missing).

Environment

  • Omarchy: 4.0.2-1
  • Hyprland: 0.56.2
  • Quickshell: current Omarchy-provided version
  • Wayland
  • Single monitor
  • 1920x1080 @ 144 Hz
  • NVIDIA RTX 3060

Source-code investigation

A detailed source-code investigation was performed using OpenCode.

The relevant path appears to be:

SystemTray.items
    ↓
Tray.qml Repeater/model changes
    ↓
Tray implicitWidth changes
    ↓
RightModules Row relayout
    ↓
ModuleSlot geometry changes
    ↓
moduleClickTargetAt()
    ↓
slot.mapToItem(...)
    ↓
incorrect effective click target

The relevant source locations identified during the investigation include:

Tray.qml:167-181 — SystemTray model/bucketing
Tray.qml:286-310 — Tray Repeaters
Tray.qml:215-216 — Tray implicit width
Bar.qml:1134-1138 — RightModules Row
Bar.qml:1543-1584 — ModuleSlot geometry
Bar.qml:762-782 — click target calculation

The investigation also found that tray menu opening currently does this:

resetTrayMenu()
activeTrayItem = item
activeTrayAnchor = anchorItem
trayMenuOpen = true

while the menu model is obtained asynchronously through:

activeTrayItem.menu
    ↓
QsMenuOpener
    ↓
QsMenuOpener.children
    ↓
Repeater

Relevant locations:

Tray.qml:516-519 — trayMenuOpener.menu
Tray.qml:50-52 — currentChildren
Tray.qml:644 — menu Repeater
Tray.qml:117-132 — openTrayMenu()

This means the popup can become visible while QsMenuOpener.children is still being populated.

Suspected root cause

The strongest current explanation is a QML model/layout lifecycle race involving the System Tray and tray menu popup.

During dynamic tray model changes, Tray Repeaters can be regenerating while the right-side bar Row is being laid out.

At the same time, openTrayMenu() can make the popup visible before the asynchronous DBus menu model has finished populating.

This can result in:

Tray model transition
Repeater regeneration
Right-side Row relayout
Popup becoming visible
Additional QML polish/layout work
Temporary/inconsistent geometry
Incorrect click-target mapping

The blank Telegram/Discord menu appears to be another manifestation of the same lifecycle race: the menu Repeater can initially receive an empty QsMenuOpener.children model.

Important clarification

The source-code relationship is strongly established, but the exact runtime transition of the internal PanelWindow/QWindow input mask could not be directly inspected because the running Quickshell instance was not started with the QML debugger.

Therefore:

The QML model/layout race is strongly supported by source analysis.
The exact internal hit-region/mask transition is not directly runtime-proven.
The observed user-facing behavior strongly correlates with the source-code lifecycle described above.
Proposed minimal fix

A minimal fix would be to defer opening the tray popup until QsMenuOpener.children has been populated.

Conceptually:

activeTrayItem = item
activeTrayAnchor = anchorItem

function tryOpen() {
    if (trayMenuOpener.children &&
        trayMenuOpener.children.count > 0) {
        trayMenuOpen = true
    } else if (trayMenuOpener.menu) {
        trayMenuOpener.childrenChanged.connect(
            tryOpen,
            Qt.SingleShotConnection
        )
    }
}

tryOpen()

This should allow the menu Repeater to receive a populated model before the popup becomes visible and avoid triggering popup-related layout/polish while the model is still transitioning.

Why this may address both symptoms

Blank menu:

DBus menu
    ↓
QsMenuOpener.children populated
    ↓
Repeater receives populated model
    ↓
menu delegates render

Bar click-area issue:

Tray model settles
    ↓
right-side Row finishes layout
    ↓
popup opens
    ↓
layout/polish occurs on stable geometry
Requested fix / investigation

Please investigate and fix this race condition in the official Omarchy bar implementation.

Ideally the fix should:

prevent blank System Tray menus;
keep bar widget hit areas aligned with their visual positions;
handle asynchronous DBus menu population safely;
preserve submenu behavior;
avoid modifying unrelated bar widgets;
avoid introducing blocking waits or event-loop stalls;
remain compatible with future Omarchy updates.

A minimal fix in Tray.qml appears preferable to changing Quickshell core or the general bar hit-testing system.

Reproduction

The issue can generally be reproduced by repeatedly adding/removing or interacting with tray applications such as Telegram/Discord and then testing the right-side bar widgets.

Useful observations:

Bug active
    ↓
Right-click Telegram/Discord tray icon
    ↓
bar click areas immediately recover

and:

Bug active
    ↓
Quit tray application
    ↓
bug may return after a short delay

The tray menu may also occasionally appear as a blank popup.

Additional note

The Agent widget appears to be an affected sibling rather than the cause. It does not use the System Tray/DBusMenu path and is simply positioned in the same right-side Row.
View raw text
### System details

Ryzen 5600x with 3060ti and 32 gb of ram 

### What's wrong?

There appears to be a race condition in the Omarchy bar's System Tray handling that can cause some right-side bar widgets to have incorrect click/hit areas.

The visual position of the widgets remains correct, but their effective clickable area can shift toward the absolute top edge of the screen. As a result, clicking directly on the visible widget may not work.

The issue can affect:

- System Tray
- Dropbox
- Tailscale
- Agents
- Audio / Speaker

Interestingly, some other right-side widgets such as Network and Monitor can remain clickable normally.

### Observed behavior

The problem is intermittent but reproducible during System Tray activity.

Examples of behavior observed:

1. After the issue appears, clicking a visible Tray/Dropbox/Tailscale/Agents/Audio widget may not trigger it.
2. Moving the mouse to the absolute top edge can make the click register.
3. Right-clicking a Telegram or Discord tray icon can immediately restore normal click behavior.
4. Closing the tray menu does not necessarily reintroduce the problem.
5. Quitting a tray application can cause the problem to return after a short delay.
6. Restarting/reloading the Omarchy shell fixes the issue.
7. Changing the bar position also temporarily fixes the issue.
8. Telegram and Discord tray menus can sometimes appear as a blank popup (popup frame visible but menu entries missing).

### Environment

- Omarchy: 4.0.2-1
- Hyprland: 0.56.2
- Quickshell: current Omarchy-provided version
- Wayland
- Single monitor
- 1920x1080 @ 144 Hz
- NVIDIA RTX 3060

### Source-code investigation

A detailed source-code investigation was performed using OpenCode.

The relevant path appears to be:

```text
SystemTray.items
    ↓
Tray.qml Repeater/model changes
    ↓
Tray implicitWidth changes
    ↓
RightModules Row relayout
    ↓
ModuleSlot geometry changes
    ↓
moduleClickTargetAt()
    ↓
slot.mapToItem(...)
    ↓
incorrect effective click target

The relevant source locations identified during the investigation include:

Tray.qml:167-181 — SystemTray model/bucketing
Tray.qml:286-310 — Tray Repeaters
Tray.qml:215-216 — Tray implicit width
Bar.qml:1134-1138 — RightModules Row
Bar.qml:1543-1584 — ModuleSlot geometry
Bar.qml:762-782 — click target calculation

The investigation also found that tray menu opening currently does this:

resetTrayMenu()
activeTrayItem = item
activeTrayAnchor = anchorItem
trayMenuOpen = true

while the menu model is obtained asynchronously through:

activeTrayItem.menu
    ↓
QsMenuOpener
    ↓
QsMenuOpener.children
    ↓
Repeater

Relevant locations:

Tray.qml:516-519 — trayMenuOpener.menu
Tray.qml:50-52 — currentChildren
Tray.qml:644 — menu Repeater
Tray.qml:117-132 — openTrayMenu()

This means the popup can become visible while QsMenuOpener.children is still being populated.

Suspected root cause

The strongest current explanation is a QML model/layout lifecycle race involving the System Tray and tray menu popup.

During dynamic tray model changes, Tray Repeaters can be regenerating while the right-side bar Row is being laid out.

At the same time, openTrayMenu() can make the popup visible before the asynchronous DBus menu model has finished populating.

This can result in:

Tray model transition
Repeater regeneration
Right-side Row relayout
Popup becoming visible
Additional QML polish/layout work
Temporary/inconsistent geometry
Incorrect click-target mapping

The blank Telegram/Discord menu appears to be another manifestation of the same lifecycle race: the menu Repeater can initially receive an empty QsMenuOpener.children model.

Important clarification

The source-code relationship is strongly established, but the exact runtime transition of the internal PanelWindow/QWindow input mask could not be directly inspected because the running Quickshell instance was not started with the QML debugger.

Therefore:

The QML model/layout race is strongly supported by source analysis.
The exact internal hit-region/mask transition is not directly runtime-proven.
The observed user-facing behavior strongly correlates with the source-code lifecycle described above.
Proposed minimal fix

A minimal fix would be to defer opening the tray popup until QsMenuOpener.children has been populated.

Conceptually:

activeTrayItem = item
activeTrayAnchor = anchorItem

function tryOpen() {
    if (trayMenuOpener.children &&
        trayMenuOpener.children.count > 0) {
        trayMenuOpen = true
    } else if (trayMenuOpener.menu) {
        trayMenuOpener.childrenChanged.connect(
            tryOpen,
            Qt.SingleShotConnection
        )
    }
}

tryOpen()

This should allow the menu Repeater to receive a populated model before the popup becomes visible and avoid triggering popup-related layout/polish while the model is still transitioning.

Why this may address both symptoms

Blank menu:

DBus menu
    ↓
QsMenuOpener.children populated
    ↓
Repeater receives populated model
    ↓
menu delegates render

Bar click-area issue:

Tray model settles
    ↓
right-side Row finishes layout
    ↓
popup opens
    ↓
layout/polish occurs on stable geometry
Requested fix / investigation

Please investigate and fix this race condition in the official Omarchy bar implementation.

Ideally the fix should:

prevent blank System Tray menus;
keep bar widget hit areas aligned with their visual positions;
handle asynchronous DBus menu population safely;
preserve submenu behavior;
avoid modifying unrelated bar widgets;
avoid introducing blocking waits or event-loop stalls;
remain compatible with future Omarchy updates.

A minimal fix in Tray.qml appears preferable to changing Quickshell core or the general bar hit-testing system.

Reproduction

The issue can generally be reproduced by repeatedly adding/removing or interacting with tray applications such as Telegram/Discord and then testing the right-side bar widgets.

Useful observations:

Bug active
    ↓
Right-click Telegram/Discord tray icon
    ↓
bar click areas immediately recover

and:

Bug active
    ↓
Quit tray application
    ↓
bug may return after a short delay

The tray menu may also occasionally appear as a blank popup.

Additional note

The Agent widget appears to be an affected sibling rather than the cause. It does not use the System Tray/DBusMenu path and is simply positioned in the same right-side Row.

Validation

Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.

Linked

Not linked to any known issue, other report or change yet.

Decision

Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.

No decision has been recorded yet.