3.7 KiB
GPUI accessibility and input probe
This independent workspace answers one narrow question: can the GPUI version currently used by Zed expose the minimum semantic tree Lumbridge needs for a workspace and terminal pane, while accepting real platform IME input?
Reproducibility
- Upstream:
https://github.com/zed-industries/zed - Commit:
ce48461eaadd16c65c31f835511ab96bd3b6e746 - GPUI license at this commit: Apache-2.0
- Rust: 1.97.1, matching the upstream
rust-toolchain.toml
Both gpui and gpui_platform are pinned to the full commit. This directory is
an independent Cargo workspace, so its toolchain and dependency graph do not
change Lumbridge's root MSRV or release graph.
Semantics under test
The rendered tree contains:
- an application named
Lumbridge accessibility probe; - a stable, externally identifiable
RegionnamedLumbridge workspace; - a stable, focusable
PanenamedLocal terminal pane; selected = trueon the pane;- real GPUI keyboard focus tracked on the pane;
- the description
Needs input: choose whether to run the proposed command; - a
Terminalchild namedTerminal outputfor the pane's content.
Current GPUI exposes these through its AccessKit integration using role,
accessibility_id, aria_label, aria_description, aria_selected,
focusable, and track_focus. The deterministic unit test checks the exact
AccessKit role and properties. The binary compile-checks GPUI's element wiring;
a platform screen reader remains necessary for end-to-end AT-SPI/VoiceOver
validation.
Input and IME proof
The focused pane also installs a real ElementInputHandler<ImeTextReceiver>
during element paint. ImeTextReceiver implements GPUI's
EntityInputHandler, including text queries, UTF-16 selection, marked-text
composition, replacement, unmarking, selection updates, editable length, and
IME candidate bounds. This is the code path GPUI's platform adapters call for
composed operating-system text input.
The backing buffer stores UTF-8 only at valid scalar boundaries and translates the platform's UTF-16 ranges before mutation. Deterministic tests cover:
- replacing a selected decomposed
eplus combining acute accent withé; - a marked decomposed-accent IME composition and commit;
- inserting, selecting, and replacing the multi-codepoint grapheme
👩🏽💻; - collapsed selection placement after every replacement.
These tests prove range conversion and composed-text preservation without splitting UTF-8. An actual keyboard IME on X11/Wayland and macOS remains an end-to-end platform test, not a unit-test claim.
Commands
cargo check --locked
cargo test --locked
cargo clippy --locked --all-targets -- -D warnings
The first command installs the pinned Rust toolchain if rustup does not already have it and downloads Zed's GPUI dependency closure.
On Ubuntu hosts that have only the runtime libraries, checks work with
RUST_FONTCONFIG_DLOPEN=1. Linking a test or binary additionally needs the
unversioned linker names normally installed by libxcb1-dev,
libxkbcommon-dev, and libxkbcommon-x11-dev. The amd-server validation used
temporary symlinks under the ignored target/native-libs directory and set
LIBRARY_PATH to that directory; no system packages or root files changed.
Observed local cost
On amd-server, the first successful check required roughly 90 seconds after installing/fetching, with some Cargo-cache contention from concurrent work. The lockfile contains 691 packages. After check, test, Clippy, and a debug build, the isolated target directory was 4.4 GiB and the debug binary was 535 MiB. The minimal Rust 1.97.1 toolchain occupies 624 MiB. These are development costs, not optimized release measurements.