On Mon, 10 Nov 2025 22:13:11 GMT, Kevin Rushforth <[email protected]> wrote:

>> There is a reason for it, otherwise I wouldn't have modified `Screen`.
>> 
>> If you run the 
>> [test](https://bugs.openjdk.org/secure/attachment/112708/Menu_RenderScale_8346281.java)
>>  in the JBS issue, on Windows with two monitors (primary with scale > 100%), 
>> with the changes from `GlassWindow.cpp` only, without changing `Screen`, 
>> when you open the File menu of the window in the secondary display, the 
>> context menu is misplaced:
>> 
>> <img width="404" height="341" alt="Screenshot 2025-11-08 143811" 
>> src="https://github.com/user-attachments/assets/5844155e-c6cb-4b9a-9edb-c81b1140b8bb";
>>  />
>> 
>> Adding some debugging info, it can be seen that, when the application starts 
>> (without doing any external change in Windows settings), there is a DPI 
>> event, that calls `notifySettingsChanged`, at a point where there is only a 
>> `Window` instance (the one in the primary screen), instead of two. The two 
>> screens get disposed (that is, `Screen.ptr = 0`), and later on, when the 
>> secondary window is created, it gets assigned the disposed secondary screen, 
>> with this `ptr = 0`. 
>> 
>> When opening the `File` menu of the secondary window, another DPI event is 
>> triggered, `notifySettingsChanged` is called, but since there was no real 
>> change in the screens, the new screens are the same as the old ones (the 
>> valid  `ptr` didn't change after the event). However, the valid secondary 
>> screen is not assigned to the secondary Window, because the if test, (ptr 
>> from old screen was 0, and new screen ptr >0 doesn't match), so it keeps the 
>> old screen instance with `ptr = 0`.
>> 
>> This causes some unexpected issues for instance in 
>> `WinWindow::notifyMoving`, as there is a mixture of valid screens (from 
>> `Screen.getScreens()`) and invalid one in `Window::getScreen`, and the 
>> equality checks (`screen1 == screen2`) fails, ultimately providing wrong 
>> screen information for the popup.
>> 
>> So the change in `Screen` that I propose in this PR removes the disposal of 
>> screens if these are not assigned to a window yet.
>> 
>> Does that make sense?
>
> Hmm. I see what you are saying, and can confirm the behavior. With your 
> proposed fix, though, it seems like we will still have a situation where an 
> in-use screen object is no longer in the list of screens. When this happens 
> it will point to the same native screen object as one of the newly-created 
> screens. This seems fragile.
> 
> Maybe we could still dispose all old screens, but do it in a way that allows 
> it to later be mapped to a new screen? Or, thinking out loud, maybe "put 
> back" the screens that didn't actually change as the result of the DPI change 
> notification?
> 
> I'll want to think about this and take a closer look, but it will be a couple 
> days before I can get to it.

@kevinrushforth did you have the chance to have a look at this?

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

PR Review Comment: https://git.openjdk.org/jfx/pull/1964#discussion_r2602088383

Reply via email to