Some platform preference changes can trigger the emission of multiple 
notifications. For example, when switching from a high-contrast theme on 
Windows to the regular theme, the following notifications are emitted (log can 
be viewed in `PlatformPreferencesChangedTest`):


changed:
        Windows.UIColor.Accent=0x0078d4ff
        Windows.SysColor.COLOR_HIGHLIGHTTEXT=0xffffffff
        Windows.SysColor.COLOR_WINDOW=0xffffffff
        Windows.UIColor.AccentLight1=0x0091f8ff
        Windows.SysColor.COLOR_3DFACE=0xf0f0f0ff
        Windows.SysColor.COLOR_HOTLIGHT=0x0066ccff
        Windows.SysColor.COLOR_WINDOWTEXT=0x000000ff
        Windows.SysColor.COLOR_BTNTEXT=0x000000ff
        Windows.UIColor.Foreground=0x000000ff
        Windows.UIColor.AccentDark1=0x0067c0ff
        Windows.UIColor.Background=0xffffffff
        Windows.UIColor.AccentLight3=0x99ebffff
        Windows.UIColor.AccentLight2=0x4cc2ffff
        Windows.SysColor.COLOR_GRAYTEXT=0x6d6d6dff
        Windows.SysColor.COLOR_HIGHLIGHT=0x0078d7ff
        Windows.UIColor.AccentDark2=0x003e92ff
        Windows.UIColor.AccentDark3=0x001a68ff

changed:
        -Windows.SPI.HighContrastColorScheme
        Windows.SPI.HighContrast=false

changed:
        Windows.UIColor.Foreground=0xffffffff
        Windows.UIColor.Background=0x000000ff


Notably, the values for Windows.UIColor.Foreground/Background are inconsistent 
between the notifications (although they are eventually correct). In general, 
only a single notification should be emitted that includes all of the changed 
preferences.

This artifact is only visible on Windows. The reason is that changing some 
system settings (like high-contrast theme) causes a number of different window 
messages to be sent to the application. We should wait for all window messages 
to come in, and then aggregate all of the changed preferences into a single 
notification.

In order to minimize the delay between changing a system setting and sending 
out the notification in JavaFX, the implementation only waits when instructed 
to do so by the native toolkit. This allows us to instantly send out 
notifications for most changes, but selectively wait a bit for changes where 
the native toolkit knows that more changes might be coming in.

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

Commit messages:
 - add delayed change aggregation

Changes: https://git.openjdk.org/jfx/pull/1810/files
  Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1810&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8357067
  Stats: 319 lines in 13 files changed: 282 ins; 1 del; 36 mod
  Patch: https://git.openjdk.org/jfx/pull/1810.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/1810/head:pull/1810

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

Reply via email to