Skip to content

ci: add decorated-window-tao native build to all workflows#234

Closed
kdroidFilter wants to merge 189 commits into
mainfrom
nucleus-2.0
Closed

ci: add decorated-window-tao native build to all workflows#234
kdroidFilter wants to merge 189 commits into
mainfrom
nucleus-2.0

Conversation

@kdroidFilter
Copy link
Copy Markdown
Collaborator

Summary

  • Add Rust toolchain setup (dtolnay/rust-toolchain@v1) for Windows, macOS, and Linux in build-natives.yaml
  • Add libgtk-3-dev to Linux build dependencies
  • Build, verify, and upload all 30 Tao native binaries (6 per platform × 2 architectures)
  • Wire decorated-window-tao artifact downloads into all 6 consumer workflows
  • Add 30 EXPECTED entries in pre-merge.yaml and publish-maven.yaml

Files changed

  • build-natives.yaml — 3 new build blocks (Windows, macOS, Linux)
  • pre-merge.yaml — download step + verify entries
  • publish-maven.yaml — download step + verify entries
  • publish-plugin.yaml — download step
  • test-packaging.yaml — download step
  • test-graalvm.yaml — download step
  • release-graalvm.yaml — download step

Test plan

  • YAML syntax valid on all 7 files
  • CI passes on nucleus-2.0 branch
  • All 30 native binaries present after build-natives completes
  • preMerge passes with downloaded artifacts

🤖 Generated with Claude Code

kdroidFilter and others added 30 commits May 10, 2026 22:11
- Add decorated-window-tao module with Rust/tao native bridge and Metal rendering on macOS
- Add sample-tao showcase
- Document Microsoft Store packaging requirements (identity, minVersion)
- Ignore tmp/ research clones
- Replace diagnostic nativeDiagView with production text overlay mechanism
- Add NSTextView overlay that AppKit's _NSKeyBindingManager recognizes for
  press-and-hold/accent picker engagement while forwarding input to TaoView
- Add nativeAttachTextOverlay and nativeFocusTextOverlay for lifecycle control
- Route key events through overlay when TextField focused, back to TaoView on blur
- Update TaoPlatformContext.startInputMethod with proper try-finally cleanup
- Implement nativeSetAlwaysOnTop in Rust JNI bridge to call tao::Window::set_always_on_top
- Add setAlwaysOnTop() method to TaoWindow public API
- Add demo toggle in ActionsTab to test always-on-top behavior
…nTop

- Add onPreviewKeyEvent callback parameter to DecoratedWindow for custom key handling
- Wire previewKeyHandler to both macOS and Windows SceneHost implementations
- Apply alwaysOnTop to Windows platform variant
- Update sample demo to wire onPreviewKeyEvent and add debug logging UI
- Document that parameters matching AWT backends for module-swap compatibility
- Implement nativeSetFocusable in Rust JNI to control window focus ability
- Add setFocusable() method to TaoWindow
- Wire focusable parameter through DecoratedWindow function (Phase 2b)
- Add demo UI toggle for focusable behavior and log focus state changes
- Add PainterToRgba utility to convert Compose Painter to RGBA pixel buffer
- Implement nativeSetIcon and nativeSetMinimumSize in Rust JNI
- Add setIcon() and setMinimumSize() methods to TaoWindow
- Wire icon and minimumSize parameters through DecoratedWindow
- Add onKeyEvent handler (post-filter) in addition to onPreviewKeyEvent
- Update scene hosts to wire both key handlers
- Rename DecoratedWindow to openDecoratedWindow (imperative function)
- Add DecoratedWindowComposable: reactive @composable variant with state updates
  via LaunchedEffect for title, alwaysOnTop, focusable, visible, minimumSize, icon
- Add TaoMainDispatcher: custom CoroutineDispatcher queuing to Tao event loop
- Add TaoApplicationCompose: composable variant of taoApplication with proper
  Compose runtime integration, frame clock, and global snapshot management
