Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA 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.
Tray icon vanishes when an app switches its IconName between symbolic and non-symbolic (fcitx5)
Reported by chiengyn · filed Aug 17, 2026 · open at source
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?
- AreaOutside the audited area· Decided by agents · verified
- 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?
- Decided by agents and verified by a second, independent agent — see the decision.
Original report
System details
HP ZBook Firefly 14 G11, Intel Core Ultra 7 165H, Intel Arc Graphics (Meteor Lake-P), Omarchy 4.0.0, Hyprland 0.56.2, quickshell-git 0.3.0.r20.g28771c7-1, Qt 6.11.1, icon theme Yaru-magenta (yaru-icon-theme 26.04.5.1ubuntu-1), fcitx5 5.1.21-1 + fcitx5-bamboo 1.0.10-1.
What's wrong?
A tray icon permanently disappears from the bar as soon as the app changes its IconName between a -symbolic and a non-symbolic name. The tray slot stays reserved but nothing is drawn.
fcitx5 hits this on every input-method switch, because it alternates between two icon names:
| fcitx5 state | IconName | Rendered? |
|---|---|---|
active (Vietnamese, fcitx5-bamboo) | fcitx_bamboo | yes — red V |
| inactive (English) | input-keyboard-symbolic | no — blank slot |
Expected: both icons render, symbolic ones tinted to the bar foreground.
Before/after capture attached below, showing the bar's right section in both fcitx5 states.
Steps to reproduce
With any tray app that swaps between a symbolic and a non-symbolic icon name (fcitx5 with a non-latin engine is the easy case):
omarchy restart shellwhile the app is showing its symbolic icon → icon renders correctly.- Switch the app so it publishes a non-symbolic icon name (
fcitx5-remote -o) → renders correctly. - Switch back to the symbolic icon name (
fcitx5-remote -c) → icon is gone and stays gone.
A shell restart fixes it only until the next name change, which is what makes it look intermittent.
Two things made this confusing to pin down, worth noting for anyone triaging:
- fcitx5 tracks IM activation per window, so with two monitors the two bars legitimately show different states — it looked like a per-monitor rendering issue.
- Other symbolic tray icons (e.g. Telegram's
org.telegram.desktop-mute-symbolic) are unaffected, because their icon name never changes.
<img width="2000" height="276" alt="Image" src="https://github.com/user-attachments/assets/c9439dd6-0d84-4db9-8f75-705d5922c8e6" />
Root cause
shell/plugins/bar/widgets/Tray.qml, the TrayIcon component. Both properties are bound to symbolic, so they flip together when the icon name changes:
Image {
id: trayIconImage
// ...
visible: !trayIconRoot.symbolic
layer.enabled: trayIconRoot.symbolic
}
MultiEffect {
anchors.fill: trayIconImage
source: trayIconImage
visible: trayIconRoot.symbolic
colorization: 1.0
colorizationColor: root.foreground
}When an item toggles visible and layer.enabled at the same time, the layer never gets populated, so MultiEffect samples an empty texture and the icon silently vanishes. It works on first creation (properties evaluated once, no flip), which is why a restart appears to fix it.
The Image is loaded and fine the entire time it is invisible. Instrumenting onStatusChanged in the widget while the icon was missing from the bar:
[TRAYDBG] source= image://icon/input-keyboard-symbolic symbolic= true
[TRAYDBG] status= 1 (1=Ready,3=Error) src= image://icon/input-keyboard-symbolic symbolic= true implicit= 24x24 sourceSize= 12x12 wh= 12x12So this is not icon resolution. Also ruled out:
input-keyboard-symbolicresolves fine —Quickshell.iconPath(..., true)returns a URL and a standaloneImage { source: "image://icon/input-keyboard-symbolic" }reachesstatus: Ready, under the sameQT_QPA_PLATFORMTHEME=gtk3andYaru-magentathe shell runs with.- The icon exists on disk and is reachable through theme inheritance (
Yaru-magenta→Yaru→scalable/devices/input-keyboard-symbolic.svg, withscalable/devicesdeclared inYaru'sindex.theme). qt6-svgis installed; SVG icons decode.- fcitx5 behaves correctly: registers a
StatusNotifierItem(IdFcitx, StatusActivein both states) and emitsNewIcon+NewToolTipon every change, verified withdbus-monitor.
Distinct from #7203 — that one is an unresolvable icon theme name producing broken-image placeholders. Here the icon resolves and loads; only the render path fails, and the slot is empty rather than showing a placeholder.
Fix that works
Hold visible and layer.enabled constant and toggle colorization instead — colorization: 0 is a pass-through, so non-symbolic icons keep their own colors:
Image {
id: trayIconImage
// ...
visible: false
layer.enabled: true
}
MultiEffect {
anchors.fill: trayIconImage
source: trayIconImage
colorization: trayIconRoot.symbolic ? 1.0 : 0.0
colorizationColor: root.foreground
}Verified by cycling the input method repeatedly after a shell restart: the icon renders in every state, with the non-symbolic fcitx_bamboo keeping its red and the symbolic keyboard tinted to the bar foreground (see the AFTER rows in the capture).
Happy to send this as a PR if the approach looks right.
View raw text
## System details
HP ZBook Firefly 14 G11, Intel Core Ultra 7 165H, Intel Arc Graphics (Meteor Lake-P), **Omarchy 4.0.0**, Hyprland 0.56.2, `quickshell-git 0.3.0.r20.g28771c7-1`, Qt 6.11.1, icon theme `Yaru-magenta` (`yaru-icon-theme 26.04.5.1ubuntu-1`), `fcitx5 5.1.21-1` + `fcitx5-bamboo 1.0.10-1`.
## What's wrong?
A tray icon permanently disappears from the bar as soon as the app changes its `IconName` between a `-symbolic` and a non-symbolic name. The tray slot stays reserved but nothing is drawn.
fcitx5 hits this on every input-method switch, because it alternates between two icon names:
| fcitx5 state | `IconName` | Rendered? |
|---|---|---|
| active (Vietnamese, `fcitx5-bamboo`) | `fcitx_bamboo` | yes — red **V** |
| inactive (English) | `input-keyboard-symbolic` | **no — blank slot** |
Expected: both icons render, symbolic ones tinted to the bar foreground.
Before/after capture attached below, showing the bar's right section in both fcitx5 states.
### Steps to reproduce
With any tray app that swaps between a symbolic and a non-symbolic icon name (fcitx5 with a non-latin engine is the easy case):
1. `omarchy restart shell` while the app is showing its **symbolic** icon → icon renders correctly.
2. Switch the app so it publishes a **non-symbolic** icon name (`fcitx5-remote -o`) → renders correctly.
3. Switch back to the **symbolic** icon name (`fcitx5-remote -c`) → **icon is gone** and stays gone.
A shell restart fixes it only until the next name change, which is what makes it look intermittent.
Two things made this confusing to pin down, worth noting for anyone triaging:
- fcitx5 tracks IM activation **per window**, so with two monitors the two bars legitimately show different states — it looked like a per-monitor rendering issue.
- Other symbolic tray icons (e.g. Telegram's `org.telegram.desktop-mute-symbolic`) are unaffected, because their icon name never changes.
<img width="2000" height="276" alt="Image" src="https://github.com/user-attachments/assets/c9439dd6-0d84-4db9-8f75-705d5922c8e6" />
### Root cause
`shell/plugins/bar/widgets/Tray.qml`, the `TrayIcon` component. Both properties are bound to `symbolic`, so they flip together when the icon name changes:
```qml
Image {
id: trayIconImage
// ...
visible: !trayIconRoot.symbolic
layer.enabled: trayIconRoot.symbolic
}
MultiEffect {
anchors.fill: trayIconImage
source: trayIconImage
visible: trayIconRoot.symbolic
colorization: 1.0
colorizationColor: root.foreground
}
```
When an item toggles `visible` and `layer.enabled` at the same time, the layer never gets populated, so `MultiEffect` samples an empty texture and the icon silently vanishes. It works on first creation (properties evaluated once, no flip), which is why a restart appears to fix it.
The `Image` is loaded and fine the entire time it is invisible. Instrumenting `onStatusChanged` in the widget while the icon was missing from the bar:
```
[TRAYDBG] source= image://icon/input-keyboard-symbolic symbolic= true
[TRAYDBG] status= 1 (1=Ready,3=Error) src= image://icon/input-keyboard-symbolic symbolic= true implicit= 24x24 sourceSize= 12x12 wh= 12x12
```
So this is not icon resolution. Also ruled out:
- `input-keyboard-symbolic` resolves fine — `Quickshell.iconPath(..., true)` returns a URL and a standalone `Image { source: "image://icon/input-keyboard-symbolic" }` reaches `status: Ready`, under the same `QT_QPA_PLATFORMTHEME=gtk3` and `Yaru-magenta` the shell runs with.
- The icon exists on disk and is reachable through theme inheritance (`Yaru-magenta` → `Yaru` → `scalable/devices/input-keyboard-symbolic.svg`, with `scalable/devices` declared in `Yaru`'s `index.theme`).
- `qt6-svg` is installed; SVG icons decode.
- fcitx5 behaves correctly: registers a `StatusNotifierItem` (Id `Fcitx`, Status `Active` in both states) and emits `NewIcon` + `NewToolTip` on every change, verified with `dbus-monitor`.
Distinct from #7203 — that one is an unresolvable icon **theme name** producing broken-image placeholders. Here the icon resolves and loads; only the render path fails, and the slot is empty rather than showing a placeholder.
### Fix that works
Hold `visible` and `layer.enabled` constant and toggle colorization instead — `colorization: 0` is a pass-through, so non-symbolic icons keep their own colors:
```qml
Image {
id: trayIconImage
// ...
visible: false
layer.enabled: true
}
MultiEffect {
anchors.fill: trayIconImage
source: trayIconImage
colorization: trayIconRoot.symbolic ? 1.0 : 0.0
colorizationColor: root.foreground
}
```
Verified by cycling the input method repeatedly after a shell restart: the icon renders in every state, with the non-symbolic `fcitx_bamboo` keeping its red and the symbolic keyboard tinted to the bar foreground (see the AFTER rows in the capture).
Happy to send this as a PR if the approach looks right.
- c9439dd6-0d84-4db9-8f75-705d5922c8e6
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
- Related PRpr/14661· confirmed
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.
- Out of scopeDecided by agents · verified · 2026-10-09 04:36 UTC