[PATCH v2] winex11.drv: Call ImeSetCompositionString after IME_SetResultString

Alex Kwak emotionbug at apache.org
Tue Apr 19 01:02:29 CDT 2022


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 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);
>   }
>   



More information about the wine-devel mailing list