[PATCH v2] winex11.drv: Call ImeSetCompositionString after IME_SetResultString
Alex Kwak
take-me-home at kakao.com
Wed Mar 30 14:36:18 CDT 2022
IME_SetResultString function overwrite composition strings. so, next
composition is not display on GUI. but, still have an xim. Therefore,
there was a string that seemed to have disappeared in the middle of the
input.
Therefore, change it as follows. When calling IME_SetResultString, if
in a Composition state, no longer generate WM_IME_ENDCOMPOSITION and
call back the previous Composition to recover the overwritten
Composition.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=52700
Signed-off-by: Alex Kwak <take-me-home at kakao.com>
---
v2: use updateCompStr instead IME_SetResultString.
---
dlls/winex11.drv/ime.c | 21 +++++++++++++++++----
dlls/winex11.drv/x11drv.h | 3 ++-
dlls/winex11.drv/xim.c | 3 ++-
3 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/dlls/winex11.drv/ime.c b/dlls/winex11.drv/ime.c
index c1584930861..0212a127205 100644
--- a/dlls/winex11.drv/ime.c
+++ b/dlls/winex11.drv/ime.c
@@ -1015,7 +1015,8 @@ BOOL IME_SetCompositionString(DWORD dwIndex, LPCVOID lpComp, DWORD dwCompLen,
lpRead, dwReadLen);
}
-void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen)
+void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen, LPCVOID compStr,
+ DWORD compStrLen)
{
HIMC imc;
LPINPUTCONTEXT lpIMC;
@@ -1028,7 +1029,8 @@ void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen)
if (lpIMC == NULL)
return;
- newCompStr = updateCompStr(lpIMC->hCompStr, NULL, 0);
+ newCompStr = updateCompStr(lpIMC->hCompStr, (LPCWSTR) compStr,
+ compStrLen / sizeof(WCHAR));
ImmDestroyIMCC(lpIMC->hCompStr);
lpIMC->hCompStr = newCompStr;
@@ -1046,12 +1048,23 @@ void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen)
GenerateIMEMessage(imc, WM_IME_STARTCOMPOSITION, 0, 0);
}
- GenerateIMEMessage(imc, WM_IME_COMPOSITION, 0, GCS_COMPSTR);
GenerateIMEMessage(imc, WM_IME_COMPOSITION, lpResult[0], GCS_RESULTSTR|GCS_RESULTCLAUSE);
- GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0);
+
+ if (compStrLen / sizeof(WCHAR) > 0)
+ {
+ GenerateIMEMessage(imc, WM_IME_COMPOSITION, ((LPCWSTR) compStr)[0],
+ GCS_COMPSTR);
+ }
+ else
+ {
+ GenerateIMEMessage(imc, WM_IME_COMPOSITION, 0, GCS_COMPSTR);
+ }
if (!inComp)
+ {
+ GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0);
ImmSetOpenStatus(imc, FALSE);
+ }
ImmUnlockIMC(imc);
}
diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
index f389f3e0836..ca077caa45c 100644
--- a/dlls/winex11.drv/x11drv.h
+++ b/dlls/winex11.drv/x11drv.h
@@ -290,7 +290,8 @@ extern void IME_UpdateAssociation(HWND focus) DECLSPEC_HIDDEN;
extern BOOL IME_SetCompositionString(DWORD dwIndex, LPCVOID lpComp,
DWORD dwCompLen, LPCVOID lpRead,
DWORD dwReadLen) DECLSPEC_HIDDEN;
-extern void IME_SetResultString(LPWSTR lpResult, DWORD dwResultlen) DECLSPEC_HIDDEN;
+extern void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen,
+ LPCVOID compStr, DWORD compStrLen) DECLSPEC_HIDDEN;
extern void X11DRV_XDND_EnterEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
extern void X11DRV_XDND_PositionEvent( HWND hWnd, XClientMessageEvent *event ) DECLSPEC_HIDDEN;
diff --git a/dlls/winex11.drv/xim.c b/dlls/winex11.drv/xim.c
index 3994c2106cc..3b762d45b3c 100644
--- a/dlls/winex11.drv/xim.c
+++ b/dlls/winex11.drv/xim.c
@@ -115,7 +115,8 @@ void X11DRV_XIMLookupChars( const char *str, DWORD count )
if ((focus = GetFocus()))
IME_UpdateAssociation(focus);
- IME_SetResultString(wcOutput, dwOutput);
+ IME_SetResultString(wcOutput, dwOutput, CompositionString,
+ dwCompStringLength);
HeapFree(GetProcessHeap(), 0, wcOutput);
}
--
2.32.0
More information about the wine-devel
mailing list