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-598GitHub issuePublicFixed

omarchy-menu search field ignores IME composition (Korean/CJK via Fcitx5) — Keys.onPressed path bypasses Qt input method

Reported by TAE58 · filed Sep 13, 2026 · open at source

In the audited area (menu) — decided by agents · verified. Not validated yet.

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?
AreaIn the audited areamenu· 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?
Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. So far: not a duplicate of another report — decided by agents · verified; in the audited area (menu) — decided by agents · verified; matches no known issue — decided by agents · verified. The outcome (valid, duplicate, not a bug, …) is not decided yet. See the decision.

Original report

omarchy-menu search field ignores IME composition (Korean/CJK via Fcitx5) — Keys.onPressed path bypasses Qt input methodrevision 1 · captured 2026-09-28 21:23 UTC via poll

System details

AMD Ryzen 5 PRO 4650U (Renoir iGPU), Omarchy 4.0.3-1, Quickshell 0.3.1-1, fcitx5 5.1.22-1, fcitx5-hangul 5.1.11-1, fcitx5-qt 5.1.15-1

What's wrong?

Korean (Hangul) cannot be composed in the omarchy-menu search field, even though Fcitx5 works in every other application on the same machine. The menu only accepts raw single-character key events, so IME preedit/commit never reaches it.

This is not a missing-package or missing-environment problem. The Quickshell process has:

QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx

and fcitx5-qt is installed. Korean input works in Alacritty, Chromium, Nautilus, etc.

Steps to reproduce

  1. Install fcitx5, fcitx5-hangul, fcitx5-qt; add Hangul to the Fcitx5 profile (or use #9299 once merged).
  2. Open the omarchy-menu (Super+Space).
  3. Switch Fcitx5 to Hangul and type e.g. gks (should compose 한).

Expected: 한 appears in the search field and filters the list.
Actual: Switching Fcitx5 to Hangul has no effect inside the menu — the raw Latin letters gks are inserted as if the IME were off. The same toggle works immediately in any other window.

Root cause

shell/plugins/menu/Menu.qml does not use a Qt text-input control for the search field. The keyCatcher Item has focus: true and collects printable characters manually in Keys.onPressed:

https://github.com/omacom/omarchy/blob/quattro/shell/plugins/menu/Menu.qml#L1161-L1163

} else if (event.text && event.text.length === 1 && event.text.charCodeAt(0) >= 32 && event.text.charCodeAt(0) !== 127 && (event.modifiers === Qt.NoModifier || event.modifiers === Qt.ShiftModifier)) {
  root.setFilter(root.filterText + event.text)
  event.accepted = true
}

A plain Item does not participate in Qt's input-method protocol (QInputMethodEvent, inputMethodComposing, inputMethodHints). Fcitx5 delivers CJK text as preedit + commit events rather than as QKeyEvents with event.text, so composition is silently dropped. The same applies to Japanese and Chinese IMEs.

This is the same code path already discussed in #7098 (crash traced through Keys.onPressed → setFilter()) and #8023 (numpad / AltGr characters filtered out by the same event.text + modifier checks). Together they show the hand-rolled key-event path is fragile for anything beyond direct Latin key input.

Verified fix (local)

I cloned the plugin (omarchy plugin clone omarchy.menu) and replaced the printable-character branch with a real TextInput:

  • TextInput { id: searchInput; focus: root.opened } bound to root.filterText, filtering via onTextEdited → root.setFilter(text).
  • Keys.onPressed kept only for non-text commands (Escape, Enter, arrows, PageUp/Down, Delete, Backspace-on-empty → goBack) and bails early when searchInput.inputMethodComposing so preedit keys don't trigger shortcuts.
  • keyCatcher.forceActiveFocus() → searchInput.forceActiveFocus().

With that change Hangul composition works normally in the menu. I have not yet finished the integration (my first pass regressed the item list rendering), so I'm filing this as an issue rather than a PR for now; happy to follow up with a PR once it's clean, or if a maintainer prefers a different approach for keeping the menu keyboard-driven.

