winex11.drv: Fix IME status handling.

Kusanagi Kouichi slash at ac.auone-net.jp
Mon Jan 9 01:36:10 CST 2012


Fix bug 22866.

Signed-off-by: Kusanagi Kouichi <slash at ac.auone-net.jp>
---
 dlls/winex11.drv/ime.c    |   60 ++++++++++++++++++--------------------------
 dlls/winex11.drv/x11drv.h |    5 ++-
 dlls/winex11.drv/xim.c    |   45 ++++++++++-----------------------
 3 files changed, 42 insertions(+), 68 deletions(-)

diff --git a/dlls/winex11.drv/ime.c b/dlls/winex11.drv/ime.c
index a2b1121..b343a64 100644
--- a/dlls/winex11.drv/ime.c
+++ b/dlls/winex11.drv/ime.c
@@ -719,32 +719,21 @@ BOOL WINAPI NotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
                 case IMC_SETOPENSTATUS:
                     TRACE("IMC_SETOPENSTATUS\n");
 
-                    /* Indirectly called from XIM callbacks */
-                    if (ImmGetIMCCLockCount(lpIMC->hPrivate) > 0)
+                    bRet = TRUE;
+                    X11DRV_SetPreeditState(lpIMC->hWnd, lpIMC->fOpen);
+                    if (!lpIMC->fOpen)
                     {
-                        bRet = TRUE;
-                        break;
-                    }
+                        LPIMEPRIVATE myPrivate;
 
-                    bRet = X11DRV_SetPreeditState(lpIMC->hWnd, lpIMC->fOpen);
-                    if (bRet)
-                    {
-                        if (!lpIMC->fOpen)
+                        myPrivate = ImmLockIMCC(lpIMC->hPrivate);
+                        if (myPrivate->bInComposition)
                         {
-                            LPIMEPRIVATE myPrivate;
-
-                            myPrivate = ImmLockIMCC(lpIMC->hPrivate);
-                            if (myPrivate->bInComposition)
-                            {
-                                X11DRV_ForceXIMReset(lpIMC->hWnd);
-                                GenerateIMEMessage(hIMC, WM_IME_ENDCOMPOSITION, 0, 0);
-                                myPrivate->bInComposition = FALSE;
-                            }
-                            ImmUnlockIMCC(lpIMC->hPrivate);
+                            X11DRV_ForceXIMReset(lpIMC->hWnd);
+                            GenerateIMEMessage(hIMC, WM_IME_ENDCOMPOSITION, 0, 0);
+                            myPrivate->bInComposition = FALSE;
                         }
+                        ImmUnlockIMCC(lpIMC->hPrivate);
                     }
-                    else
-                        lpIMC->fOpen = !lpIMC->fOpen;
 
                     break;
                 default: FIXME("Unknown\n"); break;
@@ -957,7 +946,15 @@ DWORD WINAPI ImeGetImeMenuItems(HIMC hIMC,  DWORD dwFlags,  DWORD dwType,
 
 /* Interfaces to XIM and other parts of winex11drv */
 
-void IME_SetOpenStatus(BOOL fOpen, BOOL force)
+void IME_SetOpenStatus(BOOL fOpen)
+{
+    HIMC imc;
+
+    imc = RealIMC(FROM_X11);
+    ImmSetOpenStatus(imc, fOpen);
+}
+
+void IME_SetCompositionStatus(BOOL fOpen)
 {
     HIMC imc;
     LPINPUTCONTEXT lpIMC;
@@ -970,20 +967,18 @@ void IME_SetOpenStatus(BOOL fOpen, BOOL force)
 
     myPrivate = ImmLockIMCC(lpIMC->hPrivate);
 
-    if (!fOpen && myPrivate->bInComposition)
+    if (fOpen && !myPrivate->bInComposition)
+    {
+        GenerateIMEMessage(imc, WM_IME_STARTCOMPOSITION, 0, 0);
+    }
+    else if (!fOpen && myPrivate->bInComposition)
     {
         ShowWindow(myPrivate->hwndDefault, SW_HIDE);
         ImmDestroyIMCC(lpIMC->hCompStr);
         lpIMC->hCompStr = ImeCreateBlankCompStr();
-        myPrivate->bInComposition = FALSE;
         GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0);
     }
-
-    if (lpIMC->fOpen && fOpen)
-        ImmSetOpenStatus(imc, FALSE);
-
-    if (fOpen || force)
-        ImmSetOpenStatus(imc, fOpen);
+    myPrivate->bInComposition = fOpen;
 
     ImmUnlockIMCC(lpIMC->hPrivate);
     ImmUnlockIMC(imc);
@@ -1059,7 +1054,6 @@ void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen)
     LPINPUTCONTEXT lpIMC;
     HIMCC newCompStr;
     LPIMEPRIVATE myPrivate;
-    BOOL fOpen;
 
     imc = RealIMC(FROM_X11);
     lpIMC = ImmLockIMC(imc);
@@ -1071,15 +1065,11 @@ void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen)
     lpIMC->hCompStr = newCompStr;
 
     myPrivate = ImmLockIMCC(lpIMC->hPrivate);
-    fOpen = lpIMC->fOpen;
-    ImmSetOpenStatus(imc, TRUE);
     if (!myPrivate->bInComposition)
         GenerateIMEMessage(imc, WM_IME_STARTCOMPOSITION, 0, 0);
     GenerateIMEMessage(imc, WM_IME_COMPOSITION, 0, GCS_RESULTSTR);
     if (!myPrivate->bInComposition)
         GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0);
