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.
Bar workspace indicator loses the focused-workspace square after a long lock when the only display goes through FALLBACK (stays lost until shell restart)
Reported by DinMon · filed Oct 8, 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
- Omarchy 4.0.x (reproduced on the Omarchy Mac / Apple Silicon build; the bar's
Workspaces.qmlis identical in omacom/omarchy) - Hyprland 0.56.2
- Quickshell 0.3.1 (Omarchy shell bar)
- Setup: a single active output (an external monitor, with the internal panel disabled)
What's wrong?
After returning from the lock screen following a long lock (hours), the bar still shows workspaces 1 2 3 4 5, but no workspace has the focused square glyph. Every entry shows a plain number. Hyprland itself is fine: hyprctl activeworkspace reports the correct workspace and monitor. Only the shell's state is stale, and it stays that way until omarchy-restart-shell.
Short locks don't trigger it. It happens when the session stays locked long enough for the only active display to drop out (e.g. the monitor goes into standby and disconnects), so Hyprland swaps in its FALLBACK output, and then a real output comes back.
Steps to reproduce
- Run with a single active output.
- Lock the session and leave it until that display disconnects (or unplug it), so no real output is left and Hyprland creates
FALLBACK. - Bring a display back and unlock.
- The bar's workspace indicator shows no focused workspace. Restarting the shell brings it back.
Expected
The focused workspace keeps its square after the output comes back.
Logs
Shell log at the moment the display came back (abridged):
INFO qt.qpa.wayland: There are no outputs - creating placeholder screen
WARN: Layershell screen does not correspond to a real screen. Letting the compositor pick.
WARN quickshell.hyprland.ipc: Got removal for monitor "FALLBACK" which was not previously tracked.There is no Hyprland event socket error in the log, so this is not the dropped-socket2 case from #13216.
Root cause (as far as I can tell)
shell/plugins/bar/widgets/Workspaces.qml:
readonly property bool focused: Hyprland.focusedWorkspace !== null && Hyprland.focusedWorkspace.id === modelDataIn Quickshell 0.3.1 (src/wayland/hyprland/ipc/connection.cpp, same on current master):
- When the focused monitor is removed, onFocusedMonitorDestroyed() sets bFocusedMonitor = nullptr.
- workspacev2 is only applied if (this->bFocusedMonitor != nullptr), so later workspace switches are ignored.
- Only a focusedmon event restores it, and Hyprland doesn't refocus or emit focusedmon when a monitor is added back (see #9209). With a single monitor there's never another focusedmon.
So Hyprland.focusedWorkspace stays null for the life of the shell.
Workaround
omarchy-restart-shell (after unlocking).
Possible fixes
- Merge #9209 (
default/hypr/monitor-focus.lua), which restores focus after the sole monitor round-trips throughFALLBACK. That should produce thefocusedmon/workspacev2events the bar needs. - And/or make the widget resilient: when
Hyprland.focusedWorkspaceis null (or onmonitoraddedv2), callHyprland.refreshMonitors()or fall back toHyprland.monitorFor(screen).activeWorkspacefor the bar's screen. - Upstream in Quickshell: re-derive the focused monitor when the focused monitor is destroyed.
Related
#9153, #9209, #13927, #10187, #10190, #13216, #13165
View raw text
### System details - Omarchy 4.0.x (reproduced on the Omarchy Mac / Apple Silicon build; the bar's `Workspaces.qml` is identical in omacom/omarchy) - Hyprland 0.56.2 - Quickshell 0.3.1 (Omarchy shell bar) - Setup: a single active output (an external monitor, with the internal panel disabled) ### What's wrong? After returning from the lock screen following a long lock (hours), the bar still shows workspaces `1 2 3 4 5`, but no workspace has the focused square glyph. Every entry shows a plain number. Hyprland itself is fine: `hyprctl activeworkspace` reports the correct workspace and monitor. Only the shell's state is stale, and it stays that way until `omarchy-restart-shell`. Short locks don't trigger it. It happens when the session stays locked long enough for the only active display to drop out (e.g. the monitor goes into standby and disconnects), so Hyprland swaps in its `FALLBACK` output, and then a real output comes back. ### Steps to reproduce 1. Run with a single active output. 2. Lock the session and leave it until that display disconnects (or unplug it), so no real output is left and Hyprland creates `FALLBACK`. 3. Bring a display back and unlock. 4. The bar's workspace indicator shows no focused workspace. Restarting the shell brings it back. ### Expected The focused workspace keeps its square after the output comes back. ### Logs Shell log at the moment the display came back (abridged): ``` INFO qt.qpa.wayland: There are no outputs - creating placeholder screen WARN: Layershell screen does not correspond to a real screen. Letting the compositor pick. WARN quickshell.hyprland.ipc: Got removal for monitor "FALLBACK" which was not previously tracked. ``` There is no `Hyprland event socket error` in the log, so this is not the dropped-socket2 case from #13216. ### Root cause (as far as I can tell) `shell/plugins/bar/widgets/Workspaces.qml`: ```qml readonly property bool focused: Hyprland.focusedWorkspace !== null && Hyprland.focusedWorkspace.id === modelData ``` In Quickshell 0.3.1 (`src/wayland/hyprland/ipc/connection.cpp`, same on current master): - When the focused monitor is removed, `onFocusedMonitorDestroyed()` sets `bFocusedMonitor = nullptr`. - `workspacev2` is only applied `if (this->bFocusedMonitor != nullptr)`, so later workspace switches are ignored. - Only a `focusedmon` event restores it, and Hyprland doesn't refocus or emit `focusedmon` when a monitor is added back (see #9209). With a single monitor there's never another `focusedmon`. So `Hyprland.focusedWorkspace` stays `null` for the life of the shell. ### Workaround `omarchy-restart-shell` (after unlocking). ### Possible fixes - Merge #9209 (`default/hypr/monitor-focus.lua`), which restores focus after the sole monitor round-trips through `FALLBACK`. That should produce the `focusedmon`/`workspacev2` events the bar needs. - And/or make the widget resilient: when `Hyprland.focusedWorkspace` is null (or on `monitoraddedv2`), call `Hyprland.refreshMonitors()` or fall back to `Hyprland.monitorFor(screen).activeWorkspace` for the bar's screen. - Upstream in Quickshell: re-derive the focused monitor when the focused monitor is destroyed. ### Related #9153, #9209, #13927, #10187, #10190, #13216, #13165
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.
- Out of scopeDecided by agents · verified · 2026-10-09 22:48 UTC