Introduce a :spellcheck module (JNI Hunspell via dlopen) and SpellcheckContextMenu
for red-wave underlines plus Cut/Copy/Paste suggestions. Jewel uses ContextMenuDivider
via ProvideJewelSpellcheckMenu. macOS and Windows remain no-ops until implemented.
Windows-first implementation over the ANGLE backend; no-op elsewhere.
- TextureView composable: composites an external D3D11 texture inside
the Compose scene (true z-order, clipping, transforms). Import opens
the producer's legacy DXGI shared handle on ANGLE's own device
(EGL_EXT_device_query) and binds it through an EGL_D3D_TEXTURE_ANGLE
pbuffer + eglBindTexImage onto a GL texture that Skia adopts.
- TextureViewController.markFrameAvailable() (any thread): draw-only
invalidation, zero recompositions per producer frame.
- Automatic synchronization: producers with an IDXGIKeyedMutex get a
tear-free staging copy (AcquireSync 0 -> CopyResource -> ReleaseSync 0
on ANGLE's device); plain MISC_SHARED textures are sampled zero-copy.
- Shared import registry: N TextureViews on one source share a single
pbuffer/GL texture/Skia image and one staging copy per frame.
- filterQuality, contentScale + alignment parameters (clipped drawing).
- D3D11TestTextureProducer (own device, HW/WARP, optional keyed mutex,
animated test pattern) + Texture tab in tao-demo exercising
contentScale, filterQuality, both sync modes and the recomposition
counter.
Replace hand-rolled nucleus_tao_a11y COM projector with AccessKit on Windows,
share wire/decode path with Linux, and add golden tree + keyboard/event CI probes.
Probes now assert the advanced A11yTab sections, not just the basics:
- disabled button: role survives AND the disabled state projects
(AX: AXButton + AXEnabled=false; UIA: IsEnabled=false; AT-SPI: no
STATE_ENABLED)
- custom actions: labels ride the a11y channel and are performable
(AX action names; AT-SPI doAction('Mark as read') round-trip -> counter)
- live region: pressing 'Update status' surfaces the new status text
- toggleable without an explicit role: STATE_CHECKABLE / TogglePattern
- heading role (AT-SPI)
- slider Value interface set/read (AT-SPI)
Also fixes a REAL a11y bug the new assertions caught: A11yButton's disabled
branch used semantics{} without mergeDescendants (unlike the enabled
clickable path), so the label stayed a separate enabled static-text node and
the disabled button projected unlabeled — VoiceOver read 'Cannot press' as
plain active text. Local AX probe: 7/7 PASS.
Move all top-level demo/sample modules into a single examples/ directory with
uniform <topic>-demo naming (example → nucleus-demo, sample-tao → tao-demo,
jewel-sample → jewel-demo, etc.), and update every CI workflow, script, and doc
that referenced the old Gradle paths.
Add examples/compose-demo: a port of bitsycore/compose-desktop-native's demo
running on the Tao backend with Material 3 decorated windows, FileKit file
dialogs, Navigation 3, and GraalVM native-image config. Screens relying on
Material 3 Expressive (Compose 1.12) are omitted to stay on the repo's 1.11.x.