[PATCH 1/1] winex11.drv: Call ImeSetCompositionString after IME_SetResultString

Alex Kwak take-me-home at kakao.com
Tue Mar 29 03:23:45 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>
---
 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);
 }
 
-- 
2.32.0




More information about the wine-devel mailing list