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

Keyboard layout widget switches Logitech G502 instead of physical keyboard

Reported by szalikdev · filed Sep 4, 2026 · open at source

Decided: Out of scope — decided by agents · verified 3 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 Logitech G502 instead of physical keyboardrevision 1 · captured 2026-09-28 21:24 UTC via poll

Description

The omarchy.keyboard-layout bar widget can select a mouse-provided keyboard interface instead of the physical typing keyboard. The indicator then changes to the requested layout, but typed characters continue using the previous layout.

In this case, selecting German made the bar show DE, while the real keyboard continued producing the Polish layout.

Steps to reproduce

  1. Connect a Logitech G502 LIGHTSPEED mouse and a USB keyboard.
  2. Configure two layouts in Hyprland: kb_layout = "pl,de" and kb_variant = ",".
  3. Click the keyboard-layout widget to switch from Polish to German.
  4. Type Y and Z.

Actual behavior

The bar shows German, but the physical keyboard remains Polish. Live hyprctl -j devices state showed:

logitech-g502:                 active_layout_index 1, German
sonix-usb-device:              active_layout_index 0, Polish
sonix-usb-device-keyboard:     active_layout_index 0, Polish
hl-virtual-keyboard-fcitx5:    active_layout_index 0, Polish

KeyboardLayoutModel.isTypedKeyboard() treats logitech-g502 as a typing keyboard because UNTYPED_KEYBOARDS only excludes known virtual and ACPI-style names. Since selectKeyboard() selects the furthest-advanced eligible device, the widget remains attached to the G502 after switching it.

Expected behavior

The widget should select and switch a keyboard that receives normal text input, ignoring keyboard-like interfaces exposed by mice and similar peripherals.

Confirmed workaround

Cloning omarchy.keyboard-layout and adding logitech-g502$ to UNTYPED_KEYBOARDS makes the widget select sonix-usb-device; Polish/German switching then targets the physical keyboard correctly.

A device-specific exclusion proves the cause, although a generic way to distinguish typing keyboards would be preferable upstream.

System information

  • Omarchy: 4.0.2-1
  • Hyprland: 0.56.2-1
  • Kernel: 7.1.9-arch1-2
  • CPU/GPU: AMD Ryzen Embedded R1505G / Radeon Vega
  • Mouse: Logitech G502 LIGHTSPEED
  • Keyboard interfaces: sonix-usb-device, sonix-usb-device-keyboard
  • Input method: fcitx5 5.1.21-1

Diagnostics were collected with omarchy-debug --no-sudo --print; there were no keyboard-related warnings.

View raw text
## Description

The `omarchy.keyboard-layout` bar widget can select a mouse-provided keyboard interface instead of the physical typing keyboard. The indicator then changes to the requested layout, but typed characters continue using the previous layout.

In this case, selecting German made the bar show `DE`, while the real keyboard continued producing the Polish layout.

## Steps to reproduce

1. Connect a Logitech G502 LIGHTSPEED mouse and a USB keyboard.
2. Configure two layouts in Hyprland: `kb_layout = "pl,de"` and `kb_variant = ","`.
3. Click the keyboard-layout widget to switch from Polish to German.
4. Type `Y` and `Z`.

## Actual behavior

The bar shows German, but the physical keyboard remains Polish. Live `hyprctl -j devices` state showed:

```text
logitech-g502:                 active_layout_index 1, German
sonix-usb-device:              active_layout_index 0, Polish
sonix-usb-device-keyboard:     active_layout_index 0, Polish
hl-virtual-keyboard-fcitx5:    active_layout_index 0, Polish
```

`KeyboardLayoutModel.isTypedKeyboard()` treats `logitech-g502` as a typing keyboard because `UNTYPED_KEYBOARDS` only excludes known virtual and ACPI-style names. Since `selectKeyboard()` selects the furthest-advanced eligible device, the widget remains attached to the G502 after switching it.

## Expected behavior

The widget should select and switch a keyboard that receives normal text input, ignoring keyboard-like interfaces exposed by mice and similar peripherals.

## Confirmed workaround

Cloning `omarchy.keyboard-layout` and adding `logitech-g502$` to `UNTYPED_KEYBOARDS` makes the widget select `sonix-usb-device`; Polish/German switching then targets the physical keyboard correctly.

A device-specific exclusion proves the cause, although a generic way to distinguish typing keyboards would be preferable upstream.

## System information

- Omarchy: 4.0.2-1
- Hyprland: 0.56.2-1
- Kernel: 7.1.9-arch1-2
- CPU/GPU: AMD Ryzen Embedded R1505G / Radeon Vega
- Mouse: Logitech G502 LIGHTSPEED
- Keyboard interfaces: `sonix-usb-device`, `sonix-usb-device-keyboard`
- Input method: fcitx5 5.1.21-1

Diagnostics were collected with `omarchy-debug --no-sudo --print`; there were no keyboard-related warnings.

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:46 UTC