From 0c57adf4787b5801e6660f028a8f5a89ead7b9b2 Mon Sep 17 00:00:00 2001 From: xfangfang <2553041586@qq.com> Date: Tue, 2 Jul 2024 02:57:11 +0800 Subject: [PATCH] WIN32: Better support for IME --- src/win32_init.c | 2 ++ src/win32_platform.h | 3 +++ src/win32_window.c | 5 ++++- 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/win32_init.c b/src/win32_init.c index 8d0eb65e..ddaca583 100644 --- a/src/win32_init.c +++ b/src/win32_init.c @@ -186,6 +186,8 @@ static GLFWbool loadLibraries(void) _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmNotifyIME"); _glfw.win32.imm32.ImmReleaseContext_ = (PFN_ImmReleaseContext) _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmReleaseContext"); + _glfw.win32.imm32.ImmSetCompositionWindow_ = (PFN_ImmSetCompositionWindow) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmSetCompositionWindow"); _glfw.win32.imm32.ImmSetCandidateWindow_ = (PFN_ImmSetCandidateWindow) _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmSetCandidateWindow"); _glfw.win32.imm32.ImmSetOpenStatus_ = (PFN_ImmSetOpenStatus) diff --git a/src/win32_platform.h b/src/win32_platform.h index eae33340..0db1c5b0 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -326,6 +326,7 @@ typedef UINT (WINAPI * PFN_ImmGetDescriptionW)(HKL,LPWSTR,UINT); typedef BOOL (WINAPI * PFN_ImmGetOpenStatus)(HIMC); typedef BOOL (WINAPI * PFN_ImmNotifyIME)(HIMC,DWORD,DWORD,DWORD); typedef BOOL (WINAPI * PFN_ImmReleaseContext)(HWND,HIMC); +typedef BOOL (WINAPI * PFN_ImmSetCompositionWindow)(HIMC,LPCOMPOSITIONFORM); typedef BOOL (WINAPI * PFN_ImmSetCandidateWindow)(HIMC,LPCANDIDATEFORM); typedef BOOL (WINAPI * PFN_ImmSetOpenStatus)(HIMC,BOOL); #define ImmGetCandidateListW _glfw.win32.imm32.ImmGetCandidateListW_ @@ -336,6 +337,7 @@ typedef BOOL (WINAPI * PFN_ImmSetOpenStatus)(HIMC,BOOL); #define ImmGetOpenStatus _glfw.win32.imm32.ImmGetOpenStatus_ #define ImmNotifyIME _glfw.win32.imm32.ImmNotifyIME_ #define ImmReleaseContext _glfw.win32.imm32.ImmReleaseContext_ +#define ImmSetCompositionWindow _glfw.win32.imm32.ImmSetCompositionWindow_ #define ImmSetCandidateWindow _glfw.win32.imm32.ImmSetCandidateWindow_ #define ImmSetOpenStatus _glfw.win32.imm32.ImmSetOpenStatus_ @@ -536,6 +538,7 @@ typedef struct _GLFWlibraryWin32 PFN_ImmGetOpenStatus ImmGetOpenStatus_; PFN_ImmNotifyIME ImmNotifyIME_; PFN_ImmReleaseContext ImmReleaseContext_; + PFN_ImmSetCompositionWindow ImmSetCompositionWindow_; PFN_ImmSetCandidateWindow ImmSetCandidateWindow_; PFN_ImmSetOpenStatus ImmSetOpenStatus_; } imm32; diff --git a/src/win32_window.c b/src/win32_window.c index 396c1771..e10b8c52 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -2867,8 +2867,11 @@ void _glfwUpdatePreeditCursorRectangleWin32(_GLFWwindow* window) int y = preedit->cursorPosY; int w = preedit->cursorWidth; int h = preedit->cursorHeight; - CANDIDATEFORM excludeRect = { 0, CFS_EXCLUDE, { x, y }, { x, y, x + w, y + h } }; + COMPOSITIONFORM areaRect = { CFS_RECT, { x, y }, { x, y, x + w, y + h } }; + ImmSetCompositionWindow(hIMC, &areaRect); + + CANDIDATEFORM excludeRect = { 0, CFS_EXCLUDE, { x, y }, { x, y, x + w, y + h } }; ImmSetCandidateWindow(hIMC, &excludeRect); ImmReleaseContext(hWnd, hIMC);