Win32: Use dynamic load for imm32

This commit is contained in:
Daijiro Fukuda 2022-04-20 15:01:43 +09:00
parent 15a64185b0
commit 59e192be6d
6 changed files with 60 additions and 7 deletions

View File

@ -13,7 +13,6 @@ if (MSVC OR CMAKE_C_SIMULATE_ID STREQUAL "MSVC")
endif() endif()
if (WIN32) if (WIN32)
link_libraries(imm32)
set(ICON glfw.rc) set(ICON glfw.rc)
elseif (APPLE) elseif (APPLE)
set(ICON glfw.icns) set(ICON glfw.icns)

View File

@ -153,7 +153,7 @@ if (CMAKE_VERSION VERSION_LESS "3.16" AND APPLE)
endif() endif()
if (GLFW_BUILD_WIN32) if (GLFW_BUILD_WIN32)
list(APPEND glfw_PKG_LIBS "-lgdi32 -limm32") list(APPEND glfw_PKG_LIBS "-lgdi32")
endif() endif()
if (GLFW_BUILD_COCOA) if (GLFW_BUILD_COCOA)

View File

@ -167,6 +167,29 @@ static GLFWbool loadLibraries(void)
_glfwPlatformGetModuleSymbol(_glfw.win32.ntdll.instance, "RtlVerifyVersionInfo"); _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; return GLFW_TRUE;
} }
@ -191,6 +214,9 @@ static void freeLibraries(void)
if (_glfw.win32.ntdll.instance) if (_glfw.win32.ntdll.instance)
_glfwPlatformFreeModule(_glfw.win32.ntdll.instance); _glfwPlatformFreeModule(_glfw.win32.ntdll.instance);
if (_glfw.win32.imm32.instance)
_glfwPlatformFreeModule(_glfw.win32.imm32.instance);
} }
// Create key code translation tables // Create key code translation tables

View File

@ -316,6 +316,26 @@ typedef HRESULT (WINAPI * PFN_GetDpiForMonitor)(HMONITOR,MONITOR_DPI_TYPE,UINT*,
typedef LONG (WINAPI * PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*,ULONG,ULONGLONG); typedef LONG (WINAPI * PFN_RtlVerifyVersionInfo)(OSVERSIONINFOEXW*,ULONG,ULONGLONG);
#define RtlVerifyVersionInfo _glfw.win32.ntdll.RtlVerifyVersionInfo_ #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 // WGL extension pointer typedefs
typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC)(int); typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC)(int);
typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC,int,int,UINT,const int*,int*); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC)(HDC,int,int,UINT,const int*,int*);
@ -499,6 +519,19 @@ typedef struct _GLFWlibraryWin32
HINSTANCE instance; HINSTANCE instance;
PFN_RtlVerifyVersionInfo RtlVerifyVersionInfo_; PFN_RtlVerifyVersionInfo RtlVerifyVersionInfo_;
} ntdll; } 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; } _GLFWlibraryWin32;
// Win32-specific per-monitor data // Win32-specific per-monitor data

View File

@ -34,7 +34,6 @@
#include <string.h> #include <string.h>
#include <windowsx.h> #include <windowsx.h>
#include <shellapi.h> #include <shellapi.h>
#include <imm.h>
// Returns the window style for the specified window // Returns the window style for the specified window
// //

View File

@ -3,10 +3,6 @@ link_libraries(glfw)
include_directories("${GLFW_SOURCE_DIR}/deps") include_directories("${GLFW_SOURCE_DIR}/deps")
if (WIN32)
link_libraries(imm32)
endif()
if (MATH_LIBRARY) if (MATH_LIBRARY)
link_libraries("${MATH_LIBRARY}") link_libraries("${MATH_LIBRARY}")
endif() endif()