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.
Multi-monitor: screensaver self-dismisses when the launcher moves focus to a monitor that already has a window
Reported by caspeeey · filed Oct 6, 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
What happened
With more than one monitor, the idle screensaver opens on the first monitors, then all copies quit about 1–2 seconds later. It looks like a brief "flash". It happens when omarchy-launch-screensaver moves focus to a later monitor whose workspace already has a regular window.
The idle service then logs idle-cycle-cancel: screensaver-dismissed, so the cycle restarts and the flash repeats every idle.screensaver seconds while the user isn't touching the keyboard or mouse:
10:01:16 idle-monitor: idle 10:01:18 idle-cycle-cancel: screensaver-dismissed
10:06:24 idle-monitor: idle 10:06:26 idle-cycle-cancel: screensaver-dismissed
10:11:31 idle-monitor: idle 10:11:33 idle-cycle-cancel: screensaver-dismissed
... (every ~5 min, idle.screensaver=300)Expected
The screensaver opens on every monitor and stays until real keyboard/mouse input.
Steps to reproduce
- Use 3+ monitors, with a normal window (e.g. a terminal) on a monitor that comes after the first one in
hyprctl monitorsorder. - Leave an empty workspace or any window on the earlier monitors.
- Run
omarchy-launch-screensaver forcewhile watching.socket2.sock.
Event capture (eDP-1, DP-1, then DVI-I-2 with a Ghostty window on it, then DVI-I-1 with Firefox):
focusedmon>>eDP-1,4
openwindow>>…,4,org.omarchy.screensaver,Ghostty
activewindow>>org.omarchy.screensaver,Ghostty
focusedmon>>DP-1,1
openwindow>>…,1,org.omarchy.screensaver,Ghostty
activewindow>>org.omarchy.screensaver,Ghostty
focusedmon>>DVI-I-2,3
activewindow>>com.mitchellh.ghostty,omarchy: ~ <- regular window gets focus
closewindow>>… (DP-1 screensaver) <- earlier screensavers self-exit
closewindow>>… (eDP-1 screensaver)
<- DVI-I-2 screensaver never maps
focusedmon>>DVI-I-1,5
activewindow>>firefox,…
openwindow>>…,5,org.omarchy.screensaver,Ghostty
focusedmon>>DVI-I-2,3 <- launcher restores original focus
activewindow>>com.mitchellh.ghostty,omarchy: ~
closewindow>>… (DVI-I-1 screensaver)Root cause
Two scripts interact:
omarchy-launch-screensavermoves focus to each monitor in turn (hypr_focus_monitor "$m"), then waits for that monitor's screensaver window. Between the focus change and the new window mapping, the workspace's existing window becomes the active window.- Every already-running
omarchy-screensaverpollsscreensaver_in_focusonce per second. If it sees that non-screensaver active window, it callsexit_screensaver. That runspkill -f '[o]rg.omarchy.screensaver', which kills all screensaver instances, including the terminal still starting on the monitor being processed.
So the launcher's own focus moves look like a user dismissal. On a single monitor there is only one focus move, which lands before any screensaver exists, so the bug never shows. The final hypr_focus_monitor "$focused" can trigger it too: if the originally focused monitor ended up without a screensaver window, the restored focus lands on a regular window.
Related
- #9713 ("3rd+ monitor misses openwindow deadline"): very likely this same race. The missing window is killed by the
pkillinexit_screensaver; it doesn't time out. - #12225 (self-exits within ~1s): same focus check, different trigger.
- #13475 (PR, 5s focus grace period): would hide most cases. But a grace period measured from each screensaver's own start can still run out while the launcher is working through slow monitors (each
wait_for_screensaver_windowcan take up to 5s, and DisplayLink outputs here are slow). Tying the grace to the launcher itself avoids that.
Suggested fix (tested locally)
The launcher writes a marker while it is moving focus between monitors, and screensavers skip the focus check while the marker exists (with a staleness cap in case the launcher dies):
--- omarchy-launch-screensaver
+LAUNCHING="$XDG_RUNTIME_DIR/omarchy-screensaver-launching"
+touch "$LAUNCHING"
+trap 'rm -f "$LAUNCHING"' EXIT
focused=$(omarchy-hyprland-monitor-focused)
…
hypr_focus_monitor "$focused"
+# Let the final focus change settle before screensavers resume focus checks
+sleep 0.5--- omarchy-screensaver
+launcher_running() {
+ local marker="$XDG_RUNTIME_DIR/omarchy-screensaver-launching"
+ [[ -f $marker ]] && (( $(date +%s) - $(stat -c %Y "$marker") < 20 ))
+}
…
- if read -n1 -t 1 || ! screensaver_in_focus; then
+ if read -n1 -t 1 || { ! launcher_running && ! screensaver_in_focus; }; thenWith this change, the same 4-monitor force run kept all four screensaver windows open, even though focus briefly landed on the Ghostty and Firefox windows during the launch.
System
- Omarchy 4.0.3-1, Hyprland 0.56.2, terminal: Ghostty
- Intel i5-7200U, Intel HD Graphics 620 (i915)
- Monitors: laptop eDP-1, DP-1 through the dock, plus 2× DVI-I outputs on a DisplayLink Plugable TBT-6950PD dock (evdi)
Filed by Claude Opus 5.5 via Claude Code.
View raw text
## What happened
With more than one monitor, the idle screensaver opens on the first monitors, then all copies quit about 1–2 seconds later. It looks like a brief "flash". It happens when `omarchy-launch-screensaver` moves focus to a later monitor whose workspace already has a regular window.
The idle service then logs `idle-cycle-cancel: screensaver-dismissed`, so the cycle restarts and the flash repeats every `idle.screensaver` seconds while the user isn't touching the keyboard or mouse:
```
10:01:16 idle-monitor: idle 10:01:18 idle-cycle-cancel: screensaver-dismissed
10:06:24 idle-monitor: idle 10:06:26 idle-cycle-cancel: screensaver-dismissed
10:11:31 idle-monitor: idle 10:11:33 idle-cycle-cancel: screensaver-dismissed
... (every ~5 min, idle.screensaver=300)
```
## Expected
The screensaver opens on every monitor and stays until real keyboard/mouse input.
## Steps to reproduce
1. Use 3+ monitors, with a normal window (e.g. a terminal) on a monitor that comes *after* the first one in `hyprctl monitors` order.
2. Leave an empty workspace or any window on the earlier monitors.
3. Run `omarchy-launch-screensaver force` while watching `.socket2.sock`.
Event capture (eDP-1, DP-1, then DVI-I-2 with a Ghostty window on it, then DVI-I-1 with Firefox):
```
focusedmon>>eDP-1,4
openwindow>>…,4,org.omarchy.screensaver,Ghostty
activewindow>>org.omarchy.screensaver,Ghostty
focusedmon>>DP-1,1
openwindow>>…,1,org.omarchy.screensaver,Ghostty
activewindow>>org.omarchy.screensaver,Ghostty
focusedmon>>DVI-I-2,3
activewindow>>com.mitchellh.ghostty,omarchy: ~ <- regular window gets focus
closewindow>>… (DP-1 screensaver) <- earlier screensavers self-exit
closewindow>>… (eDP-1 screensaver)
<- DVI-I-2 screensaver never maps
focusedmon>>DVI-I-1,5
activewindow>>firefox,…
openwindow>>…,5,org.omarchy.screensaver,Ghostty
focusedmon>>DVI-I-2,3 <- launcher restores original focus
activewindow>>com.mitchellh.ghostty,omarchy: ~
closewindow>>… (DVI-I-1 screensaver)
```
## Root cause
Two scripts interact:
1. `omarchy-launch-screensaver` moves focus to each monitor in turn (`hypr_focus_monitor "$m"`), then waits for that monitor's screensaver window. Between the focus change and the new window mapping, the workspace's existing window becomes the active window.
2. Every already-running `omarchy-screensaver` polls `screensaver_in_focus` once per second. If it sees that non-screensaver active window, it calls `exit_screensaver`. That runs `pkill -f '[o]rg.omarchy.screensaver'`, which kills **all** screensaver instances, including the terminal still starting on the monitor being processed.
So the launcher's own focus moves look like a user dismissal. On a single monitor there is only one focus move, which lands before any screensaver exists, so the bug never shows. The final `hypr_focus_monitor "$focused"` can trigger it too: if the originally focused monitor ended up without a screensaver window, the restored focus lands on a regular window.
## Related
- #9713 ("3rd+ monitor misses openwindow deadline"): very likely this same race. The missing window is killed by the `pkill` in `exit_screensaver`; it doesn't time out.
- #12225 (self-exits within ~1s): same focus check, different trigger.
- #13475 (PR, 5s focus grace period): would hide most cases. But a grace period measured from each screensaver's own start can still run out while the launcher is working through slow monitors (each `wait_for_screensaver_window` can take up to 5s, and DisplayLink outputs here are slow). Tying the grace to the launcher itself avoids that.
## Suggested fix (tested locally)
The launcher writes a marker while it is moving focus between monitors, and screensavers skip the focus check while the marker exists (with a staleness cap in case the launcher dies):
```diff
--- omarchy-launch-screensaver
+LAUNCHING="$XDG_RUNTIME_DIR/omarchy-screensaver-launching"
+touch "$LAUNCHING"
+trap 'rm -f "$LAUNCHING"' EXIT
focused=$(omarchy-hyprland-monitor-focused)
…
hypr_focus_monitor "$focused"
+# Let the final focus change settle before screensavers resume focus checks
+sleep 0.5
```
```diff
--- omarchy-screensaver
+launcher_running() {
+ local marker="$XDG_RUNTIME_DIR/omarchy-screensaver-launching"
+ [[ -f $marker ]] && (( $(date +%s) - $(stat -c %Y "$marker") < 20 ))
+}
…
- if read -n1 -t 1 || ! screensaver_in_focus; then
+ if read -n1 -t 1 || { ! launcher_running && ! screensaver_in_focus; }; then
```
With this change, the same 4-monitor `force` run kept all four screensaver windows open, even though focus briefly landed on the Ghostty and Firefox windows during the launch.
## System
- Omarchy 4.0.3-1, Hyprland 0.56.2, terminal: Ghostty
- Intel i5-7200U, Intel HD Graphics 620 (i915)
- Monitors: laptop eDP-1, DP-1 through the dock, plus 2× DVI-I outputs on a DisplayLink Plugable TBT-6950PD dock (evdi)
Filed by Claude Opus 5.5 via Claude Code.
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/11746· confirmed
- Related PRpr/12730· confirmed
- Fixed bypr/12808· 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 21:57 UTC