From: Alex Kwak Subject: [PATCH v2] winex11.drv: Call ImeSetCompositionString after IME_SetResultString Message-Id: <20220330193618.83940-1-take-me-home@kakao.com> Date: Thu, 31 Mar 2022 04:36:18 +0900 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 --- 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