Repository navigation
Rebase the Cua Hyprland plugin on Driver 0.32.0 for Hyprland 0.56.2-4 - #772
Conversation
Driver 0.31.0 took the independent agent keymaps and Num Lock handling from #473 upstream, so independent-keymaps.patch goes. Upstream also added an up-front check that every key the KEY command can press types the US keysym, modifier keys included, which refuses all foreground typing under ctrl:swapcaps, compose:ralt, altwin:swap_alt_win or compose:102. foreground-remaps.patch makes that check run the per-chord check every key already passes over exactly the chords Driver types text with, with Num Lock off and on, so a string is still admitted or refused before its first key and other remaps are left to the per-chord check. 0.32.0 also gives agent keyboards a real repeat rate, which stops single-seat clients like imv crashing on an agent seat (trycua/cua#4257). cua-driver-bin stays at 0.28.2, which speaks the same input protocol v3: Driver 0.28.3 through 0.32.0 refuse desktop capture on Hyprland with more than one output or with one away from the origin (trycua/cua#4161). Co-Authored-By: Codex XHigh <noreply@openai.com>
|
End-to-end run on omabot workers built from the Omarchy ISO and switched to the edge channel (Hyprland 0.56.2-3, Aquamarine 0.15.1-1, glibc 2.44+r50, GCC 16.2.1), driven by Opus 5.5 in Claude Code. Codex XHigh reviewed the diff in four rounds. Its findings shaped the gate: the upstream remap regression, a text chord the first gate missed, and Num Lock. The last round found nothing. Build. Upgrade. Starting from the published edge #4257. With the published 0.28.2-2 plugin loaded, Background input. With the terminal focused, Driver sent Inkscape 1.4.4-6 the rectangle-tool key, a drag, and Ctrl+S through the agent lane. The saved SVG gained a Foreground typing into the focused terminal,
Under Driver. Desktop and window captures with the 0.28.2 driver succeed at scale 1, 1.25 and 1.6, and with two monitors. Driver 0.32.0 refuses the desktop capture with two monitors or a single monitor at 1920,0, with or without this plugin loaded, which is why |
|
Hardware run and a crash investigation, both by Opus 5.5 in Claude Code; no second-opinion review ran on either. Hardware. CI's artifact for this PR ( Hyprland crash. Partway through that run Hyprland 0.56.2 crashed and restarted in safe mode. Symbolized with Arch's debug info, the fault is in Hyprland's input-method handling: when the input-method client (fcitx5) disconnects, the relay's destroy listener updates every input-method popup and
This PR does not change the exposure: the published plugin crashes at the same rate. It takes input enabled and fcitx5 exiting, which Omarchy does in |
With plugin input enabled, fcitx5 requests an input method for each of the three seats, and when it exits Hyprland 0.56.2 can still hold an input-method popup that is mapped although its wl_surface is gone: the popup's surface-destroy handler emits unmap but never clears m_mapped. Tearing down the input method then updates every popup, CInputPopup::updateBox dereferences the missing surface and Hyprland restarts in safe mode. Omarchy's omarchy-restart-xcompose reaches this in normal use. The plugin now hooks CInputPopup::updateBox and CInputPopup::shouldBeRendered so a popup whose getSurface() is empty is neither placed nor rendered, reports the guard in cua:status, and removes the hooks on unload. The guard is compiled into the module only, so the mock-based tests are unchanged. foreground-remaps.patch becomes downstream.patch now that it carries both changes.
Arch rebuilt Hyprland 0.56.2 against vulkan-sdk 1.4.363 and glslang. The executable and two headers change, so the plugin's exact compositor pin and hashes would block hyprland upgrades for anyone with it installed, and Cua's kit has no profile for it (trycua/cua#4216). The release, compiler and runtime are unchanged, so the derivation now also takes the re-measured compositor executable and header inventory; the build's verifier checks both against the installed package.
The guard is installed best effort, so the README promises the fix only while it is active, and the activation checklist now asks for ime_popup_guard: true. 'No hooks' meant package-manager hooks, which the plugin's new function hooks made ambiguous. Co-Authored-By: Codex XHigh <noreply@openai.com>
|
Evidence for the current head ( Update path on the real edge mirror (Hyprland Build. Input-method crash. The crash this release guards against is a Hyprland 0.56.2 fault: a core dump shows an input-method popup still marked mapped after its
After the upgrade, rebooted into Hyprland CI's artifact. The package this PR's CI built and would publish ( |
|
Re-tested at head The update path. With the published pair installed ( Fresh session, following the README's activation section. The running compositor's executable hashes to the re-measured Two limitations, both pre-existing and unchanged by this PR:
Ready to merge; it is waiting on a maintainer. Publishing reuses the PR artifact for seven days from the 2026-10-03 build. 🤖 Generated by Opus 5.5 in Claude Code. Reviewed by Codex XHigh. |
|
Release check for the published package, as the README's Ownership and publication section asks, run by Opus 5.5 in Claude Code. Edge's database lists On a fresh Omabot worker built from the Omarchy ISO and switched to edge, and on a Dell XPS 16 on edge, the package installed from the edge repository with pacman validating checksum and signature. In a fresh session the consumer check passed, the module loaded with input protocol 3 and 🤖 Generated by Opus 5.5 in Claude Code. |



Edge now carries Arch's
hyprland 0.56.2-4, and the publishedcua-hyprland-plugin 0.28.2-2pinshyprland=0.56.2-3, soomarchy updatefails for every edge user with the plugin installed:installing hyprland (0.56.2-4) breaks dependency 'hyprland=0.56.2-3' required by cua-hyprland-plugin. This release,0.32.0-3, pins-4, and an update takes Hyprland and the plugin together.-4is the same 0.56.2 source rebuilt against vulkan-sdk 1.4.363 and glslang, with the same GCC16.2.1 20260810andlibstdc++. Only the executable and two of its 497 headers differ, so the derivation now also takes the compositor executable and header-inventory hashes, measured from-4the way the kit'sprofile_verify.pymeasures them; the same method reproduces the kit's-3values exactly. Compiler, runtime, header version, tooling and source identities stay Cua's, the derivation still refuses any other profile change, and at build time the verifier checks the measured values against the installed Hyprland. A new Hyprland release, compiler orlibstdc++still needs a kit from Cua (trycua/cua#4216). The profile isomarchy-hyprland-0562r4-remaps.The plugin is built from the Driver 0.32.0 source. That gives agent keyboards the user seat's repeat rate and delay instead of
repeat_info(0, 0), which crashed single-seat clients such as imv and cut Zed off from the user's input (trycua/cua#4257). Driver 0.31.0 also took the independent agent keymaps and Num Lock handling from #473 upstream, so the old keymap patch is gone. What remains isdownstream.patch, applied through the samedownstream.pymachinery as before, with every resulting file pinned inDOWNSTREAM-PROVENANCE.json. It makes two changes.Foreground typing. Upstream refuses all foreground typing unless every key the KEY command can press types the US keysym, modifier keys included, which blocks typing under
ctrl:swapcaps,compose:ralt,altwin:swap_alt_winorcompose:102. The patch replaces that up-front check with one that runs the existing per-chord check over exactly the chords Driver types text with (ASCII on the US main block, with and without Shift, astext_actionsin Driver'shyprland_input.rssends them), with Num Lock off and on. A string is still admitted or refused before its first key, and every other key is left to the per-chord check, so underctrl:swapcapsplain text types and Ctrl+A is refused. Stock Omarchy options and theus,<layout>plusgrp:alts_togglesetup Omarchy writes for non-Latin layouts qualify; Dvorak, Colemak, French, German and US International do not.Input-method popups. With input enabled, fcitx5 requests an input method for each of the three seats, and when it exits, which Omarchy's
omarchy-restart-xcomposedoes, Hyprland 0.56.2 can be left with an input-method popup that is still mapped although itswl_surfaceis gone: the popup's surface-destroy handler emits unmap but never clearsm_mapped. Tearing down the input method then updates every popup,CInputPopup::updateBoxdereferences the missing surface, and Hyprland restarts in safe mode, taking the session with it. The patch hooksCInputPopup::updateBoxandCInputPopup::shouldBeRenderedthrough Hyprland's function-hook API so that a popup without a surface is neither placed nor rendered. The hooks are compiled into the module only, installed at load and removed at unload, andhyprctl -j cua:statusreportsime_popup_guard: truewhen both are active. The fault itself is Hyprland's.cua-driver-binstays at 0.28.2, which speaks the same input protocol v3 to this source: Driver 0.28.3 through 0.32.0 refuse desktop screenshots on Hyprland when more than one output is active, or when the only output is away from 0,0, where 0.28.2 captures (trycua/cua#4161).🤖 Generated by Opus 5.5 in Claude Code. Reviewed by Codex XHigh.