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.

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

Commit messages:
 - Removed unused import
 - Merge remote-tracking branch 'upstream/master' into osbackdrop
 - OS supplied translucent window backdrops

Changes: https://git.openjdk.org/jfx/pull/2048/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=2048&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8375578
  Stats: 727 lines in 29 files changed: 642 ins; 64 del; 21 mod
  Patch: https://git.openjdk.org/jfx/pull/2048.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/2048/head:pull/2048

PR: https://git.openjdk.org/jfx/pull/2048

Reply via email to