- Update sample Main to demonstrate composable API with reactive window state
- Add nativeSetInnerSize and nativeSetOuterPosition to NativeTaoBridge
- Implement setInnerSize() and setOuterPosition() in TaoWindow
- Add MOVED event constant (physical pixel coordinates in tao Event)
- Wire reactive size/position to DecoratedWindowComposable via LaunchedEffect
- Update sample to demonstrate window size/position state binding
- Detect double-tap on title bar using ViewConfiguration timing thresholds
- Toggle window maximized state on double-tap (mirrors decorated-window-jni)
- Prevent native double-click handlers from firing by consuming Press events
- Wire both min and max tap times for platform-consistent double-click detection
- Implement nativeSetFullscreen in Rust JNI
- Add setFullscreen() and isFullscreen property to TaoWindow
- Wire fullscreen state to DecoratedWindowComposable via LaunchedEffect
- Add demo toggle for fullscreen in ActionsTab
- Implement nativeIsFullscreen in Rust JNI to query fullscreen state
- Add isFullscreen property to TaoWindow for reactive UI binding
- Switch jewel-sample from decorated-window-jni to decorated-window-tao
- Move IntUiTheme inside DecoratedWindow content for proper CompositionLocal propagation
- Use Tao's TitleBar with Jewel theme colors (panelBackground, contentColor)
- Remove isNewContextMenuEnabled flag so Jewel can override context menu via LocalContextMenuRepresentation
- TitleBarView now uses Tao API but maintains Jewel styling and interactive components

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Remove imperative taoApplication() function
- Rename taoApplicationComposable to taoApplication as the canonical entry point
- Make openDecoratedWindow internal (users call @composable DecoratedWindow)
- Simplify ApplicationScope to interface only
- Update sample Main to use new taoApplication signature
- Add TaoAccessibility.kt with node descriptors (roles, flags, actions, bounds)
- Add TaoSemanticsObserver to walk Compose semantics tree and push to native
- Implement JNI bridge for a11y attachment, snapshots, focus events
- Add objc/a11y.m with NSAccessibility integration and VoiceOver callbacks
- Wire accessibility to TaoComposeSceneHost attach/detach lifecycle
- Support roles: button, checkbox, text field, slider, heading, etc.
- Forward VoiceOver actions back to Compose semantics via TaoAccessibilityRegistry
- Add selectionStart/End to TaoA11yNode for text selection tracking
- Implement setText action in VoiceOver (edit text fields via screen reader)
- Add JNI callback dispatchA11ySetText for native→Java text updates
- Improve snapshot serialization: version bump, fixed per-node size
- Wire onSetText handler in TaoAccessibilityController
- Support editable text fields fully: read, navigate, modify via accessibility
- Create A11yTab with button, checkbox, switch, radio, slider, text field
- Wire Compose semantics (role, contentDescription, toggleableState, etc.)
- Each control shows visual feedback for AX action effects
- Enables system-level testing via osascript/VoiceOver end-to-end validation
- Add to sample-tao Main navigation tabs
- Fix rect_to_screen to handle non-flipped NSView (Tao 0.35 default)
- Manually flip Y coordinate when source view is not flipped
- Fix hit test Y flip for non-flipped views to match stored frame orientation
- Improve comments on coordinate system conversions (top-left vs bottom-left)
- Prevents misaligned accessibility hit tests on non-flipped TaoView
- Add REQUEST_FOCUS, SCROLL_UP/DOWN/LEFT/RIGHT action bitmasks
- Wire Compose semantics: RequestFocus, ScrollBy, PageUp/Down/Left/Right
- Map scroll semantics to ScrollArea role for proper VoiceOver routing
- Synthesize scroll direction actions from available semantics
- Handle page actions (preferred) falling back to ScrollBy with viewport heuristics
- Implement native scroll callbacks in a11y.m (up/down/left/right)
- Add MODAL, LIVE_REGION_POLITE, LIVE_REGION_ASSERTIVE flags to TaoA11yFlag
- Add DISMISS action for closing modal dialogs (VO+Esc binding)
- Wire Compose IsDialog, LiveRegionMode, and Dismiss semantics
- Implement native dismiss callback in a11y.m
- Add test UI: live region with status updates + modal dialog example
- Enable full accessibility for modals and dynamic announcements
- Add SetSelection action and dispatchA11ySetSelection JNI callback
- Wire Compose SetSelection semantics in TaoSemanticsObserver
- Implement native setSelection callback in a11y.m
- Enable VoiceOver text selection in editable fields
- Map VoiceOver selection to Compose traversalMode=false (direct set)
- Add nativeA11yIsVoiceOverRunning() to check if VoiceOver is active
- Add nativeA11yIsActive() to check if any a11y client has touched the tree
- Implement NSAccessibility init/teardown and activity tracking in a11y.m
- Enable optimization pathway to skip pushes when no client listening
- Document timing constraints for future gating implementation
- Add custom action support (VO+Cmd+. menu in VoiceOver)
- Wire Compose customActions semantics to NSAccessibility
- Implement native custom action callbacks with action index routing
- Add JNI callback dispatchA11yCustomAction for native→Java dispatch
- Add test UI demonstrating custom actions on notification element
- Extends a11y API to include application-defined context menu
…cing

