On Thu, 28 May 2026 21:07:37 GMT, Alexander Zvegintsev <[email protected]> wrote:
>> [JDK-8185862](https://bugs.openjdk.org/browse/JDK-8185862) introduced >> several behavioral changes: >> >> 1. `CountMonitors()` started counting only those `HMONITOR` from >> `EnumDisplayMonitors` for which `CreateDC` was successful. >> 2. A new state `0 valid monitors` appeared, which did not exist before. >> 3. In `Devices::GetDevice`, the lower bound check was insufficient (`index < >> 0` instead of `index <= 0`, this was not introduced by >> [JDK-8185862](https://bugs.openjdk.org/browse/JDK-8185862) though). >> Thus, we could attempt to read the first element of a zero-length array, >> which caused a crash in `sun.awt.Win32GraphicsDevice.initNativeScale`. >> 3. Invalidation only occurres for devices whose indices were removed from >> the end of the array. >> In RDP scenarios, a device may be replaced at the same index without >> changing the total number of screens, which bypassed invalidation. >> >> --- >> >> Changes in this fix: >> >> 1. Combined `CountMonitors()` and `CollectMonitors()`. Monitors are now >> collected into a dynamic array in a single pass. >> 2. The working list of devices is no longer replaced by an empty one. >> 3. `displayChanged()` is called only after a successful native update. >> 5. Added RDP transient states handling (retries by timer and by session >> connect). >> 6. `GetDevice()` now returns `NULL` if `numDevices <= 0`. >> 7. Improved device comparison logic: comparisons are now performed using >> display data (`dwFlags`, `szDevice`). >> Changed devices are invalidated, unchanged ones receive transferred Java >> references to the new native device. >> >> --- >> >> Testing: >> >> The fix seems to be stable over various scenarios of changing display >> configurations, locally and over RDP. >> CI testing is also green. >> >> >> >> --------- >> - [x] I confirm that I make this contribution in accordance with the >> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai). > > Alexander Zvegintsev has updated the pull request incrementally with one > additional commit since the last revision: > > explanatory comment src/java.desktop/windows/native/libawt/windows/Devices.cpp line 293: > 291: theInstance->GetDevice(i, FALSE); > 292: BOOL changed = (newDevice == NULL) > 293: || !AreSameMonitorInfo( Maybe I'm not understanding the requirements, but it seems to depend on the order returned by CollectMonitors to be useful. Surely it won't be the case that the Nth monitor is always the one removed ? If instead the result of CollectMonitors is changed only to remove the first one, and the others are the same, all these comparisons will fail because it compares based on the accidental index ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/31238#discussion_r3320951050
