< prev index next >

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

Print this page

        

@@ -1258,29 +1258,77 @@
  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;
-    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);
+
+    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,20 +1390,20 @@
 #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;
         }
     }
 
-    setX11InputMethodData(env, this, pX11IMData);
-
 finally:
     AWT_UNLOCK();
     return (pX11IMData != NULL);
 }
 
< prev index next >