- Consolidate FlushingMainDispatcher into global TaoMainDispatcher
- Remove manual frame throttle (16ms cap) — rely on CAMetalLayer vsync
- Auto-pump TaoMainDispatcher on every MAIN_EVENTS_CLEARED tick
- Send Snapshot.sendApplyNotifications() after pumping dispatcher
- Prevents animation freezing by ensuring state writes trigger redraws
- Mirrors Compose Desktop's FrameDispatcher and Skiko patterns
- Replace time-based resync with event-driven (native signals when needed)
- Add nativeA11yConsumeResync/nativeA11yNotePushed for handshake
- Add table, row, cell accessibility roles for structured data
- Implement direct onScrollBy handler for fine-grained scroll control
- Simplify maybeForceResync to no-op (native handles coordination)
- Reduce a11y snapshot traffic: only push when client active or requested
…omposeSceneHostLinux

- Eliminated unnecessary debug `System.err` outputs.
- Removed `moveLogCnt` variable from `onPointerMove`.
…imize scene rendering

- Replace XSync with XFlush to prevent NVIDIA deadlocks during rapid resizes.
- Coalesce frequent resize/scale events to reduce X11 round-trips.
- Cache Skia render targets to avoid excessive GL surface reallocations.
- Add deferred native resize handling tied to redraw events for efficiency.
- Ensure proper cleanup of cached surfaces during context detachment.
…DPI-scaled)

NativeView passes physical pixels straight from Compose's coords.size,
but the bridge wrapped them in dpi::LogicalSize — wry re-applies the
display's DPI scale factor on top, ending up 1.5x–1.75x too large on
hidpi screens. Switch to PhysicalSize/PhysicalPosition.
…r put_Bounds(x,y,w,h)

wry on Windows attaches CoreWebView2Controller directly to the parent
HWND (no intermediate hosting HWND). SetWindowPos on the HWND we
returned has no visual effect — what positions the WebView is the
controller's put_Bounds(rect).

Adds NucleusPlatformView.setBounds(x, y, w, h) (default no-op so macOS
NSView and Linux GtkWidget paths stay unchanged) and HwndEmbedding
calls it after setFrame/resize. The WebViewTab Windows branch routes
through nativeSetBounds(handle, x, y, w, h) which calls
controller.put_Bounds(PhysicalPosition(x, y), PhysicalSize(w, h)).

Previously the WebView was stuck at top-left because nativeSetBounds
hard-coded position (0, 0).
The previous attempt had each overlay/popup HWND own its own HGLRC,
joined to the host's share group via wglCreateContextAttribsARB(..,
hostHGLRC, ..). NVIDIA's WGL ICD reproducibly crashed nvoglv64.dll
inside the host's flushAndSubmit on the frame after a sibling HGLRC
was created in the process — even with identical pixel formats and
resetGLAll on every cross-context switch.

