RFR: 8271054: [REDO] Wrong stage gets focused after modal stage creation [v2]

Thiago Milczarek Sayao tsayao at openjdk.java.net
Tue Sep 21 21:33:44 UTC 2021


> 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:

  handleFocusDisabled() should bring up the blocker window not the previous one.

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

Changes:
  - all: https://git.openjdk.java.net/jfx/pull/598/files
  - new: https://git.openjdk.java.net/jfx/pull/598/files/3770f101..850cfc8b

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jfx&pr=598&range=01
 - incr: https://webrevs.openjdk.java.net/?repo=jfx&pr=598&range=00-01

  Stats: 16 lines in 2 files changed: 10 ins; 0 del; 6 mod
  Patch: https://git.openjdk.java.net/jfx/pull/598.diff
  Fetch: git fetch https://git.openjdk.java.net/jfx pull/598/head:pull/598

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


More information about the openjfx-dev mailing list