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