Single-HGLRC: every overlay/popup HDC reuses the HOST's HGLRC. wgl
gives every overlay HDC the host's HGLRC at gl_init time;
nativeMakeCurrent does wglMakeCurrent(overlayDC, hostHGLRC) — same
context, just a different draw target. Skia keeps a single shared
DirectContext (the host's), exposed via TaoPopupHostWindows.hostDirectContext.
resetGLAll() between HDC switches handles the default-framebuffer
state delta.

Side effects:
 - The overlay HWND no longer needs to delete its HGLRC on destroy.
 - DwmEnableBlurBehindWindow + DWM polish (corner radius, dark mode,
   four-sided shadow) still applied per overlay HWND so DWM honors
   their alpha individually.
 - Removes the kill-switch added previously: overlay can now run
   unconditionally on Windows.
…ow move via TaoWindow.onMoved

The previous owner-subclass approach (intercept WM_WINDOWPOSCHANGED on
the Tao main HWND, batch-reposition overlays via DeferWindowPos) didn't
fire reliably — likely the chained-subclass install on top of Tao's
deco subclass had ordering issues we couldn't diagnose remotely.

Replaces it with a Kotlin-side hook: TaoComposeSceneHostWindows
subscribes to TaoWindow.onMoved, fires a registered list of move
callbacks. NativeViewOverlayControllerWindows + TaoPopupSceneLayerWindows
each register a callback that re-issues nativeSetOverlayFrame /
nativeSetFrameInWindow with the cached owner-local coords, which the
native side translates to screen coords via ClientToScreen(owner).

TaoPopupHostWindows gains registerOwnerMoveListener / unregisterOwnerMoveListener.
The dead C-side owner subclass / OwnerNode / repositionOverlaysFromOwnerLocked
machinery is left in place for now — never installed since
nativeCreateOverlay doesn't call getOrCreateOwnerNode anymore.
HTTRANSPARENT from WM_NCHITTEST routes a click via WindowFromPoint
to the next TOP-LEVEL window beneath. For an owned WS_POPUP overlay
above a WS_CHILD WebView (sibling of nothing — child of the overlay's
owner), HTTRANSPARENT routes to the owner (main HWND) — never reaching
the WebView child. Result: clicks outside the NavPill region were
absorbed by the main scene with no visual response, and the WebView
appeared unclickable.

Fix: nativeSetOverlayRegions now also calls SetWindowRgn(overlay, hrgn)
where hrgn is the union of the registered rects. SetWindowRgn restricts
both visibility AND hit-testing to the region — outside it, the overlay
HWND has zero presence. Win32's normal hit-testing (WindowFromPoint
walks the Z-order then dives into ChildWindowFromPoint) reaches the
WebView child directly. Empty region (no NavPill mounted yet) → entire
overlay click-through.

Also adds a memcpy /NODEFAULTLIB shim — MSVC's optimizer turned the
new array snapshot loop into a memcpy call which the link line
otherwise can't resolve.
…erlay HWND

Compose's overlay scene PlatformContext was using PlatformContext.Empty()
which left setPointerIcon as a no-op — hovering a BasicTextField didn't
switch to the IBeam cursor.

Adds nativeSetCursor(overlay, code) JNI export. C side stores an HCURSOR
on OverlayState (loaded from IDC_IBEAM/HAND/CROSS/ARROW), and WM_SETCURSOR
applies it for HTCLIENT hits (the overlay has no border zones). The
overlay's PlatformContext now overrides setPointerIcon, mapping
PointerIcon.Text/Hand/Crosshair to the corresponding cursor codes.
…spatch

Temporary stderr logs to triage why typing in the overlay's BasicTextField
doesn't insert characters even though the field gains focus visually
(border highlight). Two checkpoints:

 1. TaoComposeSceneHostWindows.onKeyEvent — confirms Tao is delivering
    keys to the host and shows how many popupKeyHandlers are registered.
 2. NativeViewOverlayController.windows.kt overlay key handler —
    confirms popupKeyHandlers are walked, shows whether the overlay
    scene consumed the event.

