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

Default fcitx5 service breaks Hyprland multi-layout keyboard switching (bar label switches, typing doesn't)

Reported by je2020je · filed Sep 1, 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

Default fcitx5 service breaks Hyprland multi-layout keyboard switching (bar label switches, typing doesn't)revision 1 · captured 2026-09-28 21:24 UTC via poll

Describe the bug

On a default Omarchy install (fcitx5 running via omarchy-fcitx5.service), switching the keyboard layout through Hyprland's xkb mechanism — the bar's keyboard-layout widget or a grp:* xkb option — appears to work but has no effect on typing in most apps.

The bar widget label changes (e.g. EN → FA), and hyprctl devices -j confirms the physical keyboard's active_keymap switched, but typed characters still come out in the previous layout in GTK/Qt/Chromium apps.

Root cause

omarchy-fcitx5.service runs fcitx5 by default (installed for XCompose sequences), and Omarchy's environment (/usr/share/omarchy/default/environment.d/10-omarchy-fcitx.conf) points GTK/Qt/SDL at it (INPUT_METHOD=fcitx, QT_IM_MODULE=fcitx, XMODIFIERS=@im=fcitx).

Apps using the input-method path get their keys grabbed by fcitx5, which processes them against its own virtual keyboard (hl-virtual-keyboard-fcitx5) whose keymap stays on us. The default fcitx5 profile only contains keyboard-us and provides no way for the compositor's xkb layout list (kb_layout = us,ir) to be followed. So compositor-side layout switches never reach what fcitx5 commits into the app. The virtual keyboard also holds the main flag, so seat-wide reads describe it rather than the typed-on keyboard.

Steps to reproduce

  1. Fresh Omarchy 4.0.2 install (fcitx5 service active, default environment).
  2. Set a second layout in ~/.config/hypr/input.lua:
   hl.config({
     input = {
       kb_layout = "us,ir",
       kb_options = "grp:alt_shift_toggle",
     },
   })
  1. Reload, then press Alt+Shift (or click the bar's keyboard-layout widget).
  2. Bar label switches to FA; hyprctl devices -j shows the physical keyboard's active_keymap = "Persian".
  3. Type in any GTK/Qt/Chromium app → still English characters.

Expected behavior

Layout switching should reach all apps, or at minimum the bar widget should not report a switch that doesn't take effect.

Workaround

systemctl --user disable --now omarchy-fcitx5.service

After that, xkb switching works everywhere immediately (verified: hyprctl switchxkblayout + typing produce the new layout in all apps). Cost: losing XCompose dead-key sequences, which fcitx5 was enabled for.

Suggested fixes (any of)

  1. Don't enable fcitx5 by default; enable it only for users who opt into IM input — plain xkb covers Latin + non-CJK layouts (including ir) out of the box.
  2. Make fcitx5's keyboard engine follow the compositor's per-keyboard layout so the two stay in sync.
  3. Have the keyboard-layout widget/activelayout handling detect this state (fcitx5 virtual keyboard holding main with a single-IM profile) and surface a hint, instead of showing a successful switch.

System

View raw text
### Describe the bug

On a default Omarchy install (fcitx5 running via `omarchy-fcitx5.service`), switching the keyboard layout through Hyprland's xkb mechanism — the bar's keyboard-layout widget or a `grp:*` xkb option — **appears to work but has no effect on typing** in most apps.

The bar widget label changes (e.g. `EN` → `FA`), and `hyprctl devices -j` confirms the physical keyboard's `active_keymap` switched, but typed characters still come out in the previous layout in GTK/Qt/Chromium apps.

### Root cause

`omarchy-fcitx5.service` runs fcitx5 by default (installed for XCompose sequences), and Omarchy's environment (`/usr/share/omarchy/default/environment.d/10-omarchy-fcitx.conf`) points GTK/Qt/SDL at it (`INPUT_METHOD=fcitx`, `QT_IM_MODULE=fcitx`, `XMODIFIERS=@im=fcitx`).

Apps using the input-method path get their keys grabbed by fcitx5, which processes them against **its own virtual keyboard** (`hl-virtual-keyboard-fcitx5`) whose keymap stays on `us`. The default fcitx5 profile only contains `keyboard-us` and provides no way for the compositor's xkb layout list (`kb_layout = us,ir`) to be followed. So compositor-side layout switches never reach what fcitx5 commits into the app. The virtual keyboard also holds the `main` flag, so seat-wide reads describe it rather than the typed-on keyboard.

### Steps to reproduce

1. Fresh Omarchy 4.0.2 install (fcitx5 service active, default environment).
2. Set a second layout in `~/.config/hypr/input.lua`:
   ```lua
   hl.config({
     input = {
       kb_layout = "us,ir",
       kb_options = "grp:alt_shift_toggle",
     },
   })
   ```
3. Reload, then press Alt+Shift (or click the bar's keyboard-layout widget).
4. Bar label switches to `FA`; `hyprctl devices -j` shows the physical keyboard's `active_keymap` = "Persian".
5. Type in any GTK/Qt/Chromium app → still English characters.

### Expected behavior

Layout switching should reach all apps, or at minimum the bar widget should not report a switch that doesn't take effect.

### Workaround

```bash
systemctl --user disable --now omarchy-fcitx5.service
```

After that, xkb switching works everywhere immediately (verified: `hyprctl switchxkblayout` + typing produce the new layout in all apps). Cost: losing XCompose dead-key sequences, which fcitx5 was enabled for.

### Suggested fixes (any of)

1. Don't enable fcitx5 by default; enable it only for users who opt into IM input — plain xkb covers Latin + non-CJK layouts (including `ir`) out of the box.
2. Make fcitx5's keyboard engine follow the compositor's per-keyboard layout so the two stay in sync.
3. Have the keyboard-layout widget/`activelayout` handling detect this state (fcitx5 virtual keyboard holding `main` with a single-IM profile) and surface a hint, instead of showing a successful switch.

### System

- Omarchy 4.0.2-1, Hyprland 0.56.2, Wayland
- Debug log (expires in 24h): https://logs.omarchy.org/4NWaUO

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