On Wed, 22 Sep 2021 16:39:15 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: > > Break if reach self The above test fails for me on Linux (Ubuntu 20.04 VM) as well. The manual test case attached to [JDK-8269429](https://bugs.openjdk.java.net/browse/JDK-8269429) also fails on Linux. I think you will need a solution that doesn't modify the logic in `WindowStage.java`. modules/javafx.graphics/src/main/java/com/sun/javafx/tk/quantum/WindowStage.java line 861: > 859: > 860: // walk backwards to find a blocker > 861: for (int i = activeWindows.size() - 1; i > 0; i--) { I think you will need to revert this part of the change. ------------- Changes requested by kcr (Lead). PR: https://git.openjdk.java.net/jfx/pull/598