Will be removed once the root cause is identified.
…keys from WebView

WebView2 (Chromium child HWND) grabs Win32 keyboard focus on its
own clicks and holds it. After clicking inside WebView, the main
HWND no longer receives WM_KEYDOWN — Tao's onKeyEvent never fires,
the popupKeyHandlers chain doesn't run, and the focused overlay
TextField never sees the typed character (even though it shows
visual focus).

In the overlay's WM_LBUTTONDOWN/RBUTTONDOWN/MBUTTONDOWN, call
SetFocus(s->owner) before dispatching the pointer event. The overlay
itself has WS_EX_NOACTIVATE so it can't take focus, but moving
keyboard focus to its OWNER (the main HWND) is allowed and routes
subsequent typing through the normal main pipeline → popupKeyHandlers
→ overlay scene → focused TextField.

When the user later clicks the WebView, the WebView's own click
handler calls SetFocus on itself (Chromium does this internally), so
focus moves back to WebView automatically — bidirectional behavior
preserved.
…blur, broaden URL field I-beam

Two follow-ups now that overlay keys + clicks work end-to-end:

1. Focus release: TaoComposeSceneHostWindows hooks window.onFocusChanged
   and fires registered onLost callbacks. NativeViewOverlayControllerWindows
   registers a callback that calls scene.focusManager.releaseFocus(),
   so when the user clicks the WebView (which grabs Win32 keyboard
   focus) the URL TextField's highlight border + caret stop drawing.
   TaoPopupHostWindows interface gets registerOwnerFocusLostListener /
   unregisterOwnerFocusLostListener.

2. I-beam over the whole URL field: BasicTextField only applies
   PointerIcon.Text over the rendered text glyphs (a thin strip in a
   singleLine top-aligned field). Adds Modifier.pointerHoverIcon
   (PointerIcon.Text) on the outer Box of UrlField — matches HTML and
   native text inputs (whole field shows I-beam).

