272 lines
14 KiB
Markdown
272 lines
14 KiB
Markdown
# Optional Cua Hyprland plugin
|
|
|
|
This package targets **Omarchy stable x86_64**, with Inkscape `1.4.4-6` and two independent background-input lanes. Cua's native qualification is recorded in [the kit's qualification record](https://github.com/trycua/cua/releases/download/cua-hyprland-kit-v1.1.0-omarchy-stable-20260910/QUALIFICATION.md) and [Cua #3698](https://github.com/trycua/cua/pull/3698). Omabot replay and Omarchy's merge decision are recorded in [omarchy-pkgs #346](https://github.com/omacom/omarchy-pkgs/pull/346). Scheduling the recipe does not expand the qualified stable target.
|
|
|
|
The plugin is optional. Cua Driver works independently, and installation does not load the plugin or enable input. The package follows the normal edge-to-RC-to-stable promotion path instead of the fast release ring. Its PKGBUILD limits builds to x86_64; only stable x86_64 is a qualified target.
|
|
|
|
## Source and build profile
|
|
|
|
The package uses the [Driver 0.26.1 plugin source](https://github.com/trycua/cua/releases/tag/cua-driver-rs-v0.26.1),
|
|
including the [desktop-fault cleanup repair](https://github.com/trycua/cua/pull/3702).
|
|
It is not a repackaging of the unmodified 0.24.0 plugin.
|
|
|
|
The qualified Driver pairing is `cua-driver-bin 0.27.0-1`, with input protocol v3. Driver 0.27.0 contains the bounded stale-geometry retry validated with this pinned module; its production plugin source is unchanged from the source used here. Discovery protocol v2 is separate. A newer Driver release is a changed pairing and requires affected replay before promotion.
|
|
|
|
Profile `omarchy-hyprland-0562r3`, kit tooling `1.1.0`, and package release `3` pin:
|
|
|
|
- Hyprland `0.56.2-3`, headers `0.56.2`, and measured executable/header hashes.
|
|
- GCC `16.2.1 20260810`, including compiler bytes and emitted ELF identity.
|
|
- Shared runtime `libstdc++.so.6.0.36`, its bytes, and exact ABI package versions.
|
|
|
|
This profile derives from Cua's `omarchy-stable-20260910` profile. Arch's
|
|
Hyprland `-3` package splits out `hyprpm` and changes package dependencies;
|
|
its compositor executable and all 498 header/pkg-config files are byte-identical
|
|
to `-2`. Both executables have SHA-256
|
|
`da8fcacf347bcbed83edc40108c6e2298da095e22246bd764e9bb382786cebb2`.
|
|
The checked-in `PROFILE.json` changes only the profile name, package release,
|
|
and exact Hyprland package version. Compiler, runtime, source, executable,
|
|
and header identities remain unchanged. The download wrapper verifies the
|
|
original kit before deriving the updated profile, recipe, and provenance,
|
|
then verifies every derived member against its recorded digest.
|
|
|
|
The native qualification below was recorded with package release `2` and
|
|
Hyprland `-2`. This packaging update does not claim a new application or
|
|
Driver replay. The `-3` dependency must reach a destination channel before
|
|
this artifact can be installed there; publication still follows edge → RC → stable.
|
|
|
|
The generated `PKGBUILD` identifies the immutable kit download, outer checksum,
|
|
and member checksums. The kit records the full source and tooling revisions,
|
|
profile digest, and source archive/manifest digests. Do not infer compatibility
|
|
from a matching version label or substitute an unreviewed profile.
|
|
|
|
The download wrapper verifies its complete inventory before executing downloaded
|
|
tooling. It preserves the source archive and its historical embedded verifier,
|
|
but explicitly uses the new kit's `profile_verify.py`. Source integrity,
|
|
package-owned headers, pkg-config selection, compiler probes, runtime equality,
|
|
and production flags remain mandatory. Packaging runs all bundled CTests even
|
|
with `--nocheck` or `--repackage`; `--skipinteg` does not bypass recipe checks.
|
|
Production input is built in; experimental signed input and tracing are off.
|
|
|
|
## What is qualified
|
|
|
|
The initial app scope is native Wayland Inkscape `1.4.4-6` with the canonical
|
|
US keymap. Two lanes require independent Driver processes and distinct native
|
|
application clients, not merely two windows. This is concurrency inside one
|
|
desktop account, not multi-user or mutually untrusted-agent isolation.
|
|
|
|
Cua's retained evidence covers background application effects, two-lane overlap,
|
|
third-owner refusal, primary-input preservation, conflicts, stale targets and
|
|
geometry, cancellation, desktop faults, recovery, and cold package transitions.
|
|
Production-package app checks and independent primary observers are separate
|
|
from trace-enabled diagnostics. Cua's retained canonical run
|
|
`433ce968ee164d5e8e3226e800db93a6` recorded all 128 required cells: 87
|
|
deliveries and 41 expected refusals, with no failures or skips; its completion
|
|
report has SHA-256
|
|
`1eda4cc008ea6b27d96c21d58f8041834398a43409642376bafe84ad38f0e112`.
|
|
That historical run used source-built released Driver 0.24.0; earlier real-app
|
|
checks separately used the then-published Omarchy `cua-driver-bin 0.24.0-1`
|
|
executable. A separate later Omabot replay reported 124 passes and four
|
|
failures, plus seven incomplete native cases. Cua subsequently passed those
|
|
four cells with the repair candidate shipped in Driver 0.27.0 and passed all
|
|
seven lifecycle cases. A final exact-release Fleet replay then passed all four
|
|
cells with Driver and harness source `082de4344b731ae4738ddc6a6f13f21bb3c49a85`,
|
|
released Driver binary SHA-256
|
|
`bb1b65394e912246220f9f758c9efbbf6260cec16e3562e62a361fa95329377f`,
|
|
and evidence SHA-256
|
|
`b6c47278a3db398ecbb4d7aed2bce44a467e2af37e6d4ccfc236d1e07aa70af7`.
|
|
See the linked qualification record and PR description for exact artifacts and observation limits. Omarchy replay of the 0.27.0 package pairing is recorded in #346; it does not qualify later Driver releases.
|
|
|
|
Duplicate motion notifications are retained and counted. They are acceptable
|
|
only when pointer identity, coordinates, focus, held input, and foreground
|
|
interaction remain unchanged. Actual motion—including moving away and back—
|
|
fails isolation. After cancellation, an inert agent pointer may remain parked
|
|
if held input is released and authority is revoked.
|
|
|
|
Current LibreOffice Calc `26.8`, Chromium/Electron raw background input,
|
|
XWayland, Unicode/IME, non-US layouts, and modified pointer gestures are outside
|
|
this profile. The plugin does not widen Driver's application admission.
|
|
Foreground input, capture, and accessibility have separate contracts; a
|
|
background refusal never authorizes a hidden foreground fallback or unlock.
|
|
|
|
## Omabot replay before promotion
|
|
|
|
Build the unsigned candidate in edge:
|
|
|
|
```sh
|
|
bin/repo build --package cua-hyprland-plugin --arch x86_64 --mirror edge
|
|
```
|
|
|
|
In a fresh worker matching the reviewed profile:
|
|
|
|
1. Verify the downloaded kit and source identities against the reviewed recipe.
|
|
Record the actual channel snapshot, Driver, compiler, compositor, runtime,
|
|
applications, keymap, and resulting package/module hashes.
|
|
2. Require all bundled tests and native compatibility checks. Do not weaken
|
|
exact dependencies or replace the compositor to make the build pass.
|
|
3. Install through pacman and activate in a fresh session. Replay the declared
|
|
app, two-lane, refusal, primary-input, cancellation, and fault/recovery checks
|
|
against the actual packaged Driver and module. A Cua Fleet result is not an
|
|
Omabot result; matching source alone does not certify different binaries.
|
|
4. Verify restart-based upgrade, rollback, removal, and reinstallation. Retain
|
|
evidence that binds each result to the package and mapped module bytes.
|
|
|
|
After the exact package and Driver pairing passes, advance the signed artifact with `bin/repo advance --from edge --to rc --package cua-hyprland-plugin`, validate RC, and then use `bin/repo advance --from rc --to stable --package cua-hyprland-plugin`. Do not rebuild independently in RC or stable.
|
|
|
|
Portable tests, screenshots, health reports, and a successful build do not
|
|
replace native qualification. Recheck the published Driver package before
|
|
rollout and qualify any changed pairing explicitly.
|
|
|
|
## Activation, updates, and removal
|
|
|
|
The package installs the module at
|
|
`/usr/lib/cua/hyprland/cua-hyprland-plugin.so` and provenance plus the consumer
|
|
verifier under `/usr/share/cua-hyprland-plugin/`. There are no hooks, autoloading,
|
|
configuration edits, or hot replacement.
|
|
|
|
Save your work and exit Hyprland before installing, replacing, or removing the
|
|
package. Install the exact reviewed package from a text console, then start a
|
|
fresh session. Before loading, run the consumer check with this package's derived
|
|
kit-provenance digest:
|
|
|
|
```sh
|
|
python3 /usr/share/cua-hyprland-plugin/profile_verify.py \
|
|
--kit /usr/share/cua-hyprland-plugin \
|
|
--kit-sha256 1391084a903254fb16d251522dba41ae34a06cfa4b2f6b7ba91a3cceeb895921 \
|
|
--consumer /usr/lib/cua/hyprland/cua-hyprland-plugin.so
|
|
```
|
|
|
|
This check requires Python 3.11+, binutils `readelf`, and system `ldd`/`pacman`,
|
|
not a compiler or headers. If it fails, leave the plugin unloaded. It verifies
|
|
installed compatibility, not runtime mapping or input effects.
|
|
|
|
After that check passes in the fresh session, load the module explicitly:
|
|
|
|
```sh
|
|
hyprctl plugin load /usr/lib/cua/hyprland/cua-hyprland-plugin.so
|
|
hyprctl -j cua:status
|
|
```
|
|
|
|
Loading alone does not enable input. Before opting in, save open work and save
|
|
the exact current personal input configuration. The backup command refuses a
|
|
symlinked input file and refuses to replace an earlier backup:
|
|
|
|
```sh
|
|
test -f "$HOME/.config/hypr/input.lua" && \
|
|
test ! -L "$HOME/.config/hypr/input.lua" && \
|
|
test ! -e "$HOME/.config/hypr/input.lua.cua-before" && \
|
|
cp --archive -- "$HOME/.config/hypr/input.lua" \
|
|
"$HOME/.config/hypr/input.lua.cua-before"
|
|
```
|
|
|
|
If `input.lua` is a symlink, stop here: back up and later restore its resolved
|
|
target explicitly instead of using the commands below.
|
|
|
|
The background-input admission guard requires the exact XKB keymap
|
|
`rules=evdev`, `model=pc105`, `layout=us`, empty variant and options, and no
|
|
custom keymap file. Stock Omarchy 4.0.3 English (US) is not that literal
|
|
configuration: it leaves rules and model empty and sets
|
|
`compose:caps,shift:both_capslock_cancel`. Those options make Caps Lock the
|
|
Compose key and both Shift keys the Caps Lock/cancel chord. The required empty
|
|
options restore ordinary Caps Lock behavior and remove both stock shortcuts
|
|
while Cua input is enabled. Any other effective value is intentionally refused
|
|
as `unsupported_layout`; do not weaken or bypass that admission guard.
|
|
|
|
Append this override to `~/.config/hypr/input.lua` so it follows any existing
|
|
input settings. It both selects the exact admitted keymap and enables the
|
|
trusted local transport:
|
|
|
|
```lua
|
|
hl.config({
|
|
input = {
|
|
kb_rules = "evdev",
|
|
kb_model = "pc105",
|
|
kb_layout = "us",
|
|
kb_variant = "",
|
|
kb_options = "",
|
|
kb_file = "",
|
|
},
|
|
plugin = { cua = { enabled = true } },
|
|
})
|
|
```
|
|
|
|
Reload, then read back every keymap value rather than relying on the source
|
|
file alone:
|
|
|
|
```sh
|
|
hyprctl reload
|
|
for name in kb_rules kb_model kb_layout kb_variant kb_options kb_file; do
|
|
value=$(hyprctl -j getoption "input:$name" | jq -r '.str')
|
|
printf '%s=%s\n' "$name" "$value"
|
|
done
|
|
hyprctl -j cua:status
|
|
```
|
|
|
|
The keymap readback must be exactly:
|
|
|
|
```text
|
|
kb_rules=evdev
|
|
kb_model=pc105
|
|
kb_layout=us
|
|
kb_variant=
|
|
kb_options=
|
|
kb_file=
|
|
```
|
|
|
|
A runtime keyword or Lua evaluation without `hyprctl reload` does not reconcile
|
|
the input sockets. Continue only when status also reports input protocol v3,
|
|
input capability, socket paths, and the expected compositor identity. Do not
|
|
disable NumLock; that was required only by a strict qualification observer, not
|
|
by the demonstrated background-input contract.
|
|
|
|
Start Driver with `CUA_DRIVER_RS_ENABLE_WAYLAND=1`. For the activation check,
|
|
use background input in a new disposable Inkscape document to create a text
|
|
object containing `CUA activation check`. Save it under a new temporary
|
|
filename, then verify the text in both a fresh Driver snapshot and the reopened
|
|
saved SVG. Never test against an existing document, and do not automatically
|
|
replay an action with a partial or unknown outcome.
|
|
|
|
After the check, restore the exact saved configuration and reload it:
|
|
|
|
```sh
|
|
command mv --force -- "$HOME/.config/hypr/input.lua.cua-before" \
|
|
"$HOME/.config/hypr/input.lua"
|
|
hyprctl reload
|
|
hyprctl -j cua:status
|
|
```
|
|
|
|
Confirm that the prior keymap values are back and status reports input disabled.
|
|
Retained inert agent pointers can remain until the compositor exits; disabling
|
|
input does not unload the mapped module. If you intentionally keep activation,
|
|
retain the backup until you are ready to perform this exact restoration.
|
|
|
|
Before an incompatible desktop update, remove operator-added plugin activation
|
|
settings, save work, and exit the graphical session. From a text console, run
|
|
`sudo pacman -R cua-hyprland-plugin`, then apply the normal desktop update and
|
|
verify a fresh session without the plugin. Declining removal preserves the
|
|
dependency refusal. Disabling input alone leaves exact dependencies installed;
|
|
do not force an upgrade past them.
|
|
|
|
Retain the previous package with its matching compositor, runtime, Driver, and
|
|
provenance as a rollback set. Restore a consistent set outside the graphical
|
|
session, then repeat the fresh-session consumer and app checks. Do not hot
|
|
unload/reload or replace a mapped module.
|
|
|
|
## Ownership and publication
|
|
|
|
The [agreed ownership split](https://github.com/omacom/omarchy-pkgs/pull/346#issuecomment-5612834061)
|
|
assigns profiles, build kits, plugin fixes, and native input evidence to Cua.
|
|
Francesco (@f-trycua) is the Cua contact through this PR. Omarchy owns package
|
|
integration, dependency-change detection, Omabot validation, and signing and
|
|
publication decisions. Spencer (@spencerbull) and Emir (@emirb) jointly own
|
|
that Omarchy package and release path. Maintenance is best effort, with no
|
|
turnaround commitment.
|
|
|
|
Edge detects upcoming incompatibilities; RC validates the intended stable
|
|
environment. Mirror/channel changes and changes to ABI dependencies, Driver,
|
|
or admitted apps request a new candidate and affected qualification. They do
|
|
not establish compatibility or authorize additional publication channels.
|
|
|
|
This package participates in scheduled builds, but has no upstream polling, AUR synchronization, or automatic rebuild bump. A checked-in version change or missing artifact can queue it for the normal release pipeline. Build selection, promotion, `push`, and `upload-prebuilt` do not supply native qualification or authorize a broader support claim. Do not silently substitute newly rebuilt bytes during signing or publication.
|
|
|
|
Before calling a release complete, install the signed published package on a fresh consumer, verify its signature and package/module digests, and perform a short activation, background-action, and cleanup smoke. Edge and RC artifacts are compatibility checkpoints, not qualified support for those environments.
|