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@kakao.com --- dlls/winex11.drv/ime.c | 11 +++++++++-- dlls/winex11.drv/x11drv.h | 3 ++- dlls/winex11.drv/xim.c | 3 ++- 3 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/dlls/winex11.drv/ime.c b/dlls/winex11.drv/ime.c index c1584930861..f01c839b833 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; @@ -1048,10 +1049,16 @@ void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen)
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 (!inComp) + { + GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0); ImmSetOpenStatus(imc, FALSE); + } + else + { + ImeSetCompositionString(imc, SCS_SETSTR, compStr, compStrLen, NULL, 0); + }
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); }