--- old/src/solaris/native/sun/xawt/XlibWrapper.c 2009-08-11 19:21:31.000000000 +0400 +++ new/src/solaris/native/sun/xawt/XlibWrapper.c 2009-08-11 19:21:30.000000000 +0400 @@ -2163,3 +2163,43 @@ (*env)->ReleaseIntArrayElements(env, bitmap, values, JNI_ABORT); } +typedef struct { + JNIEnv *env; + jobject predicateObject; + jmethodID predicateMID; + + jobject event; +} CheckIfEventStruct; + +static Bool +check_if_event_predicate(Display* dpy, XEvent* event, char* arg) { + CheckIfEventStruct * data = (CheckIfEventStruct *)arg; + //NOTE: event == data->event.pData + + return (Bool)((*(data->env))->CallBooleanMethod(data->env, + data->predicateObject, data->predicateMID, + data->event)); +} + +JNIEXPORT jboolean JNICALL +Java_sun_awt_X11_XlibWrapper_CheckIfEvent +(JNIEnv *env, jclass clazz, jlong display, jobject event, jlong event_return, jobject predicate) +{ + //NOTE: event_return == event.pData + + AWT_CHECK_HAVE_LOCK(); + + CheckIfEventStruct data; + + data.env = env; + data.predicateObject = predicate; + data.predicateMID = (*env)->GetMethodID(env, + (*env)->GetObjectClass(env, predicate), + "doesMatch", "(Lsun/awt/X11/XEvent;)Z"); + data.event = event; + + return (jboolean)XCheckIfEvent((Display *)jlong_to_ptr(display), + (XEvent *)jlong_to_ptr(event_return), check_if_event_predicate, + (char*)&data); +} +