I just want to add that the native window handles are available prior to the windows being shown if you listen to the observable list Window.getWindows().

On 02/04/2025 16:01, Bahaa Zaid wrote:
Hello,

Modern macOS apps tend to expand the client area of the window to take the entire window area including the titlebar. This is usually done by:

 1. Setting NSWindow.titlebarAppearsTransparent to true.
 2. Setting NSWindow.styleMask NSWindowStyleMaskFullSizeContentView flag.


This can be useful because it gives the app modern look, make use of all available window real-estate, and allows JavaFX developers to create completely custom windows like UNDECORATED styles without loosing the platform resize-window feature and the three window buttons.

Swing supports this already using code like this:
final var frame = new JFrame();
final var rootPane = frame.getRootPane();
rootPane.putClientProperty("apple.awt.fullWindowContent", true);
rootPane.putClientProperty("apple.awt.transparentTitleBar", true);

This can be done easily today using reflection to access non-public API to get the Stage native NSWindow handle and using FFM to change styleMask and set the titlebarAppearsTransparent property. I have created an example here (https://github.com/bahaa/jfx-transparent-window-titlebar). But this approach has the following drawbacks:

  * It uses non-public API.
  * JavaFX stage native window handle is available only after the
    stage is shown, this cause some flicker because the window style
    is changed after it’s shown to the user.


I think JavaFX should support this out of the box. One possible solution is to introduce a new StageStyle that behaves like UNIFIED style (it falls back to DECORATED) if it’s not supported by the platform. I think something similar can be done on Windows (https://learn.microsoft.com/en-us/windows/win32/dwm/customframe) but I’m not sure about GTK.

Thanks,
Bahaa.

Reply via email to