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.
Numeric keypad types nothing in the polkit dialog, lock screen and launcher (Qt ignores NumLock at startup)
Reported by codingseb · filed Aug 27, 2026 · open at source
R-1755 is the earliest report of this defect — filed Aug 16, 2026, open upstream. This report (filed Aug 27, 2026) describes the same defect, so it is folded under it in the inbox.
Decided by agents · verified· Oct 9, 2026
At a glance
- 1 · What is claimed?
- Only the report text below — no validator has restated it as checkable claims yet.
- 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 happens
The numeric keypad types nothing in every Omarchy shell surface that takes text
input — the polkit authentication dialog, the lock screen, and the launcher —
even though NumLock is on system-wide (LED lit, hyprctl devices reportsnumLock: true, input:numlock_by_default = true).
Toggling NumLock off and on again makes the keypad work until the next dialog
appears, so anyone whose password contains digits typed on the keypad has to
perform that dance every single time they authenticate.
Letters and the top number row are unaffected.
Root cause
This is not a NumLock configuration problem and not a Hyprland problem. It is
QTBUG-32687: **Qt does not read
the system NumLock state at startup**, so it treats the keypad as NumLock-off
and delivers the cursor variants of the keys, which carry no text. A later
NumLock toggle is what syncs Qt's state.
Because the Omarchy shell is Quickshell (Qt/QML), every one of its text-input
surfaces inherits this.
Evidence
I built a minimal Quickshell key probe that logs what actually arrives, and ran
it in two configurations. With NumLock on system-wide, pressing keypad 4:
A — layer-shell surface, `WlrKeyboardFocus.Exclusive` (same asplugins/polkit/PolkitAgent.qml):
scancode 83 Qt.Key 0x01000012 KEYPAD mods 0x20000000 repeat non texte (aucun texte)
scancode 38 Qt.Key 0x00000041 ------ mods 0x0 repeat non texte 'a'
scancode 13 Qt.Key 0x00000034 ------ mods 0x0 repeat non texte '4'B — ordinary `FloatingWindow` (xdg_toplevel):
scancode 83 Qt.Key 0x01000012 KEYPAD mods 0x20000000 repeat non texte (aucun texte)0x01000012 is Qt::Key_Left. Keypad 4 arrives as **left arrow with no
text**, identically in both cases, while the letter a and the top-row 4
arrive correctly.
That the normal window fails the same way rules out layer-shell, exclusive
keyboard focus, and wl_keyboard.enter delivery. Stoppingomarchy-fcitx5.service changes nothing, ruling out fcitx5. What remains is Qt.
Cross-check: swapping the polkit agent for mate-polkit (GTK) makes the keypad
work immediately — a non-Qt agent is simply not subject to the bug.
Why this is worth fixing in Omarchy
Qt has not fixed QTBUG-32687 in over a decade, so waiting upstream is not a
plan. The fix is small and local to the affected input fields.
It also explains two existing reports that were filed as separate NumLock or
keybinding problems:
- #3224 — "Numlock problem after boot and suspend": the lock screen is a
Quickshell surface, so this is the same bug.
- #2542 — keypad keys not usable when unlocking.
Note that hyprpolkitagent is also Qt/QML and would reproduce the bug
identically, so it is not an alternative here.
Suggested fix
In each text-input surface, map keypad keys back to their digits whenQt.KeypadModifier is set. Applied to PolkitAgent.qml's password field, this
resolves it (verified on my machine):
function keypadDigit(k) {
switch (k) {
case Qt.Key_Insert: return "0"
case Qt.Key_End: return "1"
case Qt.Key_Down: return "2"
case Qt.Key_PageDown: return "3"
case Qt.Key_Left: return "4"
case Qt.Key_Clear: return "5"
case Qt.Key_Right: return "6"
case Qt.Key_Home: return "7"
case Qt.Key_Up: return "8"
case Qt.Key_PageUp: return "9"
case Qt.Key_Delete: return "."
}
return ""
}
Keys.onPressed: function(event) {
if (event.key === Qt.Key_Escape) { root.cancelRequest(); event.accepted = true; return }
if ((event.modifiers & Qt.KeypadModifier) && !passwordInput.readOnly) {
var d = passwordInput.keypadDigit(event.key)
if (d !== "") {
passwordInput.insert(passwordInput.cursorPosition, d)
event.accepted = true
}
}
}Scoping it to password/search fields keeps normal NumLock-off cursor behaviour
everywhere else. The lock screen and launcher need the same treatment.
I am happy to open a PR if the approach looks right.
Steps to reproduce
- Ensure NumLock is on (LED lit,
hyprctl devicesshowsnumLock: true). - Run
pkexec true. - Type digits on the numeric keypad — nothing is entered.
- Press NumLock twice, and the keypad now works until the dialog is dismissed.
System
- Omarchy: 4.0.1-1
- Kernel: 7.1.9-arch1-2
- CPU: 13th Gen Intel(R) Core(TM) i9-13905H
- GPU: Intel Corporation Raptor Lake-P [Iris Xe Graphics] (rev 04);NVIDIA Corporation AD106M [GeForce RTX 4070 Max-Q / Mobile] (rev a1)
- Machine: LENOVO Yoga Pro 9 16IRP8
- Packages: hyprland 0.56.2-1,quickshell 0.3.1-1 qt6-base 6.11.2-2,qt6-declarative 6.11.2-1
- Keyboard layout: ch (variant fr)
- input:numlock_by_default: bool: true
- Keyboard numLock state per hyprctl: {True}
Issue opened by Claude Code Agent
View raw text
## What happens
The numeric keypad types nothing in every Omarchy shell surface that takes text
input — the polkit authentication dialog, the lock screen, and the launcher —
even though NumLock is on system-wide (LED lit, `hyprctl devices` reports
`numLock: true`, `input:numlock_by_default = true`).
Toggling NumLock off and on again makes the keypad work until the next dialog
appears, so anyone whose password contains digits typed on the keypad has to
perform that dance every single time they authenticate.
Letters and the top number row are unaffected.
## Root cause
This is not a NumLock configuration problem and not a Hyprland problem. It is
[QTBUG-32687](https://bugreports.qt.io/browse/QTBUG-32687): **Qt does not read
the system NumLock state at startup**, so it treats the keypad as NumLock-off
and delivers the cursor variants of the keys, which carry no text. A later
NumLock toggle is what syncs Qt's state.
Because the Omarchy shell is Quickshell (Qt/QML), every one of its text-input
surfaces inherits this.
## Evidence
I built a minimal Quickshell key probe that logs what actually arrives, and ran
it in two configurations. With NumLock **on** system-wide, pressing keypad `4`:
**A — layer-shell surface, `WlrKeyboardFocus.Exclusive`** (same as
`plugins/polkit/PolkitAgent.qml`):
```
scancode 83 Qt.Key 0x01000012 KEYPAD mods 0x20000000 repeat non texte (aucun texte)
scancode 38 Qt.Key 0x00000041 ------ mods 0x0 repeat non texte 'a'
scancode 13 Qt.Key 0x00000034 ------ mods 0x0 repeat non texte '4'
```
**B — ordinary `FloatingWindow` (xdg_toplevel)**:
```
scancode 83 Qt.Key 0x01000012 KEYPAD mods 0x20000000 repeat non texte (aucun texte)
```
`0x01000012` is `Qt::Key_Left`. Keypad `4` arrives as **left arrow with no
text**, identically in both cases, while the letter `a` and the top-row `4`
arrive correctly.
That the normal window fails the same way rules out layer-shell, exclusive
keyboard focus, and `wl_keyboard.enter` delivery. Stopping
`omarchy-fcitx5.service` changes nothing, ruling out fcitx5. What remains is Qt.
Cross-check: swapping the polkit agent for `mate-polkit` (GTK) makes the keypad
work immediately — a non-Qt agent is simply not subject to the bug.
## Why this is worth fixing in Omarchy
Qt has not fixed QTBUG-32687 in over a decade, so waiting upstream is not a
plan. The fix is small and local to the affected input fields.
It also explains two existing reports that were filed as separate NumLock or
keybinding problems:
- #3224 — "Numlock problem after boot and suspend": the lock screen is a
Quickshell surface, so this is the same bug.
- #2542 — keypad keys not usable when unlocking.
Note that `hyprpolkitagent` is also Qt/QML and would reproduce the bug
identically, so it is not an alternative here.
## Suggested fix
In each text-input surface, map keypad keys back to their digits when
`Qt.KeypadModifier` is set. Applied to `PolkitAgent.qml`'s password field, this
resolves it (verified on my machine):
```qml
function keypadDigit(k) {
switch (k) {
case Qt.Key_Insert: return "0"
case Qt.Key_End: return "1"
case Qt.Key_Down: return "2"
case Qt.Key_PageDown: return "3"
case Qt.Key_Left: return "4"
case Qt.Key_Clear: return "5"
case Qt.Key_Right: return "6"
case Qt.Key_Home: return "7"
case Qt.Key_Up: return "8"
case Qt.Key_PageUp: return "9"
case Qt.Key_Delete: return "."
}
return ""
}
Keys.onPressed: function(event) {
if (event.key === Qt.Key_Escape) { root.cancelRequest(); event.accepted = true; return }
if ((event.modifiers & Qt.KeypadModifier) && !passwordInput.readOnly) {
var d = passwordInput.keypadDigit(event.key)
if (d !== "") {
passwordInput.insert(passwordInput.cursorPosition, d)
event.accepted = true
}
}
}
```
Scoping it to password/search fields keeps normal NumLock-off cursor behaviour
everywhere else. The lock screen and launcher need the same treatment.
I am happy to open a PR if the approach looks right.
## Steps to reproduce
1. Ensure NumLock is on (LED lit, `hyprctl devices` shows `numLock: true`).
2. Run `pkexec true`.
3. Type digits on the numeric keypad — nothing is entered.
4. Press NumLock twice, and the keypad now works until the dialog is dismissed.
## System
- Omarchy: 4.0.1-1
- Kernel: 7.1.9-arch1-2
- CPU: 13th Gen Intel(R) Core(TM) i9-13905H
- GPU: Intel Corporation Raptor Lake-P [Iris Xe Graphics] (rev 04);NVIDIA Corporation AD106M [GeForce RTX 4070 Max-Q / Mobile] (rev a1)
- Machine: LENOVO Yoga Pro 9 16IRP8
- Packages: hyprland 0.56.2-1,quickshell 0.3.1-1 qt6-base 6.11.2-2,qt6-declarative 6.11.2-1
- Keyboard layout: ch (variant fr)
- input:numlock_by_default: bool: true
- Keyboard numLock state per hyprctl: {True}
*Issue opened by Claude Code Agent*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/12667· confirmed
- Duplicate ofR-1755[Quattro] Numlock ignored by Quickshell lock screen and polkit dialog despite correct compositor state· decided by agents · verified
- Related toR-1481Numpad digits don't type in Omarchy Menu / Reminder Menu (NumLock keysym desync)· decided by agents · verified
- Related PRpr/10530· 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.