On Wed, 20 May 2026 15:23:02 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.
>> 
>> ---------
>> - [x] I confirm that I make this contribution in accordance with the 
>> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai).
>
> Martin Fox has updated the pull request with a new target base due to a merge 
> or a rebase. The pull request now contains 10 commits:
> 
>  - Merge remote-tracking branch 'upstream/master' into osbackdrop
>  - New version of StageBackdrop API, separated into standard and platform 
> variants
>    
>    commit dee190390d147e9032a734ab0abaab752e308c76
>    Author: Martin Fox <[email protected]>
>    Date:   Wed May 20 06:18:23 2026 -0700
>    
>        More minor cleanup
>    
>    commit 457c7eb99affd42f67dedb2c760fa639a88943b9
>    Author: Martin Fox <[email protected]>
>    Date:   Tue May 19 19:33:15 2026 -0700
>    
>        Cleaning up imports, comments, etc.
>    
>    commit 947a5e3598fd0e1b8f69747314405519a8a8794d
>    Author: Martin Fox <[email protected]>
>    Date:   Tue May 19 16:16:23 2026 -0700
>    
>        Disabling macOS 26 Liquid Glass effect
>    
>    commit 9c3d0389f3687504411fc840ecb878ebe9608e36
>    Author: Martin Fox <[email protected]>
>    Date:   Tue May 19 16:14:19 2026 -0700
>    
>        Backdrop options are now dynamic and set on the stage.
>    
>    commit 7d61c2b9bc15a7bdc7c79b0ddde651678404f065
>    Author: Martin Fox <[email protected]>
>    Date:   Tue May 19 11:15:09 2026 -0700
>    
>        Added options query and simplified Windows implementation
>    
>    commit c1514f348f9e1d9d3761aec9786dda25e12fa588
>    Author: Martin Fox <[email protected]>
>    Date:   Mon May 18 12:07:40 2026 -0700
>    
>        Revamped StageBackdrop API, splitting standard and platform backdrops 
> and adding options
>    
>    commit 608cfa631967470bdbfc02a5b30e55ab3c932d32
>    Merge: 551c9ec336 7110a0940d
>    Author: Martin Fox <[email protected]>
>    Date:   Thu May 14 07:08:44 2026 -0700
>    
>        Merge branch 'osbackdrop' into osbackdrop_dev
>    
>    commit 551c9ec336d9e6d3f90e37b278dc17df9a9bca03
>    Author: Martin Fox <[email protected]>
>    Date:   Wed Apr 8 08:51:49 2026 -0700
>    
>        Cleanup.
>    
>    commit c2e8ec8afc4df2dbd529470761b500e4d670bbeb
>    Author: Martin Fox <[email protected]>
>    Date:   Sat Apr 4 20:18:07 2026 -0700
>    
>        Factory for construction backdrops
>    
>    commit 4654e4071e19b0b45e44161925b38904d100dda5
>    Author: Martin Fox <[email protected]>
>    Date:   Wed Apr 1 16:20:29 2026 -0700
>    
>        Some tests call Application.createWindow. Added compatibility version.
>    
>    commit cb417164e378a5e15c9d9b62b80bd010495b1f28
>    Aut...

I've pushed a new version. StageBackdrops now come in two flavors, the standard 
backdrops which are referenced using constants (WINDOW and PARTIAL) and the 
platform-dependent backdrops which are referenced by name (string).

The selection of platform backdrops is not final, the current crop are just for 
demo purposes. I had to remove the macOS liquid glass backdrops since they 
require a more recent SDK than the build machines support. If you want to try 
them out you'll need to edit MacWindow.java (look for ClearGlass) and 
GlassHostView.m (look for setGlassBackdrop).

There's now a call to query a backdrop for its supported options. The call for 
setting an option has been moved to Stage since you can change the value at any 
time. That call is currently a no-op since the only backdrop that supports 
options is macOS.ClearGlass and it's not available. Hooking this up isn't 
rocket science but is a bit tedious so I'm putting it off.

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

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

Reply via email to