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