Resizing stage while it is maximized breaks scene size on Linux

Martin Fox martinfox656 at gmail.com
Mon Apr 21 20:04:07 UTC 2025


Christopher — Thanks for the details.

Thiago — I’m still of the opinion that we shouldn’t try to specify what happens when a client tries to resize a maximized window. I don’t like leaving these things unspecified but I’m not sure there’s a compelling use case that would justify the effort involved in nailing this down. Simpler to just document that the window should be de-maximized first.

I’m also seeing some bugs on macOS related to maximizing and de-maximizing the window and it looks like we don’t have good system tests for some of this (or they’re disabled). Personally I would rather focus on fixing those issues.

Martin

> On Apr 17, 2025, at 10:44 PM, Christopher Schnick <crschnick at xpipe.io> wrote:
> 
> 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> <mailto: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 <mailto: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 <mailto: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 <mailto: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 <mailto: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 MaximizeLinuxBug extends 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 String createCss() {
>>>>>>>>         return """
>>>>>>>>                 * {
>>>>>>>>                 -fx-border-color: red;
>>>>>>>>                 -fx-border-width: 1;
>>>>>>>>                 }
>>>>>>>>                 """;
>>>>>>>>     }
>>>>>>>> 
>>>>>>>>     private Region createContent() {
>>>>>>>>         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/20250421/f31e39cb/attachment-0001.htm>


More information about the openjfx-dev mailing list