Removes the temporary stderr diagnostics added to triage the keyboard
issue (root cause was Win32 focus being held by WebView2; fixed by
SetFocus(owner) in overlay's WM_*BUTTONDOWN).
…RL field I-beam

Two refinements:

1. WebView2 (child HWND) grabbing Win32 keyboard focus made the Tao
   main HWND fire onFocusChanged(false), which the DecoratedWindow
   chrome interpreted as 'window deactivated' — title-bar dimmed even
   though the window was still in active use. Adds
   NativeTaoWindowsNativeViewBridge.nativeIsFocusInTree(parentHwnd):
   GetFocus() vs IsChild(parent, focused). The chain treats focus
   inside the window tree as still-active. Wired uniformly across
   macOS/Linux/Windows DecoratedWindow paths — the JNI is no-op on
   non-Windows because the native library isLoaded == false there.

2. BasicTextField only paints the I-beam over rendered text glyphs
   (a thin top strip when singleLine + 13.sp inside a 36.dp box).
   Adds Modifier.pointerHoverIcon(PointerIcon.Text, overrideDescendants
   = true) on UrlField's outer Box — the whole pill now shows the
   I-beam, matching every HTML/native text input.
…dress can't find host DLL

Under GraalVM native-image, nucleus_tao_gl.dll is extracted to a
mangled filename — GetModuleHandleW(L"nucleus_tao_gl.dll") returns
NULL, the host accessor function pointers stay NULL, and
nucleus_tao_overlay_gl_init returns FALSE. Result: nativeCreateOverlay
returns 0 and the overlay HWND fails to create.

Fallback: when the cross-DLL accessors aren't resolved, snapshot
wglGetCurrentContext() / wglGetCurrentDC() at gl_init time. The host's
WGL is always current then because nativeCreateOverlay runs mid-render
(Compose composition inside host.onRedrawRequested). GetPixelFormat +
DescribePixelFormat on the current HDC give us the format index + PFD.

Also adds a diagnostic stderr log in setPointerIcon to triage why the
URL field I-beam still only appears at the top pixel.
Implements native Windows touchscreen input handling with Tao `WindowEvent::Touch`. Adds support for touch gestures (scroll, drag, pinch, rotate) by routing per-finger updates to Compose. Introduces `onTouchInput` API in JVM and accumulates active pointer sets for seamless `sendPointerEvent`. Includes necessary scale and pressure adjustments for compatibility with Compose.
Implements native Windows touchscreen input handling with Tao `WindowEvent::Touch`. Adds support for touch gestures (scroll, drag, pinch, rotate) by routing per-finger updates to Compose. Introduces `onTouchInput` API in JVM and accumulates active pointer sets for seamless `sendPointerEvent`. Includes necessary scale and pressure adjustments for compatibility with Compose.
Implements native Windows touchscreen input handling with Tao `WindowEvent::Touch`. Adds support for touch gestures (scroll, drag, pinch, rotate) by routing per-finger updates to Compose. Introduces `onTouchInput` API in JVM and accumulates active pointer sets for seamless `sendPointerEvent`. Includes necessary scale and pressure adjustments for compatibility with Compose.
Implements native Windows touchscreen input handling with Tao `WindowEvent::Touch`. Adds support for touch gestures (scroll, drag, pinch, rotate) by routing per-finger updates to Compose. Introduces `onTouchInput` API in JVM and accumulates active pointer sets for seamless `sendPointerEvent`. Includes necessary scale and pressure adjustments for compatibility with Compose.
Replace windows-rs Rust implementation with C/MSVC for WebView2 integration.
Remove Cargo.toml/build.bat/lib.rs and associated build artifacts.

Key changes:
- Add sidecarFiles support in NativeLibraryLoader for WebView2Loader.dll
- Update NativeView to support DComp-backed views with null HWND
- Modify .gitignore for MSVC build outputs and NuGet packages
- Enable WebView2 CompositionController integration in sample bridge

This enables proper WebView2 embedding without Rust toolchain dependency.
- Remove trailing comma from clip modifier
- Fix indentation for border modifier and Box content
- Standardize spacing for NativeView parameters
- Correct alignment of factory, modifier, cornerRadius, and update blocks
…esize

Two independent writers were competing for the overlay NSView's frame
during a live resize: AppKit's autoresizingMask (immediate, per-resize-
tick) and Compose's explicit setFrame committed inside the host's
interop CATransaction (one frame later). The overlay's drawn region
jittered between both each tick.

Drop the overlay's autoresizingMask so Compose owns its frame end-to-
end, and route the Metal layer resize + ComposeScene size update
through the same scheduleInterop block as nativeSetOverlayFrame so they
all commit atomically.
…rame on macOS

`nativeAttachOverlay` was replacing the host view's backing layer
(`view.layer = layer`), which makes the view layer-HOSTED. AppKit only
auto-syncs `layer.position` to `view.frame.origin` for layer-BACKED
views (where AppKit creates the backing layer itself). The hosted
CAMetalLayer therefore stayed at position (0, 0) regardless of the
host view's frame, so the rendered Compose surface was offset by
exactly `view.frame.origin` from where the AppKit-managed sibling
subview rendered — visible as a ~25 px misalignment between the
overlay and the embedded native view.

Switch to layer-backed + sublayer (`[view.layer addSublayer:layer]`).
AppKit owns the host view's backing layer and keeps it correctly
placed; the CAMetalLayer follows live-resize via
`kCALayerWidthSizable | kCALayerHeightSizable` autoresizing.
Adds a new "SwiftUI" tab that embeds a real SwiftUI view inside a
Compose layout via NativeView. The SwiftUI side is a flat Swift
dylib whose entry points are `@_cdecl`-exported symbols; the Java
side calls them directly through `java.lang.foreign.*` (Linker /
SymbolLookup / MethodHandle), with no JNI shim.

