Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
277 commits
Select commit Hold shift + click to select a range
b30dab2
SwingX compat: shape test against the real SwingX jar, Painter and Ab…
shai-almog Oct 8, 2026
ce974a4
Shared JDK classes: classpath resources, a bundle registry, Propertie…
shai-almog Oct 8, 2026
92c464e
CompatRegistry placeholder: the shape of the class the build generates
shai-almog Oct 8, 2026
71521af
Remap: redirect the members of Class, ClassLoader, Thread, Objects an…
shai-almog Oct 8, 2026
4893f41
Remap: flatten desktop resources and generate the registry the runtim…
shai-almog Oct 8, 2026
730d5aa
SwingX compat: JXPanel with alpha, a background painter and scrollabl…
shai-almog Oct 8, 2026
1b8ada2
Swing compat kernel: input verifier and scrollRectToVisible on JCompo…
shai-almog Oct 8, 2026
1afeddf
Swing compat: JOptionPane, JFileChooser, JColorChooser and ProgressMo…
shai-almog Oct 8, 2026
52f0d41
Merge commit '1afeddfbde' into desktop-compat-layer
shai-almog Oct 8, 2026
3430707
Swing compat: SpotBugs back to zero for the windows and menus classes
shai-almog Oct 8, 2026
c8f75e6
SwingX compat: highlighters, renderers, sort controllers and JXTable
shai-almog Oct 8, 2026
9af202e
SwingX compat: titled panel, header, collapsible and task panes, stat…
shai-almog Oct 8, 2026
987b4e3
SwingX compat: month view, date picker, selection models and prompt t…
shai-almog Oct 8, 2026
63ed6fb
SwingX compat: the painters and the widgets a painter draws
shai-almog Oct 8, 2026
122e0d6
Merge branch 'desktop-compat-layer' into worktree-agent-a663c9a35f02d…
shai-almog Oct 8, 2026
2e914e3
SwingX compat: JXList with sorting and filtering, JXTree, both with h…
shai-almog Oct 8, 2026
6115486
SwingX compat: the column control opens a popup menu that shows and h…
shai-almog Oct 8, 2026
fa53929
JavaFX layer: scene graph, peers, logical units, stages, application …
shai-almog Oct 8, 2026
0704d7e
JavaFX layer: hold the cn1 hooks to a reviewed list, and bring the sc…
shai-almog Oct 8, 2026
a6fb7d9
JavaFX layer: the layout panes
shai-almog Oct 8, 2026
dbfc91b
JavaFX layer: text input, toggles, ranges and the scroll, split and t…
shai-almog Oct 8, 2026
dde8aa2
JavaFX layer: animation and concurrency
shai-almog Oct 8, 2026
37615fe
JavaFX layer: shapes, text, transforms, canvas and image view
shai-almog Oct 8, 2026
2b3b824
JavaFX layer: lists, tables, choice controls, menus, tooltips and dia…
shai-almog Oct 8, 2026
a09fe7e
JavaFX layer: one list of the style names per node family, and select…
shai-almog Oct 8, 2026
c88d353
SwingX compat: SpotBugs back to zero for the SwingX classes
shai-almog Oct 8, 2026
cfe1571
SwingX compat: error pane and listeners, JXFrame and JXDialog, the co…
shai-almog Oct 8, 2026
f7311c4
SwingX layer: JXTreeTable, the tree table models and nodes, and TreeM…
shai-almog Oct 8, 2026
9e8dc14
SwingX compat: SpotBugs entries for the windows, error and tree table…
shai-almog Oct 8, 2026
d7c9b8c
Merge commit '9e8dc14e84' into desktop-compat-layer
shai-almog Oct 8, 2026
ae9c269
Swing compat: showing the caret no longer re-enters the viewport's la…
shai-almog Oct 8, 2026
f3af849
Cast-semantics gate covers the Swing and JavaFX compatibility layers
shai-almog Oct 8, 2026
c2e2ca9
Swing compat: JScrollPane shows scroll bars and corners, and the whee…
shai-almog Oct 8, 2026
4624f74
Swing compat: JTextArea leaves long lines unbroken unless line wrap i…
shai-almog Oct 8, 2026
04528bd
Swing compat: JEditorPane and JTextPane show text/html formatted, wit…
shai-almog Oct 8, 2026
5cb23b0
Swing compat: an editable JComboBox has a text field editor, and a po…
shai-almog Oct 8, 2026
7e9c33b
Desktop layers: the JDK members and classes a device lacks
shai-almog Oct 8, 2026
fd20784
Desktop layers: generate the application's main class from the entry …
shai-almog Oct 8, 2026
09bee4e
Compat integration tests: find unrelocated types, not unrelocated text
shai-almog Oct 8, 2026
8435a25
Desktop layers: relocate the libraries written against Swing or JavaFX
shai-almog Oct 8, 2026
c8e89ff
Swing compat: JList lays out the HORIZONTAL_WRAP and VERTICAL_WRAP or…
shai-almog Oct 8, 2026
c50fd23
Swing compat: Desktop, the system clipboard, image files and ImageIO
shai-almog Oct 8, 2026
d386763
JavaFX layer: style sheet engine, FXML loader runtime, reflection-fre…
shai-almog Oct 8, 2026
1ee99c0
FXML and style sheet compiler: maven/fxml-compiler
shai-almog Oct 8, 2026
33e7542
Merge branch 'desktop-compat-layer' into worktree-agent-a48fe374e1859…
shai-almog Oct 8, 2026
14d930a
Swing compat: UIManager has a look and feel type, installed looks and…
shai-almog Oct 8, 2026
d8d1d43
Swing compat: SpotBugs back to zero for the hardening changes
shai-almog Oct 8, 2026
101e4cb
Merge commit 'd8d1d439aa' into desktop-compat-layer
shai-almog Oct 8, 2026
8908a99
Desktop layers: a Swing sample, and an import that declares what it c…
shai-almog Oct 8, 2026
174916f
Merge branch 'desktop-compat-layer' into worktree-agent-a5847357048a2…
shai-almog Oct 8, 2026
0fa917a
Wire the FXML and style sheet compiler into the Maven and Gradle buil…
shai-almog Oct 8, 2026
2789af6
Merge commit '0fa917aa6a' into desktop-compat-layer
shai-almog Oct 8, 2026
4283a40
Desktop compat: MigLayout links on a device, and Gradle stops shippin…
shai-almog Oct 8, 2026
0a24a2b
PR CI: gate the Swing, JavaFX and FXML compiler modules on SpotBugs
shai-almog Oct 8, 2026
a17368f
Developer guide demos: Swing and JavaFX snippets for the desktop comp…
shai-almog Oct 8, 2026
80e26ea
Developer guide: running Swing and JavaFX applications
shai-almog Oct 8, 2026
e1d17f1
Swing comparison: Table and Tree exist, and Swing code can be built a…
shai-almog Oct 8, 2026
61fbbc9
CLAUDE.md: the desktop compatibility layers and the shared remap
shai-almog Oct 8, 2026
c479070
Desktop compat: the Swing gallery sample runs headless after the remap
shai-almog Oct 8, 2026
7e47f0c
FXML: compile documents after the application's classes, so custom co…
shai-almog Oct 8, 2026
666c744
Desktop compatibility samples: a JavaFX gallery
shai-almog Oct 8, 2026
b40bdb9
Desktop compatibility: both layers in one project, nested Gradle reso…
shai-almog Oct 8, 2026
e2d6541
CI: a workflow for the desktop compatibility layers
shai-almog Oct 8, 2026
b8ea696
Merge commit 'e2d6541fcb' into desktop-compat-layer
shai-almog Oct 8, 2026
d2c649d
Desktop compat workflow: test the FXML compiler module too
shai-almog Oct 8, 2026
21799d4
JavaFX layer: table sorting and editing, rectangular clips, accelerat…
shai-almog Oct 8, 2026
f2b0c28
Desktop compatibility: shim java.io.UncheckedIOException
shai-almog Oct 8, 2026
a773aa3
Gradle: do not ship the nested copy of a flattened desktop resource
shai-almog Oct 8, 2026
d5c4ebf
Merge branch 'desktop-compat-layer' into worktree-agent-a4f43c8600759…
shai-almog Oct 8, 2026
a8cfa4e
Desktop compat: library mode, desktop sources with no application entry
shai-almog Oct 8, 2026
34404fe
JavaFX layer: a stage's form survives a global toolbar; edit events a…
shai-almog Oct 8, 2026
42c6292
Desktop compat: the JavaFX gallery sample runs headless after the remap
shai-almog Oct 8, 2026
9b15bca
Desktop interop docs: FXML compiles after javac, so documents can nam…
shai-almog Oct 8, 2026
1b7c155
Desktop compat: embed Swing and JavaFX in a Codename One application
shai-almog Oct 8, 2026
fbc8801
FxInterop.asComponent takes Object: a typed signature breaks incremen…
shai-almog Oct 8, 2026
94998b9
Screenshot tests for the Swing, SwingX and JavaFX compatibility layers
shai-almog Oct 8, 2026
11096ef
Desktop interop docs: mixing Swing and JavaFX with Codename One code
shai-almog Oct 8, 2026
1a1d7a5
Merge commit '11096ef43e' into desktop-compat-layer
shai-almog Oct 8, 2026
2a62bc7
Desktop compat: copyright headers on the CSS samples, truthful JTable…
shai-almog Oct 8, 2026
b94ac6c
DesktopCompatScenesTest: follow the resource compiler to the late FXM…
shai-almog Oct 8, 2026
7bed833
Desktop compat tests: run on every JDK the layers compile on
shai-almog Oct 8, 2026
ce44417
Swing layer: javax.swing.undo, undoable document edits and the editor…
shai-almog Oct 9, 2026
fd0b10f
Swing layer: internal frames, accessibility, hierarchy listeners and …
shai-almog Oct 9, 2026
67f52ee
JavaFX layer: swipes, touch types, TextFlow, Screen, region shapes, r…
shai-almog Oct 9, 2026
1873af9
JavaFX layer: self-drawn charts (bar, line, area, scatter, pie)
shai-almog Oct 9, 2026
0c1c050
Desktop compat: java.util.stream, primitive function types and JDK me…
shai-almog Oct 9, 2026
14d49d4
JavaFX layer: ButtonBar, mnemonics, constrained table columns, honest…
shai-almog Oct 9, 2026
0b5efb7
Desktop compat: a relative file path and os.arch answer under the hea…
shai-almog Oct 9, 2026
afdfe16
JavaFX layer: group bounds before layout, nested transforms, sized co…
shai-almog Oct 9, 2026
daf44f5
Desktop compat: read a stream's close handler outside the try that ru…
shai-almog Oct 9, 2026
ff873d5
Desktop compat: DateTimeFormatter.withZone and getZone
shai-almog Oct 9, 2026
f731277
JavaFX layer: Font.loadFont and @font-face load a bundled font file; …
shai-almog Oct 9, 2026
7f31e48
JavaFX layer: DropShadow and InnerShadow are drawn, -fx-effect is rea…
shai-almog Oct 9, 2026
a37ca71
JavaFX layer: progress bar and indicator draw themselves
shai-almog Oct 9, 2026
96232f0
JavaFX layer: labeled graphic, hyperlink states, toggle chrome, choic…
shai-almog Oct 9, 2026
d7551f8
JavaFX layer: a disabled control is dimmed; ControlLookTest
shai-almog Oct 9, 2026
1b5616b
JavaFX layer charts: axis sides, turned and minor ticks, JavaFX auto …
shai-almog Oct 9, 2026
c4e6621
Desktop compat: formatter.parse(text, LocalDate::from) reads what the…
shai-almog Oct 9, 2026
55bb01e
JavaFX layer CSS: layered backgrounds and borders, a paint per side, …
shai-almog Oct 9, 2026
4ed77c5
JavaFX layer: a scene that cannot shrink to the screen scrolls, touch…
shai-almog Oct 9, 2026
fb00257
Desktop compat: IntStream, LongStream and DoubleStream declare parall…
shai-almog Oct 9, 2026
c82eb8a
JavaFX layer: WritableImage, pixel reader and writer, Node.snapshot, …
shai-almog Oct 9, 2026
e5ec68e
Desktop compat tests: a headless raster to assert painted pixels on
shai-almog Oct 9, 2026
7bd8c37
Swing layer: widgets that paint themselves, live drags, small displays
shai-almog Oct 9, 2026
e45f39b
Developer guide: Swing layer on small displays and what its widgets draw
shai-almog Oct 9, 2026
2b56813
JavaFX layer: a pie slice has a node, a pane does not clip, a region …
shai-almog Oct 9, 2026
80df6eb
Merge branch 'desktop-compat-layer' into worktree-agent-a276bdddb98db…
shai-almog Oct 9, 2026
1f73b2c
JavaFX layer: a drag delivered as the display delivers it reaches the…
shai-almog Oct 9, 2026
a09e3e5
JavaFX layer: the root region of a scene has the theme's background
shai-almog Oct 9, 2026
94a14a1
JavaFX layer: a root that scales its content to fit is not made to sc…
shai-almog Oct 9, 2026
b511f70
JavaFX layer: a pane under a scaled parent keeps its own clip
shai-almog Oct 9, 2026
e5a9a77
Swing layer: content backgrounds, marks and icon buttons drawn on eve…
shai-almog Oct 9, 2026
71e6158
JavaFX layer: a scene that scrolls is tried in its pane once, not eve…
shai-almog Oct 9, 2026
5b6beb3
JavaFX layer: what a pane may paint in is not a clip kept from an ear…
shai-almog Oct 9, 2026
0fd331a
JavaFX layer: three SpotBugs findings
shai-almog Oct 9, 2026
ecd5827
Merge branch 'desktop-compat-layer' into worktree-agent-a276bdddb98db…
shai-almog Oct 9, 2026
848dfc6
JavaFX layer: a label without the native theme's padding, a bold colu…
shai-almog Oct 9, 2026
bec3831
JavaFX layer: a progress bar of two styleable regions, -fx-progress-c…
shai-almog Oct 9, 2026
b6d3610
JavaFX layer: images meet on device pixels, and a source a fraction p…
shai-almog Oct 9, 2026
9b89ac5
JavaFX layer: ToolBar, ScrollBar, TitledPane, Accordion, Spinner, Pag…
shai-almog Oct 9, 2026
50b9df4
JavaFX layer: PropertyValueFactory without reflection, and CheckBoxTa…
shai-almog Oct 9, 2026
5abd7e5
JavaFX layer: fill and stroke transitions, grid lines, expandable dia…
shai-almog Oct 9, 2026
46c28b3
JavaFX layer: gradients by the JavaFX definition, background and bord…
shai-almog Oct 9, 2026
a2b94a8
JavaFX layer: spinner arrow styles, list and table stripes, the table…
shai-almog Oct 9, 2026
42a1819
JavaFX layer: a list or table with no rows has no stripes
shai-almog Oct 9, 2026
86c5171
JavaFX layer: an image named by a relative file: URL is in error, not…
shai-almog Oct 9, 2026
2756a86
JavaFX layer: sixteen SpotBugs findings in the new controls
shai-almog Oct 9, 2026
99baa05
JavaFX layer: a control is pressed where it is drawn, and a mouse mak…
shai-almog Oct 9, 2026
02a57f2
JavaFX layer: FillTransition, StrokeTransition and PathTransition
shai-almog Oct 9, 2026
3d77103
Swing layer: drag and drop, toolkit event listeners, and the desktop …
shai-almog Oct 9, 2026
963c085
Swing layer: a scroll pane is laid out by its ScrollPaneLayout, a tre…
shai-almog Oct 9, 2026
fc02a58
Swing layer: styled documents, a text pane that paints them, and poin…
shai-almog Oct 9, 2026
ccf3ee8
Swing layer: Font.createFont draws with a font file the application c…
shai-almog Oct 9, 2026
9b680f4
Swing layer: the API shape test lets a Java 8 run pass API a later re…
shai-almog Oct 9, 2026
d54ba6e
Desktop layers: an imported application's main no longer stops a nati…
shai-almog Oct 9, 2026
7047134
Swing layer: getListeners works on a device
shai-almog Oct 9, 2026
ea5e9ed
Swing layer: a look and feel selects a light or dark palette, and Fla…
shai-almog Oct 9, 2026
ac7d2c3
Swing layer: RSyntaxTextArea under its own names, as a code view
shai-almog Oct 9, 2026
8ff8baf
Swing layer: FlatLaf client properties, palette-following editor high…
shai-almog Oct 9, 2026
0d1712a
Swing layer: a named look and feel styles an unthemed application, an…
shai-almog Oct 9, 2026
35748dd
Swing layer: client properties and updateComponentTreeUI reach the lo…
shai-almog Oct 9, 2026
2caa10d
JavaFX layer: the keyboard is the scene's -- one Tab is one step, Spa…
shai-almog Oct 9, 2026
f4bb87e
Swing layer: Tab moves the focus once on a desktop port
shai-almog Oct 9, 2026
5ff5745
Desktop tooling: dependencies classified, findings grouped, a port re…
shai-almog Oct 9, 2026
40d8bbf
JDK layer: java.nio.file over the device's one file system, and Chars…
shai-almog Oct 9, 2026
c666425
JDK layer: java.util.regex, a backtracking matcher with the JDK's syntax
shai-almog Oct 9, 2026
e808cfd
JDK layer: CompletableFuture, CountDownLatch and scheduled executors …
shai-almog Oct 9, 2026
cdf7ced
JDK shims: java.time gaps, Base64, HexFormat, URL coding, digests, st…
shai-almog Oct 9, 2026
943924c
Remap: records and pattern switches without their bootstrap methods
shai-almog Oct 9, 2026
896e8c7
JDK shims: date comparisons without the compareTo overloads a device …
shai-almog Oct 9, 2026
ce91275
Compliance: every invokedynamic bootstrap is checked in every project…
shai-almog Oct 9, 2026
487db7c
JDK layer: date comparisons the device can link, and twelve SpotBugs …
shai-almog Oct 9, 2026
e2c2e8e
Desktop layers: a control's text does not scroll under the pointer, a…
shai-almog Oct 9, 2026
7876501
Desktop layers: a harness that runs a staged application on the real …
shai-almog Oct 9, 2026
104144e
Compliance: a method reference's target is checked once, and a lambda…
shai-almog Oct 9, 2026
baec696
Swing layer on a desktop: the menu bar in the window, mouse sized row…
shai-almog Oct 9, 2026
89923a0
JDK layer: ServiceLoader from a generated registry, the unnamed modul…
shai-almog Oct 9, 2026
6d1d407
Desktop compat: service providers and library resources reach the device
shai-almog Oct 9, 2026
506bd95
Desktop layers: a control under the pointer keeps its own font and co…
shai-almog Oct 9, 2026
79cf696
JavaFX layer: two null checks of values that are never null
shai-almog Oct 9, 2026
57733ed
Swing layer on a desktop: a second window has the frame's size, a dar…
shai-almog Oct 9, 2026
80ff3f8
Merge the gitember port work: Swing gaps, FlatLaf, JDK shims, records…
shai-almog Oct 9, 2026
fa15f72
Merge the real-port interaction work: scaled hit testing, keyboard, t…
shai-almog Oct 9, 2026
febdfb3
Desktop layers: a benchmark harness against the JVM the application s…
shai-almog Oct 9, 2026
560b6e0
Merge the benchmark harness and two native-build fixes
shai-almog Oct 9, 2026
48941d7
Desktop layers: the remap differential finds an entry point under the…
shai-almog Oct 9, 2026
367bc17
Desktop layers: the application's window takes the first frame, the t…
shai-almog Oct 9, 2026
0d1b789
Desktop layers: a date or a time alone is formatted and parsed by the…
shai-almog Oct 9, 2026
0d91806
Developer guide: the Swing and JavaFX chapter covers porting, the JDK…
shai-almog Oct 9, 2026
a2d66dc
Desktop layers: a picture drawn on a canvas every frame costs no imag…
shai-almog Oct 9, 2026
ca7e876
Desktop layers: a class literal of the application gets its array cla…
shai-almog Oct 9, 2026
244cd21
Desktop layers: a hidden indeterminate indicator takes no frames
shai-almog Oct 9, 2026
3f22886
Revert "Desktop layers: a picture drawn on a canvas every frame costs…
shai-almog Oct 9, 2026
e2fdb51
Desktop layers: a picture drawn whole on a canvas is not cut out of i…
shai-almog Oct 9, 2026
7ad7eb8
Merge the native-build fixes: first frame, window title, date and tim…
shai-almog Oct 9, 2026
0a4af42
Merge master into the desktop compatibility layers
shai-almog Oct 9, 2026
61cd902
Developer guide: the benchmark tables from the measurement after the …
shai-almog Oct 9, 2026
28dc7fe
Desktop compatibility: tests that hold on a JDK 8 with JavaFX bundled…
shai-almog Oct 10, 2026
52a51a8
Desktop compatibility: a dialog kept in the application's form stays …
shai-almog Oct 10, 2026
afa6b1b
Desktop compatibility: a flatMap stream left part read is closed
shai-almog Oct 10, 2026
7f97701
Desktop compatibility: Path.of(URI) refuses a file URI with more than…
shai-almog Oct 10, 2026
e34426a
Desktop compatibility: a shutdown hook that throws stops neither the …
shai-almog Oct 10, 2026
86f91e7
Desktop compatibility: an orderly shutdown runs the delayed work it a…
shai-almog Oct 10, 2026
8e2c66a
Desktop compatibility: a timeout lets go of its future once the futur…
shai-almog Oct 10, 2026
dd681ff
Desktop compatibility: minimalCompletionStage answers a copy, and say…
shai-almog Oct 10, 2026
4c8142b
Desktop compatibility: two dependencies with one jar file name are tw…
shai-almog Oct 10, 2026
d76b4a2
Desktop compatibility: a runtime entry gone from the layer is removed…
shai-almog Oct 10, 2026
a60160b
Desktop import: dependencies a parent POM gives its modules are read
shai-almog Oct 10, 2026
9ee1989
Desktop import: a Kotlin entry class is the declaration holding main,…
shai-almog Oct 10, 2026
d34cdbc
Merge branch 'worktree-agent-aadd3c3cd42696c48' into desktop-compat-l…
shai-almog Oct 10, 2026
6ff9a68
Linux port: the application window can be resized, and says where it is
shai-almog Oct 10, 2026
b96bfb8
JavaFX layer: what is inside a scaled parent is painted on a port who…
shai-almog Oct 10, 2026
bd4ab62
Linux port: text typed into a text field or area is drawn
shai-almog Oct 10, 2026
222a12d
Linux port frees the images nothing refers to; a canvas no longer kee…
shai-almog Oct 10, 2026
518ee40
JavaFX layer: the text of a label under a scaled parent is drawn on a…
shai-almog Oct 10, 2026
e73bc8f
JavaFX layer: the screen of a desktop is the desktop, not the window
shai-almog Oct 10, 2026
6cfa787
Desktop compatibility: text with no room ends in an ellipsis whatever…
shai-almog Oct 10, 2026
58014f6
Linux port: the arrow keys are arrow keys
shai-almog Oct 10, 2026
67108ef
JavaFX layer: a window sized by its scene gets the scene's size insid…
shai-almog Oct 10, 2026
7fd2509
Image: the scaled copies are forgotten when the image is drawn on again
shai-almog Oct 10, 2026
a5b19ac
JavaFX layer: an image drawn at its own size is not asked to be scaled
shai-almog Oct 10, 2026
0b940cd
Linux port: the memory of freed images goes back to the system, also …
shai-almog Oct 10, 2026
627d4e4
Merge branch 'worktree-agent-a247bfaf74a1af70b' into desktop-compat-l…
shai-almog Oct 10, 2026
a49e309
Developer guide: the benchmark tables after the native Linux fixes
shai-almog Oct 10, 2026
e0d7eb6
Developer guide: the installed size of the native build beside the JV…
shai-almog Oct 10, 2026
a65a56b
Developer guide: charts of size, start and memory beside the benchmar…
shai-almog Oct 10, 2026
baa4a15
CI: the headless test implementation names its own factory, a header …
shai-almog Oct 10, 2026
ce82b7c
Native Linux: the port scales an image as it draws it, instead of the…
shai-almog Oct 10, 2026
b729a4e
Native Linux: a still application frees the images its last collectio…
shai-almog Oct 10, 2026
f5fab32
Benchmarks: the X server has had a GTK program on it before the measu…
shai-almog Oct 10, 2026
70da8f4
Swing compat: a frame asks the window for the size the application ga…
shai-almog Oct 10, 2026
8b52b79
Swing compat: a button under the pointer keeps the font it has at rest
shai-almog Oct 10, 2026
c67ee47
Swing compat: a menu is not part of the keyboard focus, and a compone…
shai-almog Oct 10, 2026
d64a5b4
JavaFX compat: an italic label has room for the lean of its last letter
shai-almog Oct 10, 2026
b4b1883
Developer guide: the Linux figures measured again, on a display a GTK…
shai-almog Oct 10, 2026
f2a1a44
Swing compat: a window gives the keyboard to the component that asked…
shai-almog Oct 10, 2026
5ff9b16
Linux port: a bold or italic native font is bold or italic
shai-almog Oct 10, 2026
6b5f38a
JavaFX compat: a slider draws its ticks and an undetermined check box…
shai-almog Oct 10, 2026
b7c421b
JavaFX compat: the room beside a native widget is a number, not an array
shai-almog Oct 10, 2026
759a45c
Linux port: Tab leaves a text field, and the key that starts an edit …
shai-almog Oct 10, 2026
c701947
JavaFX compat: a window opens with the focus on its first control; be…
shai-almog Oct 10, 2026
18033b7
Simulator: the native text editor is built on the AWT event thread
shai-almog Oct 10, 2026
b28d20d
Developer guide: the alternative text of the memory chart, without th…
shai-almog Oct 10, 2026
cfacf1a
CI: the Linux JDK 8 job has an hour, now that it builds and tests the…
shai-almog Oct 10, 2026
674aab1
Developer guide: the Linux measurements of four applications, taken a…
shai-almog Oct 11, 2026
bc0a29b
JavaFX compat tests: the check box and spinner tests no longer depend…
shai-almog Oct 11, 2026
208879c
Linux port: a light or thin native font falls back to regular when th…
shai-almog Oct 11, 2026
58e07f1
ParparVM: a started thread's Thread object is no longer retired at fr…
shai-almog Oct 11, 2026
95f569e
GeneralPath: a curved shape clipped by a rectangle stays one outline
shai-almog Oct 11, 2026
7119bb9
Windows port: clipRect on top of a shape clip keeps the shape
shai-almog Oct 11, 2026
fe4038b
Swing and JavaFX compat: a linear gradient through a shape is worked …
shai-almog Oct 11, 2026
ba5171c
JavaFX compat: a slider has a thumb where the theme draws none that c…
shai-almog Oct 11, 2026
8c75e3c
JavaFX compat: a scene whose height follows its width scrolls from it…
shai-almog Oct 11, 2026
7bd6b7b
Swing compat tests: UIManagerTest lifts the palette it laid over the …
shai-almog Oct 11, 2026
bb49851
Swing compat: a flow narrower than its row on a phone is given the he…
shai-almog Oct 11, 2026
96be8ce
JavaFX compat: on a phone a row too narrow takes the width from field…
shai-almog Oct 11, 2026
f0c6b74
Desktop compat: a page in a browser is a display that decides the width
shai-almog Oct 11, 2026
806c6fc
Windows port: a sized native font keeps its bold and its slant
shai-almog Oct 11, 2026
07eca3e
Tests: the notification permission test runs after the dialog tests
shai-almog Oct 11, 2026
2341bbd
Screenshot goldens: desktop compatibility scenes on Android, Linux an…
shai-almog Oct 11, 2026
2cebc98
Merge master into the desktop compatibility layers
shai-almog Oct 11, 2026
468491f
Merge master into the desktop compatibility layers
shai-almog Oct 11, 2026
b87b8fb
Screenshot goldens: desktop compatibility scenes on Windows, JavaScri…
shai-almog Oct 11, 2026
4ee4343
Merge remote-tracking branch 'origin/master' into desktop-compat-layer
shai-almog Oct 11, 2026
6cec243
Merge remote-tracking branch 'origin/master' into desktop-compat-layer
shai-almog Oct 12, 2026
4a287d0
Screenshot goldens for macOS, watchOS and the iOS dialogs; zip advice…
shai-almog Oct 12, 2026
b55afd9
Desktop compatibility: importer, executor and file fixes from review
shai-almog Oct 13, 2026
534d0f0
Merge remote-tracking branch 'origin/master' into desktop-compat-layer
shai-almog Oct 13, 2026
db831d1
Desktop compatibility: timer, executor shutdown, move and importer fi…
shai-almog Oct 13, 2026
9919796
Desktop compatibility: the coalescing timer test allows a period that…
shai-almog Oct 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 3 additions & 1 deletion .github/workflows/android-compat.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ on:
branches: [ master ]
paths:
- 'maven/android-compat/**'
- 'maven/compat-jdk/**'
- 'maven/android-res-compiler/**'
- 'maven/build-engine/**'
- 'maven/codenameone-maven-plugin/**'
Expand All @@ -34,6 +35,7 @@ on:
branches: [ master ]
paths:
- 'maven/android-compat/**'
- 'maven/compat-jdk/**'
- 'maven/android-res-compiler/**'
- 'maven/build-engine/**'
- 'maven/codenameone-maven-plugin/**'
Expand Down Expand Up @@ -85,7 +87,7 @@ jobs:
bash ../scripts/ci/retry.sh xvfb-run -a mvn install -Plocal-dev-javase -DskipTests -Darchetype.test.skip=true -Dmaven.javadoc.skip=true
- name: Unit tests
working-directory: maven
run: xvfb-run -a mvn -B -Plocal-dev-javase -pl android-res-compiler,android-compat,build-engine test
run: xvfb-run -a mvn -B -Plocal-dev-javase -pl compat-jdk,android-res-compiler,android-compat,build-engine test
- name: Refresh archetype catalog
run: |
cd maven
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/ant.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,10 @@ jobs:
build-linux-jdk8:

