[PATCH] winex11.drv: Fix IME_SetResultString for Korean(hangul) IME.
Alex Kwak
take-me-home at kakao.com
Sun Mar 20 07:17:27 CDT 2022
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)
--
2.32.0
More information about the wine-devel
mailing list