From 59e192be6d29021abfb419f2bfa33ec847e4ef8c Mon Sep 17 00:00:00 2001 From: Daijiro Fukuda Date: Wed, 20 Apr 2022 15:01:43 +0900 Subject: [PATCH] Win32: Use dynamic load for imm32 --- examples/CMakeLists.txt | 1 - src/CMakeLists.txt | 2 +- src/win32_init.c | 26 ++++++++++++++++++++++++++ src/win32_platform.h | 33 +++++++++++++++++++++++++++++++++ src/win32_window.c | 1 - tests/CMakeLists.txt | 4 ---- 6 files changed, 60 insertions(+), 7 deletions(-) diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index bd2300107..e7a037976 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -13,7 +13,6 @@ if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC") endif() if (WIN32) - link_libraries(imm32) set(ICON glfw.rc) elseif (APPLE) set(ICON glfw.icns) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 896e958a8..61455ec49 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -153,7 +153,7 @@ if (CMAKE_VERSION VERSION_LESS "3.16" AND APPLE) endif() if (GLFW_BUILD_WIN32) - list(APPEND glfw_PKG_LIBS "-lgdi32 -limm32") + list(APPEND glfw_PKG_LIBS "-lgdi32") endif() if (GLFW_BUILD_COCOA) diff --git a/src/win32_init.c b/src/win32_init.c index 1cdc5b98d..cbfa40d47 100644 --- a/src/win32_init.c +++ b/src/win32_init.c @@ -167,6 +167,29 @@ static GLFWbool loadLibraries(void) _glfwPlatformGetModuleSymbol(_glfw.win32.ntdll.instance, "RtlVerifyVersionInfo"); } + _glfw.win32.imm32.instance = _glfwPlatformLoadModule("imm32.dll"); + if (_glfw.win32.imm32.instance) + { + _glfw.win32.imm32.ImmGetCompositionStringW_ = (PFN_ImmGetCompositionStringW) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmGetCompositionStringW"); + _glfw.win32.imm32.ImmGetContext_ = (PFN_ImmGetContext) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmGetContext"); + _glfw.win32.imm32.ImmGetConversionStatus_ = (PFN_ImmGetConversionStatus) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmGetConversionStatus"); + _glfw.win32.imm32.ImmGetDescriptionW_ = (PFN_ImmGetDescriptionW) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmGetDescriptionW"); + _glfw.win32.imm32.ImmGetOpenStatus_ = (PFN_ImmGetOpenStatus) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmGetOpenStatus"); + _glfw.win32.imm32.ImmNotifyIME_ = (PFN_ImmNotifyIME) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmNotifyIME"); + _glfw.win32.imm32.ImmReleaseContext_ = (PFN_ImmReleaseContext) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmReleaseContext"); + _glfw.win32.imm32.ImmSetCandidateWindow_ = (PFN_ImmSetCandidateWindow) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmSetCandidateWindow"); + _glfw.win32.imm32.ImmSetOpenStatus_ = (PFN_ImmSetOpenStatus) + _glfwPlatformGetModuleSymbol(_glfw.win32.imm32.instance, "ImmSetOpenStatus"); + } + return GLFW_TRUE; } @@ -191,6 +214,9 @@ static void freeLibraries(void) if (_glfw.win32.ntdll.instance) _glfwPlatformFreeModule(_glfw.win32.ntdll.instance); + + if (_glfw.win32.imm32.instance) + _glfwPlatformFreeModule(_glfw.win32.imm32.instance); } // Create key code translation tables diff --git a/src/win32_platform.h b/src/win32_platform.h index c3dc262f3..e5fdc8a03 100644 --- a/src/win32_platform.h +++ b/src/win32_platform.h @@ -316,6 +316,26 @@ typedef HRESULT (WINAPI * PFN_GetDpiForMonitor)(HMONITOR,MONITOR_DPI_TYPE,UINT*, typedef LONG (WINAPI * PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*,ULONG,ULONGLONG); #define RtlVerifyVersionInfo _glfw.win32.ntdll.RtlVerifyVersionInfo_ +// imm32 function pointer typedefs +typedef LONG (WINAPI * PFN_ImmGetCompositionStringW)(HIMC,DWORD,LPVOID,DWORD); +typedef HIMC (WINAPI * PFN_ImmGetContext)(HWND); +typedef BOOL (WINAPI * PFN_ImmGetConversionStatus)(HIMC,LPDWORD,LPDWORD); +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_ImmSetCandidateWindow)(HIMC,LPCANDIDATEFORM); +typedef BOOL (WINAPI * PFN_ImmSetOpenStatus)(HIMC,BOOL); +#define ImmGetCompositionStringW _glfw.win32.imm32.ImmGetCompositionStringW_ +#define ImmGetContext _glfw.win32.imm32.ImmGetContext_ +#define ImmGetConversionStatus _glfw.win32.imm32.ImmGetConversionStatus_ +#define ImmGetDescriptionW _glfw.win32.imm32.ImmGetDescriptionW_ +#define ImmGetOpenStatus _glfw.win32.imm32.ImmGetOpenStatus_ +#define ImmNotifyIME _glfw.win32.imm32.ImmNotifyIME_ +#define ImmReleaseContext _glfw.win32.imm32.ImmReleaseContext_ +#define ImmSetCandidateWindow _glfw.win32.imm32.ImmSetCandidateWindow_ +#define ImmSetOpenStatus _glfw.win32.imm32.ImmSetOpenStatus_ + // WGL extension pointer typedefs typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC)(int); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC,int,int,UINT,const int*,int*); @@ -499,6 +519,19 @@ typedef struct _GLFWlibraryWin32 HINSTANCE instance; PFN_RtlVerifyVersionInfo RtlVerifyVersionInfo_; } ntdll; + + struct { + HINSTANCE instance; + PFN_ImmGetCompositionStringW ImmGetCompositionStringW_; + PFN_ImmGetContext ImmGetContext_; + PFN_ImmGetConversionStatus ImmGetConversionStatus_; + PFN_ImmGetDescriptionW ImmGetDescriptionW_; + PFN_ImmGetOpenStatus ImmGetOpenStatus_; + PFN_ImmNotifyIME ImmNotifyIME_; + PFN_ImmReleaseContext ImmReleaseContext_; + PFN_ImmSetCandidateWindow ImmSetCandidateWindow_; + PFN_ImmSetOpenStatus ImmSetOpenStatus_; + } imm32; } _GLFWlibraryWin32; // Win32-specific per-monitor data diff --git a/src/win32_window.c b/src/win32_window.c index d3816363a..ebbbbf42e 100644 --- a/src/win32_window.c +++ b/src/win32_window.c @@ -34,7 +34,6 @@ #include #include #include -#include // Returns the window style for the specified window // diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index d54a5b0a1..f81cfeb94 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -3,10 +3,6 @@ link_libraries(glfw) include_directories("${GLFW_SOURCE_DIR}/deps") -if (WIN32) - link_libraries(imm32) -endif() - if (MATH_LIBRARY) link_libraries("${MATH_LIBRARY}") endif()