runs-on: ubuntu-24.04
timeout-minutes: 45
# The job ran 32 to 42 minutes before the Swing and JavaFX compatibility
# modules joined the reactor it builds and tests, and was cancelled at 45
# while still making progress once they had.
timeout-minutes: 60

steps:
- uses: actions/checkout@v6
Expand Down
293 changes: 293 additions & 0 deletions .github/workflows/desktop-compat-benchmarks.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,293 @@
name: Desktop compatibility benchmarks

# The two in-tree desktop samples (scripts/desktop-compat-samples) built as what
# their developer ships today -- jar, jlink runtime image, jpackage application
# image -- and as native Codename One executables, then measured side by side:
# distributable size, memory, start-up and idle CPU.
#
# This is a measurement, not a gate: a job fails when the harness breaks, never
# because a number moved. Each leg uploads benchmarks-<os>.json and the same
# figures as a markdown table. scripts/desktop-compat-benchmarks/README.md says
# what every column means and how it was taken.
#
# linux the reference leg: the same install script, driver and input
# scripts as the container the committed numbers came from
# macos sizes, and the runtime figures run-macos-bench.sh takes (start-up
# to first window, idle memory and CPU; no scripted input)
# windows sizes, and the same reduced runtime figures through
# win-measure.ps1. NOTHING on this leg has run outside CI: nobody
# had a Windows machine when it was written.
#
# Shared runners are noisy and have few cores. Compare the columns of one run
# with each other, not one run with another.
on:
workflow_dispatch:
pull_request:
branches: [ master ]
paths:
- 'scripts/desktop-compat-benchmarks/**'
- '.github/workflows/desktop-compat-benchmarks.yml'
push:
branches: [ master ]
paths:
- 'scripts/desktop-compat-benchmarks/**'
- '.github/workflows/desktop-compat-benchmarks.yml'

permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true

env:
# The modules a native build of an imported desktop project resolves, plus
# everything they depend on (-am). The port module is added per leg.
BENCH_MODULES: parparvm,compat-jdk,swing-compat,javafx-compat,fxml-compiler,codenameone-maven-plugin,cn1app-archetype

jobs:
linux:
name: Linux (x64, Xvfb)
runs-on: ubuntu-latest
timeout-minutes: 240
steps:
- uses: actions/checkout@v6
- name: Set up JDK 8
uses: actions/setup-java@v5
with:
java-version: '8'
distribution: 'temurin'
cache: 'maven'
- run: echo "JDK_8_HOME=$JAVA_HOME" >> "$GITHUB_ENV"
# The same script the benchmark container is built from: the GTK stack,
# Xvfb and a window manager, JDK 17 and 21, zig, the OpenJFX jmods.
- name: Install the toolchain and the measuring tools
run: sudo bash scripts/desktop-compat-benchmarks/install-linux-deps.sh /opt/bench/tools
- name: Build Codename One (JDK 8)
env:
RETRY_ONLY_MATCHING: transient
RETRY_ATTEMPTS: '5'
RETRY_DELAY_SECONDS: '60'
run: |
cd maven
JAVA_HOME="$JDK_8_HOME" bash ../scripts/ci/retry.sh xvfb-run -a mvn -B \
-pl "linux,$BENCH_MODULES" -am -Plocal-dev-javase -DskipTests \
-Darchetype.test.skip=true -Dmaven.javadoc.skip=true install
- name: Build and measure the samples
env:
BENCH_JAVAFX_JMODS: /opt/bench/tools/javafx-jmods
CN1_CC: /opt/bench/tools/cn1-zig-cc
BENCH_XVFB: '1'
BENCH_IMAGE_NAME: GitHub-hosted ubuntu-latest runner
BENCH_COMMIT: ${{ github.sha }}
run: |
ARCH="$(dpkg --print-architecture)"
export JAVA17_HOME="/usr/lib/jvm/java-17-openjdk-$ARCH"
export BENCH_JDK21_HOME="/usr/lib/jvm/java-21-openjdk-$ARCH"
export PATH="/opt/bench/tools/zig:$PATH"
bash scripts/desktop-compat-benchmarks/bench-samples.sh \
--work "$RUNNER_TEMP/bench" --out "$GITHUB_WORKSPACE/benchmark-results"
cat benchmark-results/benchmarks-linux.md >> "$GITHUB_STEP_SUMMARY"
- name: Upload the results
if: always()
uses: actions/upload-artifact@v7
with:
name: benchmarks-linux
path: benchmark-results/
if-no-files-found: warn
- name: Upload the logs and screenshots
if: always()
uses: actions/upload-artifact@v7
with:
name: benchmarks-linux-logs
path: ${{ runner.temp }}/bench/*/logs/
if-no-files-found: ignore

macos:
name: macOS (arm64)
runs-on: macos-latest
timeout-minutes: 240
steps:
- uses: actions/checkout@v6
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- run: echo "BENCH_JDK21_HOME=$JAVA_HOME" >> "$GITHUB_ENV"
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'temurin'
- run: echo "JAVA17_HOME=$JAVA_HOME" >> "$GITHUB_ENV"
# Zulu: Temurin publishes no JDK 8 for Apple silicon.
- name: Set up JDK 8
uses: actions/setup-java@v5
with:
java-version: '8'
distribution: 'zulu'
cache: 'maven'
- run: echo "JDK_8_HOME=$JAVA_HOME" >> "$GITHUB_ENV"
- name: Build Codename One (JDK 8)
env:
RETRY_ONLY_MATCHING: transient
RETRY_ATTEMPTS: '5'
RETRY_DELAY_SECONDS: '60'
run: |
cd maven
JAVA_HOME="$JDK_8_HOME" bash ../scripts/ci/retry.sh mvn -B \
-pl "mac,ios,$BENCH_MODULES" -am -Plocal-dev-javase -DskipTests \
-Darchetype.test.skip=true -Dmaven.javadoc.skip=true -Djava.awt.headless=true install
- name: OpenJFX jmods
run: |
bash scripts/desktop-compat-benchmarks/javafx-jmods.sh "$BENCH_JDK21_HOME" "$RUNNER_TEMP/javafx-jmods"
echo "BENCH_JAVAFX_JMODS=$RUNNER_TEMP/javafx-jmods" >> "$GITHUB_ENV"
- name: Build the samples (sizes)
env:
BENCH_COMMIT: ${{ github.sha }}
run: |
bash scripts/desktop-compat-benchmarks/bench-samples.sh --stage build \
--work "$RUNNER_TEMP/bench" --out "$GITHUB_WORKSPACE/benchmark-results"
# The runner has a logged-in desktop session, which is what this needs:
# it opens each application's window in turn.
- name: Measure the samples (start-up, idle memory and CPU)
run: |
for NAME in swing-gallery javafx-gallery; do
bash scripts/desktop-compat-benchmarks/run-macos-bench.sh --work "$RUNNER_TEMP/bench" --name "$NAME" \
|| echo "::warning::run-macos-bench.sh failed for $NAME"
done
python3 scripts/desktop-compat-benchmarks/benchutil.py collect benchmark-results/benchmarks-macos.json \
"$RUNNER_TEMP"/bench/*/result.json
python3 scripts/desktop-compat-benchmarks/report.py --out benchmark-results/benchmarks-macos.md \
"$RUNNER_TEMP"/bench/*/result.json
cat benchmark-results/benchmarks-macos.md >> "$GITHUB_STEP_SUMMARY"
- name: Upload the results
if: always()
uses: actions/upload-artifact@v7
with:
name: benchmarks-macos
path: benchmark-results/
if-no-files-found: warn
- name: Upload the logs
if: always()
uses: actions/upload-artifact@v7
with:
name: benchmarks-macos-logs
path: ${{ runner.temp }}/bench/*/logs/
if-no-files-found: ignore

