winex11.drv: Generate WM_IME_ENDCOMPOSITION when preedit ends.

Kusanagi Kouichi slash at ma.neweb.ne.jp
Fri Apr 18 07:52:20 CDT 2008


When preedit ends but not commited, WM_IME_ENDCOMPOSITION is not generated.
---
 dlls/winex11.drv/ime.c |   18 +++++++++++++++---
 1 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/dlls/winex11.drv/ime.c b/dlls/winex11.drv/ime.c
index d77857b..5e614b8 100644
--- a/dlls/winex11.drv/ime.c
+++ b/dlls/winex11.drv/ime.c
@@ -687,16 +687,22 @@ BOOL WINAPI NotifyIME(HIMC hIMC, DWORD dwAction, DWORD dwIndex, DWORD dwValue)
                     TRACE("IMC_SETOPENSTATUS\n");
 
                     myPrivate = (LPIMEPRIVATE)ImmLockIMCC(lpIMC->hPrivate);
-                    if (lpIMC->fOpen != myPrivate->bInternalState)
+                    if (lpIMC->fOpen != myPrivate->bInternalState &&
+                        myPrivate->bInComposition)
                     {
                         if(lpIMC->fOpen == FALSE)
                         {
                             X11DRV_ForceXIMReset(lpIMC->hWnd);
                             GenerateIMEMessage(hIMC,WM_IME_ENDCOMPOSITION,0,0);
+                            myPrivate->bInComposition = FALSE;
                         }
                         else
+                        {
                             GenerateIMEMessage(hIMC,WM_IME_STARTCOMPOSITION,0,0);
+                            GenerateIMEMessage(hIMC, WM_IME_COMPOSITION, 0, 0);
+                        }
                     }
+                    myPrivate->bInternalState = lpIMC->fOpen;
                     bRet = TRUE;
                 }
                 break;
@@ -963,12 +969,18 @@ void IME_SetOpenStatus(BOOL fOpen)
         ImmDestroyIMCC(lpIMC->hCompStr);
         lpIMC->hCompStr = ImeCreateBlankCompStr();
     }
-    myPrivate->bInternalState = fOpen;
 
     ImmUnlockIMCC(lpIMC->hPrivate);
     UnlockRealIMC(FROM_X11);
 
-    ImmSetOpenStatus(RealIMC(FROM_X11), fOpen);
+    if (myPrivate->bInComposition && fOpen == FALSE)
+    {
+        GenerateIMEMessage(FROM_X11, WM_IME_ENDCOMPOSITION, 0, 0);
+        myPrivate->bInComposition = FALSE;
+    }
+
+    if (!myPrivate->bInternalState && fOpen == TRUE)
+        ImmSetOpenStatus(RealIMC(FROM_X11), fOpen);
 }
 
 void IME_XIMPresent(BOOL present)
-- 
1.5.5




More information about the wine-patches mailing list