On Wed, 8 Apr 2026 17:58:25 GMT, Martin Fox <[email protected]> wrote:

>> This PR enables translucent window backdrops for JavaFX stages on macOS and 
>> Windows 11. Since we’re reliant on the operating system for these effects 
>> (they typically require real-time blurring of the desktop) I needed to flesh 
>> out a fairly complete prototype to sort out the API. I will start a 
>> discussion about the API on the mailing list.
>> 
>> There’s a crude manual test for trying out the different backdrop materials.
>> 
>>      java @build/run.args -Djavafx.enablePreview=true 
>> tests/manual/stage/BackdropTest.java
>> 
>> You’ll want to drag the windows around to avoid having them overlap each 
>> other since they’re all created in the center of the screen. For windows 
>> without title bars you can click anywhere on the background to drag the 
>> window except for TRANSPARENT stages on Windows which are a bit tricker to 
>> get a hold of; try to click on a text label.
>> 
>> If you create an UNDECORATED stage on Windows the backdrop won’t be 
>> translucent initially. This can be corrected by changing the stage’s color 
>> scheme. This is an OS bug that I haven’t found a workaround for.
>> 
>> The changes on Windows 11 are minimal since we’re just invoking an OS 
>> feature by calling DwmSetWindowAttribute. I did need to make two small 
>> changes to the D3D9 Prism code to ensure that the swap chain and back buffer 
>> support an alpha channel so JavaFX can composite its content on top of the 
>> backdrop. This is the same way the old UNIFIED stage style worked before it 
>> became unreliable (see 
>> [JDK-8154847](https://bugs.openjdk.org/browse/JDK-8154847)).
>> 
>> On macOS I moved the GlassHostView so it’s now a permanent part of the 
>> NSWindow. For some time the host view has been a remnant left over from an 
>> older approach to implementing fullscreen. Now it serves as a common parent 
>> for the NSVisualEffectView that provides the backdrop and the GlassView3D 
>> that contains the JavaFX content. Making it the permanent contentView of the 
>> NSWindow simplifies some code.
>> 
>> To validate the API I did prototype this for Windows 10 (thanks @mstr2!). 
>> Well, I prototyped this using DirectComposition so it should work on Win10 
>> but I can't test Win10 myself. Using DirectComposition is much more involved 
>> so I shelved that implementation for now but it does inform the API. It’s 
>> the reason the backdrop needs to be specified before the Java window is 
>> shown and the platform window created.
>
> Martin Fox has updated the pull request with a new target base due to a merge 
> or a rebase. The pull request now contains eight commits:
> 
>  - Merge remote-tracking branch 'upstream/master' into osbackdrop
>  - Backdrops are now objects created by specifying a material. The
>    list of materials is now open-ended.
>  - Merge remote-tracking branch 'upstream/master' into osbackdrop
>  - Merge remote-tracking branch 'upstream/master' into osbackdrop
>  - Merge remote-tracking branch 'upstream/master' into osbackdrop
>  - Removed unused import
>  - Merge remote-tracking branch 'upstream/master' into osbackdrop
>  - OS supplied translucent window backdrops

For Linux/Wayland support, the ext-background-effect-v1 protocol (which is now 
implemented in KWin, with KDE Plasma 6.7 shipping this support on June 16, 
2026, 
[wlroots](https://gitlab.freedesktop.org/wlroots/wlroots/-/blob/master/include/wlr/types/wlr_ext_background_effect_v1.h)
 and [Niri](https://github.com/niri-wm/niri/pull/3483) with planned support 
coming to other DE's such as 
[Cosmic](https://github.com/pop-os/cosmic-comp/pull/2179) and 
[Hyprland](https://github.com/hyprwm/Hyprland/pull/13211) as well as others) 
could be a viable path forward. Unlike some of the platform-specific 
constraints discussed above, this protocol supports dynamically adding/removing 
background effects, which aligns with the goal of supporting setBackdrop() 
after the window is shown. 

Reference: https://wayland.app/protocols/ext-background-effect-v1

Real-world implementations in Ghostty 
(https://github.com/ghostty-org/ghostty/pull/10727) and Quickshell 
(https://github.com/quickshell-mirror/quickshell/pull/566) demonstrate how this 
works in practice.
This would only cover Wayland, of course X11 would likely need a separate 
mechanism or remain unsupported for backdrops. Most major desktop environments 
now default to Wayland, so this would cover the majority of Linux users. 

Additional notes:
KDE 6.7, which includes 
[ext-background-effect-v1](https://www.phoronix.com/news/KDE-Brings-Back-Air-Theme),
 is planned for release on [Tuesday 16th June 
2026](https://9to5linux.com/kdes-new-css-based-style-engine-union-is-coming-to-kde-plasma-6-7).

For testing purposes you can test this on KDE Neon Unstable edition as a Live 
ISO or in a VM:
https://neon.kde.org/download

-------------

PR Comment: https://git.openjdk.org/jfx/pull/2048#issuecomment-4389774140

Reply via email to