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.
Screensaver doesn't wake on bare Ctrl tap or mouse click (only real keystrokes)
Reported by victoralekseev5597 · filed Sep 7, 2026Closed upstream on 2026-09-21 by bjarneo via an automated message, as a duplicate of #7762 (R-1580). GitHub close reason: completed.
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
What's happening
The screensaver (omarchy-screensaver) only wakes on an actual printable keystroke. A bare Ctrl tap and mouse clicks/movement don't wake it.
Root cause
omarchy-screensaver's exit loop only reacts to a byte read from the terminal's stdin:
while pgrep -t "${tty#/dev/}" -x ttfx >/dev/null; do
if read -n1 -t 1 || ! screensaver_in_focus; then
exit_screensaver
fi
doneCtrlalone never sends a byte at the tty level (it's a modifier with no keysym of its own), soread -n1never returns for it.- Mouse clicks aren't tty input at all, so they're invisible to this loop.
screensaver_in_focusdoesn't help either, since the screensaver is fullscreen with nothing else to focus by clicking.
Separately, plugins/services/idle/Service.qml's handleActiveSignal() explicitly ignores Wayland-level idle-notify activity while the screensaver window exists:
function handleActiveSignal() {
if (root.screensaverStartedThisCycle && (root.screensaverWindowCount > 0 || ...)) {
logEvent("idle-monitor-active", "screensaver cycle remains armed")
return // activity signal dropped on the floor
}
cancelIdleCycle("activity")
}(That's deliberate — launching the screensaver window itself trips idle-notify, and this avoids a self-close-on-launch loop. But the side effect is that all compositor-level activity, including real mouse/keyboard activity, is swallowed for as long as the window is up.)
Known history
I found in the v3.3.0 changelog that mouse-to-wake existed before and was intentionally removed:
"Fix screensaver not working when using bluetooth mice by, unfortunately, having to remove mouse-to-wake" — v3.3.0
So I'm not proposing to blindly re-add global mouse-to-wake. Two separable, smaller fixes:
1. Bare Ctrl tap — unrelated to the Bluetooth-mouse history (it's a keyboard modifier key, not mouse input at all). I added this locally as a Hyprland Lua bind on Control_L/Control_R (release-triggered, so it doesn't fire mid-combo) that sends the screensaver process the same SIGHUP its own exit_screensaver trap already handles. Zero risk of the BT-mouse regression since no mouse code path is touched.
2. Scoped mouse-click wake — instead of a global idle-notify/mouse-motion listener (which is presumably what broke for Bluetooth mice, if the issue was event delivery reliability/latency from BT devices at the libinput layer), I scoped it narrowly: a Hyprland mouse:272/273/274 click bind that only exists while an org.omarchy.screensaver window is open, added on window.open and removed on window.close/window.destroy (mirrors the existing selection-layer bind pattern in bindings/utilities.lua). This still depends on the click event reaching Hyprland at all, so if the original bug was "BT mouse clicks/motion don't reach the compositor promptly," this narrower version could hit the same wall — flagging that honestly rather than claiming it's a guaranteed fix. But it's worth reconsidering given it only intercepts clicks (not raw motion) and only while the screensaver is already up, which is a smaller surface than whatever the original implementation did.
Repro
- Let the screensaver kick in (or
omarchy-launch-screensaver force). - Tap
Ctrlalone, or click the mouse. Screensaver stays up. - Type any character. Screensaver closes.
Suggested fix
Happy to open a PR with the two pieces above (tested locally, working) if useful — or if there's a reason mouse-click-only (vs. motion) still isn't safe for BT mice, I'd like to understand that constraint before proposing the mouse half further.
View raw text
### What's happening
The screensaver (`omarchy-screensaver`) only wakes on an actual printable keystroke. A bare `Ctrl` tap and mouse clicks/movement don't wake it.
### Root cause
`omarchy-screensaver`'s exit loop only reacts to a byte read from the terminal's stdin:
```bash
while pgrep -t "${tty#/dev/}" -x ttfx >/dev/null; do
if read -n1 -t 1 || ! screensaver_in_focus; then
exit_screensaver
fi
done
```
- `Ctrl` alone never sends a byte at the tty level (it's a modifier with no keysym of its own), so `read -n1` never returns for it.
- Mouse clicks aren't tty input at all, so they're invisible to this loop. `screensaver_in_focus` doesn't help either, since the screensaver is fullscreen with nothing else to focus by clicking.
Separately, `plugins/services/idle/Service.qml`'s `handleActiveSignal()` explicitly *ignores* Wayland-level idle-notify activity while the screensaver window exists:
```js
function handleActiveSignal() {
if (root.screensaverStartedThisCycle && (root.screensaverWindowCount > 0 || ...)) {
logEvent("idle-monitor-active", "screensaver cycle remains armed")
return // activity signal dropped on the floor
}
cancelIdleCycle("activity")
}
```
(That's deliberate — launching the screensaver window itself trips idle-notify, and this avoids a self-close-on-launch loop. But the side effect is that *all* compositor-level activity, including real mouse/keyboard activity, is swallowed for as long as the window is up.)
### Known history
I found in the v3.3.0 changelog that mouse-to-wake existed before and was intentionally removed:
> "Fix screensaver not working when using bluetooth mice by, unfortunately, having to remove mouse-to-wake" — v3.3.0
So I'm not proposing to blindly re-add global mouse-to-wake. Two separable, smaller fixes:
**1. Bare Ctrl tap** — unrelated to the Bluetooth-mouse history (it's a keyboard modifier key, not mouse input at all). I added this locally as a Hyprland Lua bind on `Control_L`/`Control_R` (release-triggered, so it doesn't fire mid-combo) that sends the screensaver process the same `SIGHUP` its own `exit_screensaver` trap already handles. Zero risk of the BT-mouse regression since no mouse code path is touched.
**2. Scoped mouse-click wake** — instead of a global idle-notify/mouse-motion listener (which is presumably what broke for Bluetooth mice, if the issue was event delivery reliability/latency from BT devices at the libinput layer), I scoped it narrowly: a Hyprland `mouse:272/273/274` click bind that only exists while an `org.omarchy.screensaver` window is open, added on `window.open` and removed on `window.close`/`window.destroy` (mirrors the existing selection-layer bind pattern in `bindings/utilities.lua`). This still depends on the click event reaching Hyprland at all, so if the original bug was "BT mouse clicks/motion don't reach the compositor promptly," this narrower version could hit the same wall — flagging that honestly rather than claiming it's a guaranteed fix. But it's worth reconsidering given it only intercepts clicks (not raw motion) and only while the screensaver is already up, which is a smaller surface than whatever the original implementation did.
### Repro
1. Let the screensaver kick in (or `omarchy-launch-screensaver force`).
2. Tap `Ctrl` alone, or click the mouse. Screensaver stays up.
3. Type any character. Screensaver closes.
### Suggested fix
Happy to open a PR with the two pieces above (tested locally, working) if useful — or if there's a reason mouse-click-only (vs. motion) still isn't safe for BT mice, I'd like to understand that constraint before proposing the mouse half further.
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.