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-5177GitHub issuePublicFixed

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

Decided: Out of scope — decided by agents · verified 2 days ago.

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

Multi-monitor: screensaver self-dismisses when the launcher moves focus to a monitor that already has a windowrevision 1 · captured 2026-10-06 18:40 UTC via poll

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):

--- 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; }; 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.

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