From: Piotr Caban Subject: [PATCH 1/2] imm32: Register IME window class on first use Message-Id: <53D9051B.1030101@codeweavers.com> Date: Wed, 30 Jul 2014 09:45:47 -0500 --- dlls/imm32/Makefile.in | 3 ++- dlls/imm32/imm.c | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/dlls/imm32/Makefile.in b/dlls/imm32/Makefile.in index b190888..4ada4cb 100644 --- a/dlls/imm32/Makefile.in +++ b/dlls/imm32/Makefile.in @@ -1,6 +1,7 @@ MODULE = imm32.dll IMPORTLIB = imm32 -IMPORTS = user32 gdi32 advapi32 +IMPORTS = gdi32 advapi32 +DELAYIMPORTS = user32 C_SRCS = \ imm.c diff --git a/dlls/imm32/imm.c b/dlls/imm32/imm.c index 2fa31ac..3a80f8e 100644 --- a/dlls/imm32/imm.c +++ b/dlls/imm32/imm.c @@ -109,6 +109,7 @@ static const WCHAR szLayoutTextW[] = {'L','a','y','o','u','t',' ','T','e','x','t static const WCHAR szImeRegFmt[] = {'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\','C','o','n','t','r','o','l','\\','K','e','y','b','o','a','r','d',' ','L','a','y','o','u','t','s','\\','%','0','8','l','x',0}; static const WCHAR szwIME[] = {'I','M','E',0}; +static ATOM ime_class; static LRESULT WINAPI DefIME_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); @@ -376,7 +377,7 @@ static void IMM_RegisterMessages(void) WM_MSIME_DOCUMENTFEED = RegisterWindowMessageA("MSIMEDocumentFeed"); } -static void IMM_RegisterIMEClass(void) +static BOOL WINAPI IMM_RegisterIMEClass(INIT_ONCE *once, void *param, void **context) { WNDCLASSW wndClass; @@ -388,7 +389,8 @@ static void IMM_RegisterIMEClass(void) wndClass.hCursor = LoadCursorW(NULL, (LPWSTR)IDC_ARROW); wndClass.lpszClassName = szwIME; - RegisterClassW(&wndClass); + ime_class = RegisterClassW(&wndClass); + return TRUE; } BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved) @@ -401,7 +403,6 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved) tlsIndex = TlsAlloc(); if (tlsIndex == TLS_OUT_OF_INDEXES) return FALSE; - IMM_RegisterIMEClass(); break; case DLL_THREAD_ATTACH: break; @@ -413,7 +414,8 @@ BOOL WINAPI DllMain(HINSTANCE hInstDLL, DWORD fdwReason, LPVOID lpReserved) IMM_FreeThreadData(); IMM_FreeAllImmHkl(); TlsFree(tlsIndex); - UnregisterClassW(szwIME, NULL); + if(ime_class) + UnregisterClassW(MAKEINTRESOURCEW(ime_class), NULL); break; } return TRUE; @@ -1539,6 +1541,12 @@ BOOL WINAPI ImmGetConversionStatus( */ HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd) { + static INIT_ONCE class_init_once = INIT_ONCE_STATIC_INIT; + + InitOnceExecuteOnce(&class_init_once, IMM_RegisterIMEClass, NULL, NULL); + if(!ime_class) + return NULL; + if (IMM_GetThreadData()->hwndDefault == NULL) IMM_GetThreadData()->hwndDefault = CreateWindowExW( WS_EX_TOOLWINDOW, szwIME, NULL, WS_POPUP, 0, 0, 1, 1, 0, 0, 0, 0);