Related: #7098, #8023, #9299

View raw text
### System details

AMD Ryzen 5 PRO 4650U (Renoir iGPU), Omarchy 4.0.3-1, Quickshell 0.3.1-1, fcitx5 5.1.22-1, fcitx5-hangul 5.1.11-1, fcitx5-qt 5.1.15-1

### What's wrong?

Korean (Hangul) cannot be composed in the omarchy-menu search field, even though Fcitx5 works in every other application on the same machine. The menu only accepts raw single-character key events, so IME preedit/commit never reaches it.

This is not a missing-package or missing-environment problem. The Quickshell process has:

```
QT_IM_MODULE=fcitx
XMODIFIERS=@im=fcitx
```

and `fcitx5-qt` is installed. Korean input works in Alacritty, Chromium, Nautilus, etc.

**Steps to reproduce**

1. Install `fcitx5`, `fcitx5-hangul`, `fcitx5-qt`; add Hangul to the Fcitx5 profile (or use #9299 once merged).
2. Open the omarchy-menu (Super+Space).
3. Switch Fcitx5 to Hangul and type e.g. `gks` (should compose `한`).

**Expected:** `한` appears in the search field and filters the list.
**Actual:** Switching Fcitx5 to Hangul has no effect inside the menu — the raw Latin letters `gks` are inserted as if the IME were off. The same toggle works immediately in any other window.

**Root cause**

`shell/plugins/menu/Menu.qml` does not use a Qt text-input control for the search field. The `keyCatcher` `Item` has `focus: true` and collects printable characters manually in `Keys.onPressed`:

https://github.com/omacom/omarchy/blob/quattro/shell/plugins/menu/Menu.qml#L1161-L1163

```qml
} else if (event.text && event.text.length === 1 && event.text.charCodeAt(0) >= 32 && event.text.charCodeAt(0) !== 127 && (event.modifiers === Qt.NoModifier || event.modifiers === Qt.ShiftModifier)) {
  root.setFilter(root.filterText + event.text)
  event.accepted = true
}
```

A plain `Item` does not participate in Qt's input-method protocol (`QInputMethodEvent`, `inputMethodComposing`, `inputMethodHints`). Fcitx5 delivers CJK text as preedit + commit events rather than as `QKeyEvent`s with `event.text`, so composition is silently dropped. The same applies to Japanese and Chinese IMEs.

This is the same code path already discussed in #7098 (crash traced through `Keys.onPressed → setFilter()`) and #8023 (numpad / AltGr characters filtered out by the same `event.text` + modifier checks). Together they show the hand-rolled key-event path is fragile for anything beyond direct Latin key input.

**Verified fix (local)**

I cloned the plugin (`omarchy plugin clone omarchy.menu`) and replaced the printable-character branch with a real `TextInput`:

- `TextInput { id: searchInput; focus: root.opened }` bound to `root.filterText`, filtering via `onTextEdited → root.setFilter(text)`.
- `Keys.onPressed` kept only for non-text commands (Escape, Enter, arrows, PageUp/Down, Delete, Backspace-on-empty → goBack) and bails early when `searchInput.inputMethodComposing` so preedit keys don't trigger shortcuts.
- `keyCatcher.forceActiveFocus()` → `searchInput.forceActiveFocus()`.

With that change Hangul composition works normally in the menu. I have not yet finished the integration (my first pass regressed the item list rendering), so I'm filing this as an issue rather than a PR for now; happy to follow up with a PR once it's clean, or if a maintainer prefers a different approach for keeping the menu keyboard-driven.

**Related:** #7098, #8023, #9299

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/11963· confirmed
  • Fixed bypr/12338· confirmed
  • Related PRpr/11719· 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.

  • Decided by agents · verified: not a duplicate of another report
  • Decided by agents · verified: in the audited area (menu)
  • Decided by agents · verified: matches no known issue

The outcome (valid, duplicate, not a bug, …) is not decided yet.