On Sat, 27 Sep 2025 04:56:51 GMT, Michael Strauß <[email protected]> wrote:

> When an extended stage is shown with RTL orientation (either using a RTL 
> window + `Scene.nodeOrientation == INHERIT`, or using a LTR window and 
> `Scene.nodeOrientation == RIGHT_TO_LEFT`), the default window buttons are 
> placed on the wrong side of the window. This bug only manifests on Windows 
> and Linux, both of which use `HeaderButtonOverlay` to render the default 
> window buttons.
> 
> `HeaderButtonOverlay` is not a part of the scene graph, it is shown on top of 
> the scene graph as an overlay (like the warning overlay that appears when 
> entering full-screen mode). For [CSS-related 
> reasons](https://github.com/openjdk/jfx/pull/1605#issuecomment-2967977276), 
> the parent of an overlay is the scene root (but the scene root doesn't know 
> that). This implementation detail can mess up the calculation of orientation 
> flags and mirroring transforms in `Node`, as depending on the 
> `NodeOrientation` of the root node, the code may mistakenly mirror (or not 
> mirror) the orientation.
> 
> The solution I've come up with is as follows: the overlay node is marked with 
> the `Node.INHERIT_ORIENTATION_FROM_SCENE` flag, which causes it to resolve 
> its effective orientation against the scene only, and never against the root 
> node. With this change, the effective orientation and mirroring transforms 
> are computed correctly.
> 
> The easiest way to test this fix is with Monkey Tester -> Tools -> Stage 
> Tester.

Works as expected on windows 11 (using the monkey tester).
No ill effects on macOS.

One minor suggestion.

Did not test on Linux - @Ziad-Mid could you please test on Linux?
Also, could you test the behavior on Windows in the RTL mode set by default?

modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/ViewSceneOverlay.java
 line 53:

> 51:         this.scene = scene;
> 52:         this.painter = painter;
> 53:         this.subscription = Subscription.combine(

should this var be called `subscriptions` then?

modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/ViewSceneOverlay.java
 line 55:

> 53:         this.subscription = Subscription.combine(
> 54:             scene.rootProperty().subscribe(this::onSceneRootChanged),
> 55:             
> scene.effectiveNodeOrientationProperty().subscribe(this::onEffectiveNodeOrientationInvalidated));

side note to @hjohn : 
would it make sense to add a `Subscription.subscribe(Runnable)` method for 
cases like this?

-------------

Marked as reviewed by angorya (Reviewer).

PR Review: https://git.openjdk.org/jfx/pull/1921#pullrequestreview-3286140206
PR Review Comment: https://git.openjdk.org/jfx/pull/1921#discussion_r2392418600
PR Review Comment: https://git.openjdk.org/jfx/pull/1921#discussion_r2392424549

Reply via email to