[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