[PATCH] winex11.drv: Fix IME_SetResultString for Korean(hangul) IME.

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


A new patch has been submitted and will no longer be used.


Regards,

Alex

2022-03-20 오후 9:17에 Alex Kwak 이(가) 쓴 글:
> In a special case for Hangul(Korean), when Composition is completed and
> this function is called, the new Composition disappears. so, calling
> IME_SetCompositionString again for makes composition will be
> starting.
>
> Signed-off-by: Alex Kwak <take-me-home at kakao.com>
> ---
>   dlls/winex11.drv/ime.c    |  4 ++--
>   dlls/winex11.drv/x11drv.h | 27 +++++++++++++++++++++++++++
>   dlls/winex11.drv/xim.c    | 13 +++++++++++++
>   3 files changed, 42 insertions(+), 2 deletions(-)
>
> diff --git a/dlls/winex11.drv/ime.c b/dlls/winex11.drv/ime.c
> index c1584930861..f7827b31635 100644
> --- a/dlls/winex11.drv/ime.c
> +++ b/dlls/winex11.drv/ime.c
> @@ -1050,8 +1050,8 @@ void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen)
>       GenerateIMEMessage(imc, WM_IME_COMPOSITION, lpResult[0], GCS_RESULTSTR|GCS_RESULTCLAUSE);
>       GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0);
>   
> -    if (!inComp)
> -        ImmSetOpenStatus(imc, FALSE);
> +    myPrivate->bInComposition = FALSE;
> +    ImmSetOpenStatus(imc, FALSE);
>   
>       ImmUnlockIMC(imc);
>   }
> diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h
> index f389f3e0836..8ce3a7e8528 100644
> --- a/dlls/winex11.drv/x11drv.h
> +++ b/dlls/winex11.drv/x11drv.h
> @@ -841,4 +841,31 @@ static inline BOOL is_window_rect_mapped( const RECT *rect )
>               max( rect->bottom, rect->top + 1 ) > virtual_rect.top);
>   }
>   
> +#define HANGUL_BASE                 0xac00
> +#define HANGUL_LAST                 0xd7a3
> +#define HANGUL_JAMO_BASE            0x1100
> +#define HANGUL_JAMO_LAST            0x11F9
> +#define HANGUL_COMPAT_JAMO_BASE     0x3130
> +#define HANGUL_COMPAT_JAMO_LAST     0x318E
> +#define HANGUL_LCOUNT 19
> +#define HANGUL_VCOUNT 21
> +#define HANGUL_TCOUNT 28
> +#define HANGUL_NCOUNT (HANGUL_VCOUNT * HANGUL_TCOUNT)
> +#define HANGUL_SCOUNT (HANGUL_LCOUNT * HANGUL_NCOUNT)
> +
> +/*
> + * This method exists to handle special cases related to Korean(Hangul).
> + */
> +static inline BOOL IsHangul(WPARAM wParam)
> +{
> +    if (!wParam)
> +    {
> +        return FALSE;
> +    }
> +
> +    return (wParam >= HANGUL_BASE && wParam < HANGUL_LAST) ||
> +           (wParam >= HANGUL_COMPAT_JAMO_BASE && wParam < HANGUL_COMPAT_JAMO_LAST) ||
> +           (wParam >= HANGUL_JAMO_BASE && wParam < HANGUL_JAMO_LAST);
> +}
> +
>   #endif  /* __WINE_X11DRV_H */
> diff --git a/dlls/winex11.drv/xim.c b/dlls/winex11.drv/xim.c
> index 3994c2106cc..884db67c59c 100644
> --- a/dlls/winex11.drv/xim.c
> +++ b/dlls/winex11.drv/xim.c
> @@ -117,6 +117,19 @@ void X11DRV_XIMLookupChars( const char *str, DWORD count )
>   
>       IME_SetResultString(wcOutput, dwOutput);
>       HeapFree(GetProcessHeap(), 0, wcOutput);
> +
> +    /*
> +     * In a special case for Hangul(Korean), when Composition is completed and
> +     * this function is called, the new Composition disappears. so, calling
> +     * IME_SetCompositionString again for makes composition will be
> +     * starting.
> +     */
> +    if (CompositionString && dwCompStringLength >= sizeof(WCHAR) &&
> +        IsHangul(((const WCHAR*) CompositionString)[0]))
> +    {
> +        IME_SetCompositionString(SCS_SETSTR, CompositionString,
> +                                 dwCompStringLength, NULL, 0);
> +    }
>   }
>   
>   static BOOL XIMPreEditStateNotifyCallback(XIC xic, XPointer p, XPointer data)



More information about the wine-devel mailing list