On Mon, 1 Nov 2021 16:46:34 GMT, Thiago Milczarek Sayao <tsa...@openjdk.org> 
wrote:

>> Found the problem thru this path:
>> 
>> **WindowStage.java**
>> 
>>     final void handleFocusDisabled() {
>>         if (activeWindows.isEmpty()) {
>>             return;
>>         }
>>         WindowStage window = activeWindows.get(activeWindows.size() - 1);
>>         window.setIconified(false);
>>         window.requestToFront();
>>         window.requestFocus();
>>     }
>> 
>> 
>> **glass_window.cpp**
>> 
>> void WindowContextBase::process_focus(GdkEventFocus* event) {
>>    ...
>> 
>>     if (jwindow) {
>>         if (!event->in || isEnabled()) {
>>             mainEnv->CallVoidMethod(jwindow, jWindowNotifyFocus,
>>                     event->in ? 
>> com_sun_glass_events_WindowEvent_FOCUS_GAINED : 
>> com_sun_glass_events_WindowEvent_FOCUS_LOST);
>>             CHECK_JNI_EXCEPTION(mainEnv)
>>         } else {
>>             mainEnv->CallVoidMethod(jwindow, jWindowNotifyFocusDisabled);
>>             CHECK_JNI_EXCEPTION(mainEnv)
>>         }
>>     }
>> }
>> 
>> 
>> So `glass_window.cpp` was triggering `jWindowNotifyFocusDisabled` which 
>> triggered the java code on the Primary Stage (on the bug reproduce code).
>> 
>> The docs states:
>> 
>>     /**
>>      * Enables or disables the window.
>>      *
>>      * A disabled window is unfocusable by definition.
>>      * Also, key or mouse events aren't generated for disabled windows.
>>      *
>>      * When a user tries to activate a disabled window, or the window gets
>>      * accidentally brought to the top of the stacking order, the window
>>      * generates the FOCUS_DISABLED window event. A Glass client should react
>>      * to this event and bring the currently active modal blocker of the
>>      * disabled window to top by calling blocker's minimize(false), 
>> toFront(),
>>      * and requestFocus() methods. It may also 'blink' the blocker window to
>>      * further attract user's attention.
>>      *
>>      .....
>> 
>> 
>> So I guess the C++ side looks ok, java side on `handleFocusDisabled` I did 
>> not understand why it `requestToFront` and `requestFocus` on the latest 
>> window.
>> 
>> The solution makes disabled windows unfocusable and prevents mouse and 
>> keyboard events as the docs states, making it compatible with other 
>> platforms.
>
> Thiago Milczarek Sayao has updated the pull request incrementally with one 
> additional commit since the last revision:
> 
>   Minimize changes

The ideal fix would be to know the original event and save it's X11 serial 
event number to pass to `gtk_window_present_with_time` so "focus stealing" 
would not happen. But I don't think it's possible because it should save the 
"event serial number" on the original mouse click to open a window (for 
example). As you have thought, many "original event" combinations are possible.

The fix just reorders the `WindowStage.activeWindows` by calling 
`FOCUS_GAINED`. So when `FOCUS_DISABLED` happens it focuses the correct window. 
Please not that with this fix there are extra calls to FOCUS events and reorder 
of `WindowStage.activeWindows` (although they are not expensive).

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

PR: https://git.openjdk.java.net/jfx/pull/598

Reply via email to