From ebc6607b656e617087e62020f670141854b4fefa Mon Sep 17 00:00:00 2001 From: Alexander Zvegintsev Date: Fri, 26 Sep 2014 18:43:44 +0400 Subject: [PATCH] 8051857: OperationTimedOut exception inside from XToolkit.syncNativeQueue call Reviewed-by: alexsch, serb --- .../unix/native/common/awt/awt_util.h | 2 ++ .../unix/native/libawt_xawt/xawt/XlibWrapper.c | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/jdk/src/java.desktop/unix/native/common/awt/awt_util.h b/jdk/src/java.desktop/unix/native/common/awt/awt_util.h index dd0be228269..87089054e46 100644 --- a/jdk/src/java.desktop/unix/native/common/awt/awt_util.h +++ b/jdk/src/java.desktop/unix/native/common/awt/awt_util.h @@ -52,6 +52,8 @@ */ extern XErrorHandler current_native_xerror_handler; +Window get_xawt_root_shell(JNIEnv *env); + #endif /* !HEADLESS */ #ifndef INTERSECTS diff --git a/jdk/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c b/jdk/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c index 60298f7c4d3..f1d63185186 100644 --- a/jdk/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c +++ b/jdk/src/java.desktop/unix/native/libawt_xawt/xawt/XlibWrapper.c @@ -2011,10 +2011,14 @@ static Bool exitSecondaryLoop = True; * Toolkit thread to process PropertyNotify or SelectionNotify events. */ static Bool -secondary_loop_event(Display* dpy, XEvent* event, char* arg) { - return (event->type == SelectionNotify || - event->type == SelectionClear || - event->type == PropertyNotify) ? True : False; +secondary_loop_event(Display* dpy, XEvent* event, XPointer xawt_root_window) { + return ( + event->type == SelectionNotify || + event->type == SelectionClear || + event->type == PropertyNotify || + (event->type == ConfigureNotify + && event->xany.window == *(Window*) xawt_root_window) + ) ? True : False; } @@ -2025,8 +2029,11 @@ Java_sun_awt_X11_XlibWrapper_XNextSecondaryLoopEvent(JNIEnv *env, jclass clazz, AWT_CHECK_HAVE_LOCK_RETURN(JNI_FALSE); exitSecondaryLoop = False; + Window xawt_root_window = get_xawt_root_shell(env); + while (!exitSecondaryLoop) { - if (XCheckIfEvent((Display*) jlong_to_ptr(display), (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, NULL)) { + if (XCheckIfEvent((Display*) jlong_to_ptr(display), + (XEvent*) jlong_to_ptr(ptr), secondary_loop_event, (XPointer) &xawt_root_window)) { return JNI_TRUE; } timeout = (timeout < AWT_SECONDARY_LOOP_TIMEOUT) ? (timeout << 1) : AWT_SECONDARY_LOOP_TIMEOUT;