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-5010GitHub issuePublicReceived

Universal copy/paste/cut (SUPER+C/V/X) fails on non-Latin keyboard layouts

Reported by airenare · filed Sep 10, 2026Closed upstream on 2026-09-21 by bjarneo via an automated message, as a duplicate of #7371 (R-1688). GitHub close reason: completed.

Received and recorded verbatim. Nothing has been checked 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?
Not yet mapped to any requirement or component.
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. No decision has been recorded yet.

Original report

Universal copy/paste/cut (SUPER+C/V/X) fails on non-Latin keyboard layoutsrevision 1 · captured 2026-10-04 12:10 UTC via poll

What happened

On a multi-layout keyboard setup where a secondary layout doesn't produce Latin letters at the physical C/V/X key positions (e.g. Cyrillic/Russian, but this would affect any non-Latin layout the same way), the default Universal copy/paste/cut shortcuts (SUPER+C, SUPER+V, SUPER+X) silently do nothing while that layout is active. A Hyprland OSD toast appears:

Runtime error in lua:
=[C]:-1: send_key_state: key not found

Root cause

default/hypr/bindings/clipboard.lua triggers the shortcuts correctly regardless of active layout (Hyprland's bind matching is layout-agnostic by design via input:resolve_binds_by_sym = false). But the injected keystroke is sent by keysym name:

o.bind("SUPER + C", "Universal copy", universal_clipboard_shortcut("CTRL", "C", "CTRL", "Insert"))
o.bind("SUPER + V", "Universal paste", universal_clipboard_shortcut("CTRL", "V", "SHIFT", "Insert"))
o.bind("SUPER + X", "Universal cut", send_shortcut_once("CTRL", "X"))

hl.dsp.send_key_state resolves that name ("C", "V", "X") against the currently active keyboard layout/group, not a fixed reference layout. If the active layout has no key that produces that Latin letter (true for Cyrillic and other non-Latin layouts), the lookup throws key not found and the injected Ctrl+C/Ctrl+V/Ctrl+X never happens — so the shortcut appears to just fail with no clipboard action.

This is the same class of bug the default config already works around elsewhere for a trigger key (see the code: comment pattern), but here it's the injected key inside send_key_state that isn't layout-pinned.

Steps to reproduce

  1. Add a second, non-Latin keyboard layout, e.g. in ~/.config/hypr/input.lua:
   hl.config({ input = { kb_layout = "us,ru", kb_options = "grp:alt_shift_toggle" } })
  1. Switch to the non-Latin layout.
  2. Copy something to the clipboard (e.g. a screenshot).
  3. Focus a normal (non-terminal) window and press SUPER+V (or SUPER+C / SUPER+X).

Expected

Copy/paste/cut works the same regardless of which layout is currently active, matching the layout-agnostic behavior of the bind trigger itself.

Actual

Hyprland shows a send_key_state: key not found runtime error toast (see attached screenshot) and no clipboard action occurs.

Suggested fix

Send the injected key by physical position instead of by symbol name, e.g.:

o.bind("SUPER + C", "Universal copy", universal_clipboard_shortcut("CTRL", "code:54", "CTRL", "Insert"))
o.bind("SUPER + V", "Universal paste", universal_clipboard_shortcut("CTRL", "code:55", "SHIFT", "Insert"))
o.bind("SUPER + X", "Universal cut", send_shortcut_once("CTRL", "code:53"))

(code:54/55/53 are the physical C/V/X key positions in Hyprland's xkb keycode numbering — layout-independent.) This mirrors the existing code:49 workaround already used elsewhere in the default config for a layout-dependent trigger key, applied here to the injected key instead.

I've applied this fix locally as a user override and confirmed it resolves the issue.

System details

  • Omarchy version: 4.0.3-1
  • Hyprland version: 0.56.2 (v0.56.2, commit efb50993780079460b0cbed1363e2166a2de1d9f)
  • kb_layout: us,ru, kb_options: compose:caps,grp:alt_shift_toggle
View raw text
## What happened

On a multi-layout keyboard setup where a secondary layout doesn't produce Latin letters at the physical C/V/X key positions (e.g. Cyrillic/Russian, but this would affect any non-Latin layout the same way), the default Universal copy/paste/cut shortcuts (`SUPER+C`, `SUPER+V`, `SUPER+X`) silently do nothing while that layout is active. A Hyprland OSD toast appears:

```
Runtime error in lua:
=[C]:-1: send_key_state: key not found
```

## Root cause

`default/hypr/bindings/clipboard.lua` triggers the shortcuts correctly regardless of active layout (Hyprland's bind matching is layout-agnostic by design via `input:resolve_binds_by_sym = false`). But the *injected* keystroke is sent by keysym **name**:

```lua
o.bind("SUPER + C", "Universal copy", universal_clipboard_shortcut("CTRL", "C", "CTRL", "Insert"))
o.bind("SUPER + V", "Universal paste", universal_clipboard_shortcut("CTRL", "V", "SHIFT", "Insert"))
o.bind("SUPER + X", "Universal cut", send_shortcut_once("CTRL", "X"))
```

`hl.dsp.send_key_state` resolves that name (`"C"`, `"V"`, `"X"`) against the **currently active** keyboard layout/group, not a fixed reference layout. If the active layout has no key that produces that Latin letter (true for Cyrillic and other non-Latin layouts), the lookup throws `key not found` and the injected Ctrl+C/Ctrl+V/Ctrl+X never happens — so the shortcut appears to just fail with no clipboard action.

This is the same class of bug the default config already works around elsewhere for a *trigger* key (see the `code:` comment pattern), but here it's the *injected* key inside `send_key_state` that isn't layout-pinned.

## Steps to reproduce

1. Add a second, non-Latin keyboard layout, e.g. in `~/.config/hypr/input.lua`:
   ```lua
   hl.config({ input = { kb_layout = "us,ru", kb_options = "grp:alt_shift_toggle" } })
   ```
2. Switch to the non-Latin layout.
3. Copy something to the clipboard (e.g. a screenshot).
4. Focus a normal (non-terminal) window and press `SUPER+V` (or `SUPER+C` / `SUPER+X`).

## Expected

Copy/paste/cut works the same regardless of which layout is currently active, matching the layout-agnostic behavior of the bind trigger itself.

## Actual

Hyprland shows a `send_key_state: key not found` runtime error toast (see attached screenshot) and no clipboard action occurs.

## Suggested fix

Send the injected key by physical position instead of by symbol name, e.g.:

```lua
o.bind("SUPER + C", "Universal copy", universal_clipboard_shortcut("CTRL", "code:54", "CTRL", "Insert"))
o.bind("SUPER + V", "Universal paste", universal_clipboard_shortcut("CTRL", "code:55", "SHIFT", "Insert"))
o.bind("SUPER + X", "Universal cut", send_shortcut_once("CTRL", "code:53"))
```

(`code:54`/`55`/`53` are the physical C/V/X key positions in Hyprland's xkb keycode numbering — layout-independent.) This mirrors the existing `code:49` workaround already used elsewhere in the default config for a layout-dependent trigger key, applied here to the injected key instead.

I've applied this fix locally as a user override and confirmed it resolves the issue.

## System details

- Omarchy version: 4.0.3-1
- Hyprland version: 0.56.2 (v0.56.2, commit efb50993780079460b0cbed1363e2166a2de1d9f)
- `kb_layout`: `us,ru`, `kb_options`: `compose:caps,grp:alt_shift_toggle`

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.

No decision has been recorded yet.