diff --git a/dll/win32/imm32/imm.c b/dll/win32/imm32/imm.c index e68f59c35a1..4bcc133ae66 100644 --- a/dll/win32/imm32/imm.c +++ b/dll/win32/imm32/imm.c @@ -1005,6 +1005,11 @@ LRESULT WINAPI ImmEscapeW( #define ROUNDUP4(n) (((n) + 3) & ~3) /* DWORD alignment */ HANDLE g_hImm32Heap = NULL; +DWORD g_dwImm32Flags = 0; + +/* flags for g_dwImm32Flags */ +#define IMM32_FLAG_UNKNOWN 0x4 +#define IMM32_FLAG_CICERO_ENABLED 0x20 LPVOID APIENTRY Imm32HeapAlloc(DWORD dwFlags, DWORD dwBytes) { @@ -1023,6 +1028,11 @@ Imm32GetThreadState(DWORD Routine) return NtUserGetThreadState(Routine); } +static DWORD_PTR APIENTRY Imm32QueryWindow(HWND hWnd, DWORD Index) +{ + return NtUserQueryWindow(hWnd, Index); +} + static DWORD APIENTRY Imm32UpdateInputContext(HIMC hIMC, DWORD Unknown1, PCLIENTIMC pClientImc) { @@ -2096,14 +2106,21 @@ void WINAPI __wine_unregister_window(HWND hwnd) */ HWND WINAPI ImmGetDefaultIMEWnd(HWND hWnd) { - HWND ret; - IMMThreadData* thread_data = IMM_GetThreadData(hWnd, 0); - if (!thread_data) + if (!(g_dwImm32Flags & IMM32_FLAG_UNKNOWN)) return NULL; - ret = thread_data->hwndDefault; - LeaveCriticalSection(&threaddata_cs); - TRACE("Default is %p\n",ret); - return ret; + + if (hWnd == NULL) + return (HWND)Imm32GetThreadState(THREADSTATE_ACTIVEWINDOW); + + return (HWND)Imm32QueryWindow(hWnd, QUERY_WINDOW_DEFAULT_IME); +} + +/*********************************************************************** + * CtfImmIsCiceroEnabled (IMM32.@) + */ +BOOL WINAPI CtfImmIsCiceroEnabled(VOID) +{ + return !!(g_dwImm32Flags & IMM32_FLAG_CICERO_ENABLED); } /*********************************************************************** diff --git a/dll/win32/imm32/imm32.spec b/dll/win32/imm32/imm32.spec index b41e2ee2049..43107d4797a 100644 --- a/dll/win32/imm32/imm32.spec +++ b/dll/win32/imm32/imm32.spec @@ -1,3 +1,4 @@ +@ stdcall CtfImmIsCiceroEnabled() @ stdcall -stub ImmActivateLayout(long) @ stdcall ImmAssociateContext(ptr ptr) @ stdcall ImmAssociateContextEx(ptr ptr long)