-    if (!fOpen)
-        ImmSetOpenStatus(imc, FALSE);
     ImmUnlockIMCC(lpIMC->hPrivate);
 
     ImmUnlockIMC(imc);
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index 69e7613..bdfb2cf 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -313,7 +313,8 @@ extern BOOL destroy_glxpixmap(Display *display, XID glxpixmap) DECLSPEC_HIDDEN;
 
 /* IME support */
 extern void IME_UnregisterClasses(void) DECLSPEC_HIDDEN;
-extern void IME_SetOpenStatus(BOOL fOpen, BOOL force) DECLSPEC_HIDDEN;
+extern void IME_SetOpenStatus(BOOL fOpen) DECLSPEC_HIDDEN;
+extern void IME_SetCompositionStatus(BOOL fOpen) DECLSPEC_HIDDEN;
 extern INT IME_GetCursorPos(void) DECLSPEC_HIDDEN;
 extern void IME_SetCursorPos(DWORD pos) DECLSPEC_HIDDEN;
 extern void IME_UpdateAssociation(HWND focus) DECLSPEC_HIDDEN;
@@ -881,7 +882,7 @@ extern XIC X11DRV_CreateIC(XIM xim, struct x11drv_win_data *data) DECLSPEC_HIDDE
 extern void X11DRV_SetupXIM(void) DECLSPEC_HIDDEN;
 extern void X11DRV_XIMLookupChars( const char *str, DWORD count ) DECLSPEC_HIDDEN;
 extern void X11DRV_ForceXIMReset(HWND hwnd) DECLSPEC_HIDDEN;
-extern BOOL X11DRV_SetPreeditState(HWND hwnd, BOOL fOpen) DECLSPEC_HIDDEN;
+extern void X11DRV_SetPreeditState(HWND hwnd, BOOL fOpen) DECLSPEC_HIDDEN;
 
 #define XEMBED_MAPPED  (1 << 0)
 
diff --git a/dlls/winex11.drv/xim.c b/dlls/winex11.drv/xim.c
index 95032d4..786578e 100644
--- a/dlls/winex11.drv/xim.c
+++ b/dlls/winex11.drv/xim.c
@@ -129,10 +129,10 @@ static BOOL XIMPreEditStateNotifyCallback(XIC xic, XPointer p, XPointer data)
     switch (state)
     {
     case XIMPreeditEnable:
-        IME_SetOpenStatus(TRUE, TRUE);
+        IME_SetOpenStatus(TRUE);
         break;
     case XIMPreeditDisable:
-        IME_SetOpenStatus(FALSE, TRUE);
+        IME_SetOpenStatus(FALSE);
         break;
     default:
         break;
@@ -143,7 +143,7 @@ static BOOL XIMPreEditStateNotifyCallback(XIC xic, XPointer p, XPointer data)
 static int XIMPreEditStartCallback(XIC ic, XPointer client_data, XPointer call_data)
 {
     TRACE("PreEditStartCallback %p\n",ic);
-    IME_SetOpenStatus(TRUE, FALSE);
+    IME_SetCompositionStatus(TRUE);
     ximInComposeMode = TRUE;
     return -1;
 }
@@ -157,7 +157,7 @@ static void XIMPreEditDoneCallback(XIC ic, XPointer client_data, XPointer call_d
     dwCompStringSize = 0;
     dwCompStringLength = 0;
     CompositionString = NULL;
-    IME_SetOpenStatus(FALSE, FALSE);
+    IME_SetCompositionStatus(FALSE);
 }
 
 static void XIMPreEditDrawCallback(XIM ic, XPointer client_data,
@@ -264,48 +264,31 @@ void X11DRV_ForceXIMReset(HWND hwnd)
     }
 }
 
-BOOL X11DRV_SetPreeditState(HWND hwnd, BOOL fOpen)
+void X11DRV_SetPreeditState(HWND hwnd, BOOL fOpen)
 {
     XIC ic;
     XIMPreeditState state;
-    XVaNestedList attr_set, attr_get;
-    BOOL ret;
+    XVaNestedList attr;
 
     ic = X11DRV_get_ic(hwnd);
     if (!ic)
-        return FALSE;
+        return;
 
     if (fOpen)
         state = XIMPreeditEnable;
     else
         state = XIMPreeditDisable;
 
-    ret = FALSE;
     wine_tsx11_lock();
 
-    attr_set = XVaCreateNestedList(0, XNPreeditState, state, NULL);
-    if (attr_set == NULL)
-        goto error1;
-
-    attr_get = XVaCreateNestedList(0, XNPreeditState, &state, NULL);
-    if (attr_get == NULL)
-        goto error2;
-
-    if (XSetICValues(ic, XNPreeditAttributes, attr_set, NULL) != NULL)
-        goto error3;
-
-    /* SCIM claims it supports XNPreeditState, but seems to ignore */
-    state = XIMPreeditUnKnown;
-    ret = XGetICValues(ic, XNPreeditAttributes, attr_get, NULL) == NULL &&
-          ((fOpen && state == XIMPreeditEnable) ||
-           (!fOpen && state == XIMPreeditDisable));
-error3:
-    XFree(attr_get);
-error2:
-    XFree(attr_set);
-error1:
+    attr = XVaCreateNestedList(0, XNPreeditState, state, NULL);
+    if (attr != NULL)
+    {
+        XSetICValues(ic, XNPreeditAttributes, attr, NULL);
+        XFree(attr);
+    }
+
     wine_tsx11_unlock();
-    return ret;
 }
 
 
-- 
1.7.8.2




More information about the wine-patches mailing list