This PR fixes the dialog freeze problem once and for all. 

This one is a bit tricky to understand, here is how it works:
This bug happens on every platform, although the implementation of nested event 
loops differs on every platform.
E.g. on Linux we use `gtk_main` and `gtk_main_quit`, on Windows and Mac we have 
an own implementation of a nested event loop (while loop), controlled by a 
boolean flag.

Funny enough, the reason why this bug happens is always the same: Timing.

1. When we hide a dialog, `_leaveNestedEventLoop` is called. 
2. This will call native code to get out of the nested event loop, e.g. on 
Windows we try to break out of the while loop with a boolean flag, on Linux we 
call `gtk_main_quit`.
3. Now, if we immediately open a new dialog, we enter a new nested event loop 
via `_enterNestedEventLoop`, as a consequence we do not break out of the while 
loop on Windows (the flag is set back again, the while loop is still running), 
and we do not return from `gtk_main` on Linux.
4. And this will result in the Java code never returning and calling 
`notifyLeftNestedEventLoop`, which we need to recover the UI.

So it is actually not trivial to fix this problem, and we can not really do 
anything on the Java side. We may can try to wait until one more frame has run 
so that things will hopefully be right, but that sounds rather hacky.

I therefore analyzed, if we even need to return from `_enterNestedEventLoop`. 
Turns out, we don't need to. 
There is a return value which we actually do not use (it does not have any 
meaning to us, other that it is used inside an assert statement).
Without the need of a return value, we also do not need to care when 
`_enterNestedEventLoop` is returning - instead we cleanup and call 
`notifyLeftNestedEventLoop` in `_leaveNestedEventLoop`, after the native code 
was called.

Lets see if this is the right approach (for all platforms).
Testing appreciated.
#
- [x] Tested on Windows
- [x] Tested on Linux
- [x] Tested on Mac
- [ ] Tested on iOS (although the nested event loop code is the same as for 
Mac) (I would appreciate if someone can do this as I have no access to an iOS 
device)
- [ ] Adjust copyright
- [ ] Write Systemtest

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

Commit messages:
 - JDK-8285893: Hiding dialog and showing new one causes dialog to be frozen

Changes: https://git.openjdk.org/jfx/pull/1324/files
 Webrev: https://webrevs.openjdk.org/?repo=jfx&pr=1324&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8285893
  Stats: 164 lines in 13 files changed: 12 ins; 81 del; 71 mod
  Patch: https://git.openjdk.org/jfx/pull/1324.diff
  Fetch: git fetch https://git.openjdk.org/jfx.git pull/1324/head:pull/1324

PR: https://git.openjdk.org/jfx/pull/1324

Reply via email to