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