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:
Setting NSWindow.titlebarAppearsTransparent to true.
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