A Compose overlay floats on top of the SwiftUI surface with a small
counter pill (+ / − / ↺) whose state is mirrored into the SwiftUI
`@Published` model on every change.

* `swift_view.swift` — `NSHostingView` wrapping the SwiftUI view +
  five `@_cdecl` exports (create / view / set_counter / set_hue /
  release).
* `build-swiftui.sh` — emits `libsample_tao_swiftui.dylib` for both
  arm64 and x86_64.
* `SampleSwiftUIBridge.kt` — extracts the dylib from resources,
  resolves the symbols via FFM, exposes typed wrappers.
* `SwiftUITab.kt` — Compose tab UI; drives the SwiftUI model with
  `snapshotFlow`.
* sample-tao bumped to JVM 21 + `--enable-preview` (FFM is preview
  in 21, stable in 22). Lower modules stay on 17.
…umentation

Removes three `[NucleusOverlay]` NSLog calls that traced
`mouseDown` / `becomeFirstResponder` / `resignFirstResponder` on
the macOS native overlay view. They were left over from the
overlay focus rework and now spam the console on every click.
…reen

AppKit's fullscreen transition (`willEnterFS`) changes the title bar to
be visible and non-transparent to run its standard animation, but does
not automatically revert these properties. This explicitly restores
`titlebarAppearsTransparent = YES` and `titleVisibility = NSWindowTitleHidden`
so embedded views like WKWebView aren't pushed down by an opaque band.

Additionally, removes the call to `reinstallToolbarIfNeeded()` when entering
fullscreen. The invisible toolbar exists solely to enable large corner
radii on macOS 26, which is irrelevant in fullscreen mode, and reinstalling
it forces a tall opaque toolbar band that obscures Compose content.
…reen

Keep the invisible NSToolbar attached across fullscreen transitions
instead of detaching/reattaching, and toggle its visibility off in
fullscreen and back on in windowed mode. Detaching the toolbar made
the macOS 26 large corner radius disappear after exiting fullscreen
(and reinstalling in didEnterFS pushed the contentView down with a
visible white strip above the Compose title bar). Hiding the toolbar
collapses that band while preserving the corner-radius opt-in.
…band during entry animation

Previously the invisible NSToolbar's chrome was only collapsed in
didEnterFS (after the entry animation finished), so the white toolbar
band remained visible above the Compose title bar throughout the
transition. Move the visibility toggle into willEnterFS / willExitFS
so the toolbar is in its final state before each animation runs:
- willEnterFS hides toolbar before AppKit kicks off the entry anim
- willExitFS restores it before the exit anim, so the large corner
  radius is already in place throughout the windowed-mode return.
… white band

Reverts all of today's iterative attempts (chrome flag flips, toolbar
visibility toggling, willEnter/willExit timing tweaks) which each
introduced their own regressions (corner-radius lost on exit, glitches
during transition). The earlier removal of the toolbar in willEnterFS
to avoid the entry-animation glitch is preserved.

The single targeted change: do not call reinstallToolbarIfNeeded()
inside didEnterFS. The toolbar is unnecessary in fullscreen anyway
(its only role is to opt the window into the macOS 26 large corner
radius, irrelevant on a screen-spanning window) and reinstalling it
makes AppKit allocate a tall opaque band at the top of the contentView
— visible as a white strip above the Compose title bar. didExitFS
already reinstalls via the kTaoHadToolbarKey flag so windowed-mode
chrome restores correctly.
Add Rust toolchain setup and build/verify/upload steps for the Tao
backend's 30 native binaries (6 DLLs/dylibs/libs × 2 archs per platform)
to build-natives.yaml, and wire artifact downloads into all six consumer
workflows (pre-merge, publish-maven, publish-plugin, test-packaging,
test-graalvm, release-graalvm).
@kdroidFilter
Copy link
Copy Markdown
Collaborator Author

Closing in favor of a feature branch targeting nucleus-2.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant