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.