From 4a3730838965b2caffdaa5ca81c93ce9b016a8e5 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 1 May 2008 10:56:34 +0200 Subject: [PATCH] winex11: Register IME classes only when needed. --- dlls/winex11.drv/ime.c | 68 +++++++++++++++++++++++------------------- dlls/winex11.drv/x11drv.h | 4 +-- dlls/winex11.drv/x11drv_main.c | 5 ++-- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/dlls/winex11.drv/ime.c b/dlls/winex11.drv/ime.c index 5b5e8f29ea4..c1794104c41 100644 --- a/dlls/winex11.drv/ime.c +++ b/dlls/winex11.drv/ime.c @@ -123,6 +123,42 @@ static BOOL UnlockRealIMC(HIMC hIMC) return FALSE; } +static void IME_RegisterClasses(void) +{ + static int done; + WNDCLASSW wndClass; + + if (done) return; + done = 1; + + ZeroMemory(&wndClass, sizeof(WNDCLASSW)); + wndClass.style = CS_GLOBALCLASS | CS_IME | CS_HREDRAW | CS_VREDRAW; + wndClass.lpfnWndProc = IME_WindowProc; + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 2 * sizeof(LONG); + wndClass.hInstance = x11drv_module; + wndClass.hCursor = LoadCursorW(NULL, (LPWSTR)IDC_ARROW); + wndClass.hIcon = LoadIconW(NULL, (LPWSTR)IDI_APPLICATION); + wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW +1); + wndClass.lpszMenuName = 0; + wndClass.lpszClassName = UI_CLASS_NAME; + + RegisterClassW(&wndClass); + + WM_MSIME_SERVICE = RegisterWindowMessageA("MSIMEService"); + WM_MSIME_RECONVERTOPTIONS = RegisterWindowMessageA("MSIMEReconvertOptions"); + WM_MSIME_MOUSE = RegisterWindowMessageA("MSIMEMouseOperation"); + WM_MSIME_RECONVERTREQUEST = RegisterWindowMessageA("MSIMEReconvertRequest"); + WM_MSIME_RECONVERT = RegisterWindowMessageA("MSIMEReconvert"); + WM_MSIME_QUERYPOSITION = RegisterWindowMessageA("MSIMEQueryPosition"); + WM_MSIME_DOCUMENTFEED = RegisterWindowMessageA("MSIMEDocumentFeed"); +} + +void IME_UnregisterClasses(void) +{ + UnregisterClassW(UI_CLASS_NAME, x11drv_module); +} + static HIMCC ImeCreateBlankCompStr(void) { HIMCC rc; @@ -520,6 +556,7 @@ BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo, LPWSTR lpszUIClass, LPCWSTR lpszOption) { TRACE("\n"); + IME_RegisterClasses(); lpIMEInfo->dwPrivateDataSize = sizeof (IMEPRIVATE); lpIMEInfo->fdwProperty = IME_PROP_UNICODE | IME_PROP_AT_CARET; lpIMEInfo->fdwConversionCaps = IME_CMODE_NATIVE; @@ -907,37 +944,6 @@ DWORD WINAPI ImeGetImeMenuItems(HIMC hIMC, DWORD dwFlags, DWORD dwType, /* Interfaces to XIM and other parts of winex11drv */ -void IME_RegisterClasses(HINSTANCE hImeInst) -{ - WNDCLASSW wndClass; - ZeroMemory(&wndClass, sizeof(WNDCLASSW)); - wndClass.style = CS_GLOBALCLASS | CS_IME | CS_HREDRAW | CS_VREDRAW; - wndClass.lpfnWndProc = (WNDPROC) IME_WindowProc; - wndClass.cbClsExtra = 0; - wndClass.cbWndExtra = 2 * sizeof(LONG); - wndClass.hInstance = hImeInst; - wndClass.hCursor = LoadCursorW(NULL, (LPWSTR)IDC_ARROW); - wndClass.hIcon = LoadIconW(NULL, (LPWSTR)IDI_APPLICATION); - wndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW +1); - wndClass.lpszMenuName = 0; - wndClass.lpszClassName = UI_CLASS_NAME; - - RegisterClassW(&wndClass); - - WM_MSIME_SERVICE = RegisterWindowMessageA("MSIMEService"); - WM_MSIME_RECONVERTOPTIONS = RegisterWindowMessageA("MSIMEReconvertOptions"); - WM_MSIME_MOUSE = RegisterWindowMessageA("MSIMEMouseOperation"); - WM_MSIME_RECONVERTREQUEST = RegisterWindowMessageA("MSIMEReconvertRequest"); - WM_MSIME_RECONVERT = RegisterWindowMessageA("MSIMEReconvert"); - WM_MSIME_QUERYPOSITION = RegisterWindowMessageA("MSIMEQueryPosition"); - WM_MSIME_DOCUMENTFEED = RegisterWindowMessageA("MSIMEDocumentFeed"); -} - -void IME_UnregisterClasses(HINSTANCE hImeInst) -{ - UnregisterClassW(UI_CLASS_NAME, hImeInst); -} - void IME_SetOpenStatus(BOOL fOpen) { LPINPUTCONTEXT lpIMC; diff --git a/dlls/winex11.drv/x11drv.h b/dlls/winex11.drv/x11drv.h index c543ef8ce0c..0033a1f3f52 100644 --- a/dlls/winex11.drv/x11drv.h +++ b/dlls/winex11.drv/x11drv.h @@ -274,8 +274,7 @@ extern Drawable get_glxdrawable(X11DRV_PDEVICE *physDev); extern BOOL destroy_glxpixmap(Display *display, XID glxpixmap); /* IME support */ -extern void IME_RegisterClasses(HINSTANCE hImeInst); -extern void IME_UnregisterClasses(HINSTANCE hImeInst); +extern void IME_UnregisterClasses(void); extern void IME_SetOpenStatus(BOOL fOpen); extern LRESULT IME_SendMessageToSelectedHWND(UINT msg, WPARAM wParam, LPARAM lParam); extern INT IME_GetCursorPos(); @@ -555,6 +554,7 @@ extern int primary_monitor; extern int copy_default_colors; extern int alloc_system_colors; extern int xrender_error_base; +extern HMODULE x11drv_module; extern BYTE key_state_table[256]; extern POINT cursor_pos; diff --git a/dlls/winex11.drv/x11drv_main.c b/dlls/winex11.drv/x11drv_main.c index 9d64a85dc4f..3287fea3ead 100644 --- a/dlls/winex11.drv/x11drv_main.c +++ b/dlls/winex11.drv/x11drv_main.c @@ -93,6 +93,7 @@ int copy_default_colors = 128; int alloc_system_colors = 256; DWORD thread_data_tls_index = TLS_OUT_OF_INDEXES; int xrender_error_base = 0; +HMODULE x11drv_module = 0; static x11drv_error_callback err_callback; /* current callback for error */ static Display *err_callback_display; /* display callback is set for */ @@ -582,6 +583,7 @@ static void process_detach(void) /* cleanup GDI */ X11DRV_GDI_Finalize(); + IME_UnregisterClasses(); DeleteCriticalSection( &X11DRV_CritSection ); TlsFree( thread_data_tls_index ); } @@ -674,15 +676,14 @@ BOOL WINAPI DllMain( HINSTANCE hinst, DWORD reason, LPVOID reserved ) switch(reason) { case DLL_PROCESS_ATTACH: + x11drv_module = hinst; ret = process_attach(); - IME_RegisterClasses(hinst); break; case DLL_THREAD_DETACH: thread_detach(); break; case DLL_PROCESS_DETACH: process_detach(); - IME_UnregisterClasses(hinst); break; } return ret; -- 2.11.4.GIT