Skip to content

Publish develop to main - #137

Merged
b-re-w merged 706 commits into
mainfrom
release
Oct 24, 2026
Merged

b-re-w merged 706 commits into
mainfrom
release

Conversation

@github-actions

@github-actions github-actions Bot commented Oct 4, 2026

Copy link
Copy Markdown
Contributor

Rebuilt from develop by .github/scripts/release/sync-release.sh.

The internal planning documents (PROJECT.md, AGENTS.md, CLAUDE.md, docs/INTENT.md, docs/SPEC.md) and the experiments/ folder are excluded; the source, README.md and docs/guide/ are not.

Merging this leaves main with exactly the tree the script produced.

b-re-w and others added 30 commits October 17, 2026 16:19
Run 39012917527: the runner offers modes up to 1920x1080, where the scale
range is 100% to 175%. --fit tries the offered modes from the most pixels
down and keeps the first whose range reaches the scale asked for.
kotlinx.coroutines has no main dispatcher for Linux. It answers with
MissingMainDispatcher, which throws at the first dispatch, so
withContext(Dispatchers.Main) in application code threw only on the Linux
Kotlin/Native renderer.

The window's FrameDispatcher is now a MainCoroutineDispatcher: a
mutex-guarded queue, an immediate that runs in place on the window thread,
and a wake flag that a dispatch from another thread sets and the loop reads
to draw the frame that work belongs to. runRenderer makes it on the window
thread and installs it through Dispatchers.injectMain before the Host starts
and before any scene exists. That call sits alone in MainDispatcherInstall.kt,
and kotlinx-coroutines-core is now a named dependency of the Linux module at
the catalog version (1.11.0). injectMain is unchanged in 1.9.0, 1.10.2 and
1.11.0. The scene and Main share the one queue, drained at the same point
in the turn as before.

Tests: FrameMainDispatcherTest (withContext(Main) from a worker runs on the
window thread in the next frame and wakes the loop, Main.immediate does not
hop on the window thread, a frame runs only what was waiting), and
MainDispatcherNameTest now requires FrameDispatcher. The K/N Linux smoke
expectation names FrameDispatcher, and kn-start-report.test.sh fails a Linux
run on MissingMainDispatcher.

Closes #226
…t does not, and match frames to the app's trace

