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-1256GitHub issuePublicDecided· Out of scope

keyboard-layout widget switches the wrong device on laptops with vendor WMI/radio-control inputs

Reported by sas-blas · filed Aug 29, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 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

keyboard-layout widget switches the wrong device on laptops with vendor WMI/radio-control inputsrevision 1 · captured 2026-09-28 21:24 UTC via poll

What happened

On a laptop whose vendor platform driver registers WMI/radio-control input devices, the omarchy.keyboard-layout bar widget switches the wrong device. Clicking it changes the label but never changes the layout actually being typed on.

Expected

Clicking the widget cycles the layout of the keyboard being typed on, and the label reflects it.

Root cause

shell/plugins/bar/widgets/KeyboardLayoutModel.js filters non-keyboard devices with:

var UNTYPED_KEYBOARDS = /^(hl-virtual-keyboard|power-button|sleep-button|lid-switch|video-bus)/

Vendor platform drivers register devices that libinput reports as keyboards but that are named for the driver, not the button — so they pass the filter. On an Acer Nitro AN515-55, hyprctl devices lists 9 keyboards and 3 survive the filter:

acer-wireless-radio-control     <- not a keyboard
at-translated-set-2-keyboard    <- the real keyboard
acer-wmi-hotkeys                <- not a keyboard

With every device still at layout index 0, selectKeyboard() falls through to keyboards[0], which is acer-wireless-radio-control. The click then runs switchxkblayout against that device:

$ hyprctl switchxkblayout acer-wireless-radio-control next

acer-wireless-radio-control : idx=1  English (US)
at-translated-set-2-keyboard: idx=0  Polish        <- unchanged

The label reads "EN" (furthest-advanced device) while the user is still typing Polish.

It does not self-correct. The switch emits an activelayout event naming that same device, eventKeyboardName() accepts it (it isn't an hl-virtual-keyboard), and selectKeyboard() then pins to it by name on every subsequent read. The button toggles the label indefinitely while the real keyboard never moves.

Secondary effect: keyboardCount = 3 > 1 keeps the 10 s hyprctl -j devices poll (KeyboardLayout.qml:199) running permanently on a single-keyboard laptop, where the comment says it should never run.

Steps to reproduce

  1. Use a laptop with a vendor WMI hotkey device (hyprctl devices | grep -E 'wmi|radio-control' returns something).
  2. Set two layouts, e.g. XKBLAYOUT=pl,us in /etc/vconsole.conf.
  3. Click the keyboard-layout widget in the bar.
  4. hyprctl devices -j — the label changed, at-translated-set-2-keyboard did not.

Suggested fix

Match the driver suffix rather than specific vendor names, tolerating the index Hyprland appends to duplicates:

var UNTYPED_KEYBOARDS =
  /^(hl-virtual-keyboard|power-button|sleep-button|lid-switch|video-bus)|(-wmi-hotkeys|-wireless-radio-control)(-\d+)?$/

This covers asus-wmi-hotkeys and friends too. Verified locally against the device names above: the three real filters still exclude, at-translated-set-2-keyboard and external keyboards (logitech-k380) are kept, and dell-wmi — which is a real hotkey source but not named with these suffixes — is untouched, so no behaviour is lost for anyone currently working.

After the change the widget sees 1 keyboard, the poll timer stops, and the click cycles PL -> EN -> PL on the real keyboard.

Happy to open a PR if the approach looks right.

System

  • Omarchy 4.0.1-1
  • Hyprland 0.56.2
  • Acer Nitro AN515-55, i5-10300H, GTX 1650 Ti Mobile + UHD Graphics
  • Arch Linux, kernel 7.1.9-arch1-2
View raw text
## What happened

On a laptop whose vendor platform driver registers WMI/radio-control input devices, the `omarchy.keyboard-layout` bar widget switches the wrong device. Clicking it changes the label but never changes the layout actually being typed on.

## Expected

Clicking the widget cycles the layout of the keyboard being typed on, and the label reflects it.

## Root cause

`shell/plugins/bar/widgets/KeyboardLayoutModel.js` filters non-keyboard devices with:

```js
var UNTYPED_KEYBOARDS = /^(hl-virtual-keyboard|power-button|sleep-button|lid-switch|video-bus)/
```

Vendor platform drivers register devices that libinput reports as keyboards but that are named for the driver, not the button — so they pass the filter. On an Acer Nitro AN515-55, `hyprctl devices` lists 9 keyboards and **3** survive the filter:

```
acer-wireless-radio-control     <- not a keyboard
at-translated-set-2-keyboard    <- the real keyboard
acer-wmi-hotkeys                <- not a keyboard
```

With every device still at layout index 0, `selectKeyboard()` falls through to `keyboards[0]`, which is `acer-wireless-radio-control`. The click then runs `switchxkblayout` against that device:

```
$ hyprctl switchxkblayout acer-wireless-radio-control next

acer-wireless-radio-control : idx=1  English (US)
at-translated-set-2-keyboard: idx=0  Polish        <- unchanged
```

The label reads "EN" (furthest-advanced device) while the user is still typing Polish.

It does not self-correct. The switch emits an `activelayout` event naming that same device, `eventKeyboardName()` accepts it (it isn't an `hl-virtual-keyboard`), and `selectKeyboard()` then pins to it by name on every subsequent read. The button toggles the label indefinitely while the real keyboard never moves.

Secondary effect: `keyboardCount = 3 > 1` keeps the 10 s `hyprctl -j devices` poll (`KeyboardLayout.qml:199`) running permanently on a single-keyboard laptop, where the comment says it should never run.

## Steps to reproduce

1. Use a laptop with a vendor WMI hotkey device (`hyprctl devices | grep -E 'wmi|radio-control'` returns something).
2. Set two layouts, e.g. `XKBLAYOUT=pl,us` in `/etc/vconsole.conf`.
3. Click the keyboard-layout widget in the bar.
4. `hyprctl devices -j` — the label changed, `at-translated-set-2-keyboard` did not.

## Suggested fix

Match the driver suffix rather than specific vendor names, tolerating the index Hyprland appends to duplicates:

```js
var UNTYPED_KEYBOARDS =
  /^(hl-virtual-keyboard|power-button|sleep-button|lid-switch|video-bus)|(-wmi-hotkeys|-wireless-radio-control)(-\d+)?$/
```

This covers `asus-wmi-hotkeys` and friends too. Verified locally against the device names above: the three real filters still exclude, `at-translated-set-2-keyboard` and external keyboards (`logitech-k380`) are kept, and `dell-wmi` — which is a real hotkey source but not named with these suffixes — is untouched, so no behaviour is lost for anyone currently working.

After the change the widget sees 1 keyboard, the poll timer stops, and the click cycles PL -> EN -> PL on the real keyboard.

Happy to open a PR if the approach looks right.

## System

- Omarchy 4.0.1-1
- Hyprland 0.56.2
- Acer Nitro AN515-55, i5-10300H, GTX 1650 Ti Mobile + UHD Graphics
- Arch Linux, kernel 7.1.9-arch1-2

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 10:33 UTC