A new patch has been submitted and will no longer be used.
Regards,
Alex
2022-03-31 오전 4:36에 Alex Kwak 이(가) 쓴 글:
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
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,
{ HIMC imc; LPINPUTCONTEXT lpIMC;DWORD compStrLen)
@@ -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);