Resizing stage while it is maximized breaks scene size on Linux
Christopher Schnick
crschnick at xpipe.io
Fri Apr 18 05:44:45 UTC 2025
I wasn't really trying it, our application just had functionality to
resize the window on a certain action. And this functionality then broke
the window content when triggered while the window was maximized, which
is a case I didn't consider. I implemented a workaround for this now by
just setting the maximized property to false prior and only resizing the
window if really necessary, but I can imagine other applications
possibly being affected by this.
For reference, here is a video on how the issue looked like initially on
Linux: https://github.com/xpipe-io/xpipe/issues/485
On 17/04/2025 22:24, Martin Fox wrote:
> Christopher,
>
> Why are you trying to change the size of a maximized stage? I’m not
> sure what the intended effect is.
>
> Currently this produces all sort of platform-specific behavior and
> since what you’re seeing on Windows doesn’t match what I’m seeing I
> think there might be some variation based on OS version. The easiest
> way out of this thicket is to de-maximize the stage before trying to
> change its size.
>
> With that said, yes, this Linux bug definitely needs to be fixed.
> Whatever happens the scene shouldn’t break.
>
>> On Apr 16, 2025, at 3:32 AM, Thiago Milczarek Sayão
>> <thiago.sayao at gmail.com> wrote:
>>
>> Hi,
>>
>> I’d like to get your thoughts on what the expected behavior should be
>> when setting the size of a window while it's in a maximized state.
>>
>> Here are the options I’ve considered:
>>
>> a) Ignore the resize while maximized, and when restored, revert to
>> the size before it was maximized
>> b) Demaximize the window and apply the new size immediately
>> c) Ignore the resize request, but store the values and apply them
>> upon restore
>
> Option A forces the client to de-maximize the window before changing
> its size. Option B de-maximizes the window automatically. Option C is
> the only one that brings new functionality to the table but it would
> be complicated to implement (assuming it can be implemented).
>
> The documentation states that this is how things work when a stage is
> in fullscreen mode but from I can tell that’s not how any of the
> platforms actually behave. Trying to resize a fullscreen window
> produces a variety of immediate platform-specific effects.
>
>> If I understood correctly, Martin mentioned that both macOS and
>> Windows apply the resize immediately while keeping the window maximized.
>
> You understood correctly but I was wrong. On Windows 11 the size
> changes (I’m seeing only one resize event) and the window stays in the
> maximized state. This seems to be confusing the OS and it draws the
> title bar incorrectly. On macOS the size changes and the window leaves
> the maximized state but due to a bug in the code we don’t update the
> maximized property correctly.
>
> Martin
>
>> Then, when the window is demaximized, it restores the previous
>> (pre-maximized) size, which suggests behavior leaning toward option a.
>>
>> For fullscreen mode, the expected behavior appears to align more with
>> option c, as documented for Stage fullscreen.
>>
>> -- Thiago.
>>
>>
>> Em sáb., 29 de mar. de 2025 às 09:24, Thiago Milczarek Sayão
>> <thiago.sayao at gmail.com> escreveu:
>>
>> I did not find a bug report, so I did one and provided a fix:
>>
>> https://github.com/openjdk/jfx/pull/1748
>>
>>
>>
>> Em sáb., 29 de mar. de 2025 às 08:26, Thiago Milczarek Sayão
>> <thiago.sayao at gmail.com> escreveu:
>>
>> @Christopher Schnick <mailto:crschnick at xpipe.io>
>>
>> Hi, did you open a bug? I have a fix for this.
>>
>> Thanks
>>
>> -- Thiago.
>>
>> Em seg., 17 de mar. de 2025 às 09:49, Christopher Schnick
>> <crschnick at xpipe.io> escreveu:
>>
>> So on Windows at least, it will change the width
>> temporarily and then revert back to the original width
>> value. So you will receive two width change events if you
>> listen to the stage width property. The maximized
>> property is not changed.
>>
>> I guess this also not optimal handling of this. Ideally,
>> no changes would be made in that case.
>>
>> On 17/03/2025 10:53, Thiago Milczarek Sayão wrote:
>>> Hi Christopher,
>>>
>>> It seems like a simple fix.
>>>
>>> How does it behave on other platforms? Does it ignore
>>> the resize, restore the window to its unmaximized state
>>> before resizing, or keep it maximized while adjusting
>>> the unmaximized size.
>>>
>>> -- Thiago
>>>
>>>
>>>
>>>
>>>
>>>
>>> Em dom., 16 de mar. de 2025 às 05:25, Christopher
>>> Schnick <crschnick at xpipe.io> escreveu:
>>>
>>> Hello,
>>>
>>> we encountered an issue on Linux where resizing the
>>> stage while it is maximized breaks the size of the
>>> scene. You can see a video of this at
>>> https://github.com/xpipe-io/xpipe/issues/485 . The
>>> root cause is that the stage size is modified.
>>>
>>> When doing this, it temporarily or permanently
>>> switches to the size the stage had prior to being
>>> maximized, leading to either a flicker or a
>>> permanently broken scene that has the wrong size.
>>> This happens on Gnome and KDE for me with the latest
>>> JavaFX ea version.
>>>
>>> Here is a simple reproducer:
>>>
>>> import javafx.application.Application;
>>> import javafx.scene.Scene;
>>> import javafx.scene.control.Button;
>>> import javafx.scene.layout.Region;
>>> import javafx.scene.layout.StackPane;
>>> import javafx.stage.Stage;
>>>
>>> import java.io.IOException;
>>> import java.util.Base64;
>>>
>>> public class MaximizeLinuxBugextends Application {
>>>
>>> @Override public void start(Stage stage)throws IOException {
>>> Scene scene =new Scene(createContent(),640,480);
>>> var s ="data:text/css;base64," + Base64.getEncoder().encodeToString(createCss().getBytes());
>>> scene.getStylesheets().add(s);
>>> stage.setTitle("Hello!");
>>> stage.setScene(scene);
>>> stage.show();
>>> stage.centerOnScreen();
>>> stage.setMaximized(true);
>>> }
>>>
>>> private StringcreateCss() {
>>> return """ * { -fx-border-color: red;
>>> -fx-border-width: 1; } """;
>>> }
>>>
>>> private RegioncreateContent() {
>>> var button =new Button("Click me!");
>>> button.setOnAction(event -> {
>>> var w =button.getScene().getWindow();
>>> w.setWidth(w.getWidth() -1);
>>> event.consume();
>>> });
>>> var stack =new StackPane(button);
>>> return stack;
>>> }
>>>
>>> public static void main(String[] args) {
>>> launch();
>>> }
>>> }
>>>
>>>
>>> Best
>>> Christopher Schnick
>>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/openjfx-dev/attachments/20250418/9676b739/attachment-0001.htm>
More information about the openjfx-dev
mailing list