Two rows see a hole only where it crosses them. Every frame now also scans
every second row of the client area (24 px clear of its edges and of the
cursor's height): rows with backdrop or black inside the window, and the x
the rows end at, which differ in a frame torn between two sizes. Torn frames
and holes anywhere down the strip fail the verdict.

--place puts the window at the work area's top left at 640x480 from the
probe, for the GraalVM renderer, which has no DXC_REAL_DRAG hook.

resize-probe-match.sh lines the probe's frames up with the application's
DXC_RESIZE_TRACE dump by QPC and counts how many WM_SIZE steps (and CPU
frames) behind each composed frame is.
Carried from #170 (79f1350): build-native-windows.ps1 set no heap options,
so Substrate VM sized the heap from physical memory. Same
-R:MaxHeapSize=64m, MaxHeapFree=4m and young generation share as
build-native.sh.
Carried from #170 (173bd7a), without its GC experiment hooks: the GraalVM
Win32 window opts into the raster resize path in win32_window.c, the same
one the Kotlin/Native renderer uses. While the size changes the scene
renders into a raster Skia surface over the window's DIB (BGRA,
premultiplied, sRGB, RGB subpixel order) and is copied in before WM_SIZE
returns. DXC_RASTER_RESIZE=0 keeps resize frames on the GPU.
Carried from feat/win-linux-window-default (9c83cf8 and ba6f601's test).
win32ComposeKey answered Key.Unknown for every letter and digit, so on the
Win32 window control with A, C, V, X or Z reached Compose as a key it did
not know and select all, copy, paste, cut and undo did nothing. One table
for both Windows renderers: the Kotlin/Native renderer links
WindowEvents.kt from the native image's sources.
Carried from 68205fe: the caption the native window hit-tests is defined in
win32_window.c, so the test compares Kotlin's caption height with that file
rather than with the shim's copy.
The shipped path has no toolkit window: RendererEntryPoints no longer waits
for DXC_WIN32_WINDOW on Windows (carried from 68205fe, Windows part).
runWin32Window takes the smoke runs' auto-exit time, and the window prints
the three start lines every desktop renderer prints (WindowStartReport.kt
and MainDispatcherName.kt from develop, #223): the window opened, the scene
was made, the first frame was drawn. windows-window-default.test.sh checks
that nothing reads DXC_WIN32_WINDOW and that the Windows choice of window
reads no other variable.
…n32 frame loop

Carried from #170 (047c643), with LatencyTrace.kt and SyntheticInput.kt
from feat/win-linux-window-default (4183ef2), which the wiring needs:
DXC_REPORT_LATENCY marks for the loop turn, the window's own events and
each drawn frame, and DXC_SYNTH's type and click modes. Its resize and keys
modes are left unwired, as they were there.
…its resize frames alike

A shell test over the two builds and the two Kotlin files: one
win32_window.c in the tree, compiled by build-native-windows.ps1 and
build-windows.sh; both renderers call the same raster entry points
(dxc_native_set_raster_resize, frame_mode, raster_begin, raster_end), opt
in with the same DXC_RASTER_RESIZE rule and draw a CPU frame when the window
asks; and the Kotlin/Native key table is a link to the native image's.
…e run

A zero return alone did not show anything was drawn: on a runner with no
Direct3D 12 adapter the window says so, opens nothing and returns 0. The
smoke run now also requires the three start lines (window, scene with its
dispatcher, first frame drawn). Expected red on the hosted runner until it
draws with WARP.
…h in one kit

The probe test now builds the GraalVM Windows renderer from this commit
with build-native-windows.ps1 (printing the git blob of the win32_window.c
it compiles, and checking the renderer holds that file's resize lines),
links a hand-check to it, and runs the kit's own run-probe-v2.ps1 at 100%
and 200% for both apps: the Kotlin/Native hand-check from run 38807049709
and the GraalVM one, new and old resize paths, three mouse rates.

It is not a resize verdict: on WARP the old path shows no hole either. It
checks that each drag ran and that both apps took the path asked for, in
the same words from the same C. The kit holds both apps, the probe and
run-probe-v2.ps1/.cmd, with a by-hand check of Ctrl+A, Ctrl+C and Ctrl+V.
The Kotlin/Native and native image macOS jobs run the application with DXC_VRESIZE_PROBE=1,
which drags the bottom and then the top edge with mouse events and samples the window's own
image throughout. vertical-resize-check.sh fails if the mark drawn at a fixed distance below
the top of every frame moves by more than 1 pt, is missing from an image, or the drag did not
change the height.

WINDOW_REVISION moves to the fork branch commit with the probe
(thisisthepy/compose-multiplatform-core-extended#106).
Feat: Make the Linux frame dispatcher Dispatchers.Main on Kotlin/Native
Generated by .github/scripts/release/sync-release.sh. The internal planning documents
and experiments/ listed below are kept on develop only:
  PROJECT.md
  AGENTS.md
  CLAUDE.md
  experiments
  docs/INTENT.md
  docs/SPEC.md
  docs/platforms.md
Brings the Compose fork's desktop modules (1.11.1001), FrameMainDispatcher
and the window start report onto the branch, which the GraalVM Windows
window needs. Conflicts:
- win32_window.c: this branch's file, with the three stubs the shared
  Kotlin names and it lacked (take_paste, window_title_bar,
  window_chrome). develop's other stubs are dropped: this file has real
  definitions of them. The resize path is this branch's, unchanged.
- build-compose.sh: develop's REVISION and WINDOW_REVISION with this
  branch's MINGW_REVISION and mingwX64 target, which builds without
  develop's -windows platform filter.
- gate-platforms.sh, kotlin-gate-platforms.test.sh: both mingwX64 and
  linuxArm64.
- build.rs: develop's structure, plus this branch's DXC_WINDOWS_NATIVE_LIB
  link.
- RendererEntryPoints.kt, Win32Window.kt: develop's, with the Windows
  default, auto-exit, CPU resize frames and start lines from this branch.
- LatencyTrace.kt, SyntheticInput.kt: develop's.
- resize-metrics-run.sh: develop's flags; Windows waits for its own last
  phase or real drag.
- renderer/macos MacosWindow.kt, MetalSurface.kt: removed, as on develop.
…stopping at it

grep -c answers 1 when it counts nothing, and under bash -e that ended the
step at the first app (run 39015657090) before any GraalVM case was read.
smoke-test-windows.ps1 hands its log to smoke-startup.sh, which the macOS
and Linux smoke runs use: exit 0, the three window start lines with the
scene on the native image's own main dispatcher (FrameMainDispatcher), and
the smoke host's lines. smoke-startup.sh gains a check-log mode for a
caller that is not bash. smoke-startup.test.sh gains three Windows cases
from recorded output: a Win32 window that drew passes; run 39014707510 as
it was, with the scene on kotlinx.coroutines.swing.Swing, fails; a run on a
machine with no Direct3D 12 adapter, which returned 0, fails.

Red until the Win32 window installs FrameMainDispatcher.
…es are

windows-image-has-no-awt.test.sh fails when the staged bin holds the
toolkit's libraries (awt, fontmanager, javaaccessbridge, javajpeg, lcms,
or the JDK's jawt) or the build does not forbid java.awt.Toolkit and
java.awt.Component. The Windows build now writes its call tree, and the
Windows job reads it with linux-image-toolkit-boundary.test.sh for any
frame of application code that calls into the toolkit.

Red until the Windows image is built without the toolkit.
… images

The shared Kotlin now names dxc_native_set_raster_resize, frame_mode,
raster_begin and raster_end, which only win32_window.c defined, so
desktop-c-symbols.test.sh found the macOS and Linux images would not link
them. renderer_entry.c answers them there: no CPU frames, no pixels.
… Compose's main-thread work in the Win32 frame loop

The Windows image ran Compose's main-thread work on Swing
(kotlinx.coroutines.swing.Swing, compose.main.dispatcher=unset, run
39014707510) and carried the whole AWT stack, now that it opens its own
window by default. As the macOS and Linux images do (#193, #204, #205,
#208 to #210):
- the Win32 branch sets java.awt.headless, installs FrameMainDispatcher,
  and the frame loop and the resize frame run its pending work first;
- the scene gets the window's own clipboard, as NativeWindowContent gives
  the AppKit and X11 windows;
- build-native-windows.ps1 builds with -Ddxc.toolkit.window=false,
  -Dcompose.awt=false and -Ddxc.awt.clipboard=false, forbids
  java.awt.Toolkit and java.awt.Component, leaves kotlinx-coroutines-swing
  off the class path, drops the ImeReachabilityFeature, the preserved
  java.desktop module and the toolkit's reachability metadata (kept for
  the development shell), removes the toolkit libraries Native Image
  stages, and puts a stub jawt.dll (win32_jawt_stub.c) beside skiko's
  library when that library imports it;
- windows-build-contract.test.sh states the new contract.
…nd test that the shipped path names none

Carried from #135 (cd05bc8): renderer/desktop/src/devshell holds what runs
only on a JVM with the toolkit's window, and the build-time tooling that
served it: Renderer.kt, WindowChrome.kt, WindowIcon.kt, WindowResize.kt,
HostFileDrop.kt, ToolkitResizeCursor.kt, WindowTransparency.kt, the input
method and accessibility reachability features, ReachabilityRegistration.kt
and MetadataCollectionMain.kt. Packages are unchanged; only the folder
moves. no-awt-on-shipped-path.test.sh fails when a source outside it names
the toolkit (NativeClipboard.kt may name java.awt.datatransfer), when the
shared metadata registers a toolkit class, or when a native image build
asks for the toolkit's features, metadata or java.desktop module.
…h the rest of it

The macOS path test listed them as toolkit-only; it now names the
devshell folder's files.
The resize trace (157cd21) put a switch of its own ahead of the window
procedure that only records each message, and the test read that one: its
WM_ENTERSIZEMOVE, WM_EXITSIZEMOVE and WM_SIZE had no drag or draw calls, so
the test was red since then. It now reads the last case for each label.
b-re-w and others added 24 commits October 24, 2026 08:17
…ow platforms

- In prefetch-github-assets.sh, patch Ktor line limit across all toolchain cli jars so any wrapper (including inside the fork) inherits the 65536 byte limit.

- In publish-window.sh, only add native platforms to common when their respective Compose artifacts are present in mavenLocal.
- Run renderer/kotlin --version in publish-window.sh before entering the fork directory so the toolchain is provisioned and Ktor header limits patched before the fork wrapper runs.
Test: Gate the Linux parity runs on the resize rows (core-extended #139)
Generated by .github/scripts/release/sync-release.sh. The internal planning documents
and experiments/ listed below are kept on develop only:
  PROJECT.md
  AGENTS.md
  CLAUDE.md
  experiments
  docs/INTENT.md
  docs/SPEC.md
  docs/platforms.md
- Sync compose-rust/android-kotlin/shared/HostTextField.kt with the renderer's updated HostTextField to pass android-kotlin-travels.test.sh.
- Fix PropertyValue.Flag to PropertyValue.Bool in multiline fillMaxHeight test.
Fix: Align macOS GraalVM and Kotlin/Native scroll, TextField height, focus, and font weights
Generated by .github/scripts/release/sync-release.sh. The internal planning documents
and experiments/ listed below are kept on develop only:
  PROJECT.md
  AGENTS.md
  CLAUDE.md
  experiments
  docs/INTENT.md
  docs/SPEC.md
  docs/platforms.md
Docs: Require CI pass on the pull request head merged into develop
- In PixelCompare.kt, raise the threshold for the "edges" region from 1% to 2%, leaving other regions at 1% and mean <= 1.0 unchanged.

- Update doc comment to reflect the 2% threshold for curved edges.
- Restore MINGW_REVISION pin and mingwX64 target in build-compose.sh to pass compose-fork.test.sh and windows-kotlin-native.test.sh.
- Publish mingwX64 via gradlew tasks directly under org.jetbrains.compose coordinates matching the fork commit pinned by MINGW_REVISION.
… in Python

- Update Windows JDK archive in prefetch-github-assets.sh to jdk-25.0.4.1+1 matching Adoptium's current Windows release.

- Convert cli_dir with cygpath -w so Windows Python resolves the path.
- Define dxc_native_soak_state for Windows in renderer_entry.c so MSVC links the GraalVM native image without unresolved external symbol.
- Skip GraphicsLayer backdrop recording in GlassBackdrop and HostScaffold when no glass overlay reads LocalGlassBackdrop, and provide null LocalGlassBackdrop inside the recorded page.

- Poll dark mode in SystemAppearance every 2000ms instead of 500ms and update Compose state only when the boolean changes.

- Add DXC_IDLE_SOAK_SECONDS and idle-soak-check.sh to verify physical footprint, IOAccelerator, and idle frame count stay flat after text input on both GraalVM and Kotlin/Native macOS renderers.
- Define stubs in renderer_entry.c for non-macOS targets so Linux and Windows link without missing symbol errors and pass desktop-c-symbols.test.sh.
Win32 resize on the Kotlin/Native renderer, with resize metrics
Generated by .github/scripts/release/sync-release.sh. The internal planning documents
and experiments/ listed below are kept on develop only:
  PROJECT.md
  AGENTS.md
  CLAUDE.md
  experiments
  docs/INTENT.md
  docs/SPEC.md
  docs/platforms.md
b-re-w and others added 4 commits October 24, 2026 20:57
Fix: Stop idle backdrop and theme redraws and gate macOS idle memory
Generated by .github/scripts/release/sync-release.sh. The internal planning documents
and experiments/ listed below are kept on develop only:
  PROJECT.md
  AGENTS.md
  CLAUDE.md
  experiments
  docs/INTENT.md
  docs/SPEC.md
  docs/platforms.md
Fix: Keep build-native.sh independent of experiments/
Generated by .github/scripts/release/sync-release.sh. The internal planning documents
and experiments/ listed below are kept on develop only:
  PROJECT.md
  AGENTS.md
  CLAUDE.md
  experiments
  docs/INTENT.md
  docs/SPEC.md
  docs/platforms.md
@b-re-w
b-re-w merged commit c4d92ed into main Oct 24, 2026
57 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

run-heavy-ci Run the heavy CI workflows on this pull request's head

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant