< prev index next >

src/java.desktop/unix/native/libawt_xawt/awt/awt_InputMethod.c

Print this page

        

*** 1258,1286 **** finally: AWT_UNLOCK(); } static void OpenXIMCallback(Display *display, XPointer client_data, XPointer call_data) { XIMCallback ximCallback; X11im = XOpenIM(display, NULL, NULL, NULL); if (X11im == NULL) { return; } ximCallback.callback = (XIMProc)DestroyXIMCallback; ximCallback.client_data = NULL; XSetIMValues(X11im, XNDestroyCallback, &ximCallback, NULL); } static void DestroyXIMCallback(XIM im, XPointer client_data, XPointer call_data) { /* mark that XIM server was destroyed */ X11im = NULL; ! JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); ! /* free the old pX11IMData and set it to null. this also avoids crashing ! * the jvm if the XIM server reappears */ ! X11InputMethodData *pX11IMData = getX11InputMethodData(env, currentX11InputMethodInstance); } JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XInputMethod_openXIMNative(JNIEnv *env, jobject this, --- 1258,1334 ---- finally: AWT_UNLOCK(); } static void OpenXIMCallback(Display *display, XPointer client_data, XPointer call_data) { + JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); XIMCallback ximCallback; + jclass classClass; + jfieldID pID, lastComponentID; + jobject cdata; + AWT_LOCK(); X11im = XOpenIM(display, NULL, NULL, NULL); if (X11im == NULL) { + AWT_UNLOCK(); return; } + #if defined(__linux__) || defined(MACOSX) + classClass = (*env)->FindClass(env, "sun/awt/X11InputMethod"); + if (!JNU_IsNull(env, classClass)) { + pID = (*env)->GetStaticFieldID(env, classClass, + "activatedInstance", "Lsun/awt/X11InputMethod;"); + lastComponentID = (*env)->GetFieldID(env, classClass, + "lastXICFocussedComponent", "Ljava/awt/Component;"); + if (!JNU_IsNull(env, pID) && !JNU_IsNull(env, lastComponentID)) { + cdata = (*env)->GetStaticObjectField(env, classClass, pID); + if (!JNU_IsNull(env, cdata)) { + // Claer lastXICFocussedComponent before calling activate. + (*env)->SetObjectField(env, cdata, lastComponentID, NULL); + JNU_CallMethodByName(env, NULL, cdata, "activate", "()V"); + if ((*env)->ExceptionOccurred(env)) { + (*env)->ExceptionClear(env); + } + } + } + } + #endif + ximCallback.callback = (XIMProc)DestroyXIMCallback; ximCallback.client_data = NULL; XSetIMValues(X11im, XNDestroyCallback, &ximCallback, NULL); + #if defined(__linux__) || defined(MACOSX) + XUnregisterIMInstantiateCallback(display, NULL, NULL, NULL, + OpenXIMCallback, NULL); + #endif + AWT_UNLOCK(); } static void DestroyXIMCallback(XIM im, XPointer client_data, XPointer call_data) { + JNIEnv* env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2); + + AWT_LOCK(); /* mark that XIM server was destroyed */ X11im = NULL; ! ! X11InputMethodGRefNode *pX11InputMethodGRef = x11InputMethodGRefListHead; ! while (pX11InputMethodGRef != NULL) { ! X11InputMethodGRefNode *next = pX11InputMethodGRef->next; ! /* free the old pX11IMData and set it to null. this also avoids ! * crashing the jvm if the XIM server reappears */ ! getX11InputMethodData(env, pX11InputMethodGRef->inputMethodGRef); ! pX11InputMethodGRef = next; ! } ! currentX11InputMethodInstance = NULL; ! currentFocusWindow = 0; ! ! #if defined(__linux__) || defined(MACOSX) ! XRegisterIMInstantiateCallback(dpy, NULL, NULL, NULL, ! (XIDProc)OpenXIMCallback, NULL); ! #endif ! AWT_UNLOCK(); } JNIEXPORT jboolean JNICALL Java_sun_awt_X11_XInputMethod_openXIMNative(JNIEnv *env, jobject this,
*** 1342,1361 **** #endif /* __linux__ || MACOSX */ pX11IMData->lookup_buf = 0; pX11IMData->lookup_buf_len = 0; if (createXIC(env, pX11IMData, (Window)window) == False) { destroyX11InputMethodData((JNIEnv *) NULL, pX11IMData); pX11IMData = (X11InputMethodData *) NULL; if ((*env)->ExceptionCheck(env)) { goto finally; } } - setX11InputMethodData(env, this, pX11IMData); - finally: AWT_UNLOCK(); return (pX11IMData != NULL); } --- 1390,1409 ---- #endif /* __linux__ || MACOSX */ pX11IMData->lookup_buf = 0; pX11IMData->lookup_buf_len = 0; + setX11InputMethodData(env, this, pX11IMData); if (createXIC(env, pX11IMData, (Window)window) == False) { destroyX11InputMethodData((JNIEnv *) NULL, pX11IMData); pX11IMData = (X11InputMethodData *) NULL; + setX11InputMethodData(env, this, pX11IMData); if ((*env)->ExceptionCheck(env)) { goto finally; } } finally: AWT_UNLOCK(); return (pX11IMData != NULL); }
< prev index next >