windows:
name: Windows (x64)
runs-on: windows-latest
timeout-minutes: 240
defaults:
run:
shell: bash
steps:
- uses: actions/checkout@v6
# clang-cl uses the MSVC headers, CRT and linker, so the MSVC developer
# environment has to be on PATH for the cmake the builder spawns.
- name: Set up the MSVC developer environment
uses: ilammy/msvc-dev-cmd@v1
with:
arch: amd64
- name: Install Ninja
run: |
python -m pip install --upgrade ninja
ninja --version
clang-cl --version
- name: Set up JDK 21
uses: actions/setup-java@v5
with:
java-version: '21'
distribution: 'temurin'
- run: echo "BENCH_JDK21_HOME=$JAVA_HOME" >> "$GITHUB_ENV"
- name: Set up JDK 17
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'temurin'
- run: echo "JAVA17_HOME=$JAVA_HOME" >> "$GITHUB_ENV"
- name: Set up JDK 8
uses: actions/setup-java@v5
with:
java-version: '8'
distribution: 'temurin'
cache: 'maven'
- run: echo "JDK_8_HOME=$JAVA_HOME" >> "$GITHUB_ENV"
# The scripts call python3; the runner's interpreter is "python".
- name: Provide python3
run: |
mkdir -p "$RUNNER_TEMP/bin"
printf '#!/bin/sh\nexec python "$@"\n' > "$RUNNER_TEMP/bin/python3"
chmod +x "$RUNNER_TEMP/bin/python3"
echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH"
- name: Build Codename One (JDK 8)
env:
RETRY_ONLY_MATCHING: transient
RETRY_ATTEMPTS: '5'
RETRY_DELAY_SECONDS: '60'
run: |
cd maven
JAVA_HOME="$JDK_8_HOME" bash ../scripts/ci/retry.sh mvn -B \
-pl "windows,$BENCH_MODULES" -am -Plocal-dev-javase -DskipTests \
-Darchetype.test.skip=true -Dmaven.javadoc.skip=true install
- name: OpenJFX jmods
run: |
bash scripts/desktop-compat-benchmarks/javafx-jmods.sh "$BENCH_JDK21_HOME" "$RUNNER_TEMP/javafx-jmods"
echo "BENCH_JAVAFX_JMODS=$RUNNER_TEMP/javafx-jmods" >> "$GITHUB_ENV"
- name: Build the samples (sizes)
env:
BENCH_COMMIT: ${{ github.sha }}
run: |
bash scripts/desktop-compat-benchmarks/bench-samples.sh --stage build \
--work "$RUNNER_TEMP/bench" --out "$GITHUB_WORKSPACE/benchmark-results"
- name: Measure the samples (start-up, idle memory and CPU)
shell: pwsh
run: |
$bench = Join-Path $env:RUNNER_TEMP 'bench'
foreach ($name in 'swing-gallery', 'javafx-gallery') {
$dir = Join-Path $bench $name
$parts = Join-Path $dir 'parts'
$java = Join-Path $dir 'baseline\runtime\bin\java.exe'
$baseline = Join-Path $parts 'baseline.json'
if ((Test-Path $java) -and (Test-Path $baseline)) {
$main = (Get-Content $baseline -Raw | ConvertFrom-Json).main_class
$cp = (Join-Path $dir 'baseline\app') + '\*'
& scripts/desktop-compat-benchmarks/win-measure.ps1 -Label jvm_default `
-Out (Join-Path $parts 'run.jvm_default.json') -Exe $java -Arguments '-cp', $cp, $main
& scripts/desktop-compat-benchmarks/win-measure.ps1 -Label jvm_tuned `
-Out (Join-Path $parts 'run.jvm_tuned.json') -Exe $java `
-Arguments '-XX:+UseSerialGC', '-Xss256k', '-XX:TieredStopAtLevel=1', '-Xmx64m', '-cp', $cp, $main
} else {
Write-Host "::warning::no baseline runtime image for $name"
}
$marker = Join-Path $dir 'cn1\executable.txt'
if (Test-Path $marker) {
$exe = Join-Path $dir ('cn1\dist\' + (Get-Content $marker -Raw).Trim())
& scripts/desktop-compat-benchmarks/win-measure.ps1 -Label cn1_native `
-Out (Join-Path $parts 'run.cn1_native.json') -Exe $exe
} else {
Write-Host "::warning::no native Codename One build for $name"
}
python scripts/desktop-compat-benchmarks/benchutil.py assemble $parts (Join-Path $dir 'result.json')
}
$results = @(Get-ChildItem -Path $bench -Filter result.json -Recurse -Depth 1 | ForEach-Object { $_.FullName })
python scripts/desktop-compat-benchmarks/benchutil.py collect benchmark-results/benchmarks-windows.json @results
python scripts/desktop-compat-benchmarks/report.py --out benchmark-results/benchmarks-windows.md @results
Get-Content benchmark-results/benchmarks-windows.md | Add-Content $env:GITHUB_STEP_SUMMARY
- name: Upload the results
if: always()
uses: actions/upload-artifact@v7
with:
name: benchmarks-windows
path: benchmark-results/
if-no-files-found: warn
- name: Upload the logs
if: always()
uses: actions/upload-artifact@v7
with:
name: benchmarks-windows-logs
path: ${{ runner.temp }}/bench/*/logs/
if-no-files-found: ignore
Loading
Loading