diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c index 9e0e59d384d..1d2ae6dd0a1 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -720,12 +720,12 @@ static void test_ImmAssociateContextEx(void) ok(focus != NULL, "CreateWindow failed\n"); SET_EXPECT(WM_IME_SETCONTEXT_DEACTIVATE); SetFocus(focus); - todo_wine CHECK_CALLED(WM_IME_SETCONTEXT_DEACTIVATE); + CHECK_CALLED(WM_IME_SETCONTEXT_DEACTIVATE); rc = pImmAssociateContextEx(hwnd, imc, 0); ok(rc, "ImmAssociateContextEx failed\n"); SET_EXPECT(WM_IME_SETCONTEXT_ACTIVATE); DestroyWindow(focus); - todo_wine CHECK_CALLED(WM_IME_SETCONTEXT_ACTIVATE); + CHECK_CALLED(WM_IME_SETCONTEXT_ACTIVATE); SetFocus(hwnd); rc = pImmAssociateContextEx(hwnd, NULL, IACE_DEFAULT); @@ -2239,6 +2239,13 @@ static void test_com_initialization(void) test_apttype(APTTYPE_MTA); DestroyWindow(wnd); test_apttype(-1); + + wnd = CreateWindowA("static", "static", WS_POPUP, 0, 0, 100, 100, 0, 0, 0, 0); + ok(wnd != NULL, "CreateWindow failed\n"); + ShowWindow(wnd, SW_SHOW); + test_apttype(APTTYPE_MAINSTA); + DestroyWindow(wnd); + test_apttype(-1); } static DWORD WINAPI disable_ime_thread(void *arg) diff --git a/dlls/user32/focus.c b/dlls/user32/focus.c index 4c18238a98b..34cc3880cc9 100644 --- a/dlls/user32/focus.c +++ b/dlls/user32/focus.c @@ -27,6 +27,7 @@ #include "wingdi.h" #include "winuser.h" #include "win.h" +#include "imm.h" #include "user_private.h" #include "wine/server.h" #include "wine/debug.h" @@ -41,7 +42,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(win); */ static HWND set_focus_window( HWND hwnd ) { - HWND previous = 0; + HWND previous = 0, ime_default; BOOL ret; SERVER_START_REQ( set_focus_window ) @@ -57,11 +58,21 @@ static HWND set_focus_window( HWND hwnd ) if (previous) { SendMessageW( previous, WM_KILLFOCUS, (WPARAM)hwnd, 0 ); + + ime_default = ImmGetDefaultIMEWnd( previous ); + if (ime_default) + SendMessageW( ime_default, WM_IME_INTERNAL, IME_INTERNAL_DEACTIVATE, (LPARAM)previous ); + if (hwnd != GetFocus()) return previous; /* changed by the message */ } if (IsWindow(hwnd)) { USER_Driver->pSetFocus(hwnd); + + ime_default = ImmGetDefaultIMEWnd( hwnd ); + if (ime_default) + SendMessageW( ime_default, WM_IME_INTERNAL, IME_INTERNAL_ACTIVATE, (LPARAM)hwnd ); + SendMessageW( hwnd, WM_SETFOCUS, (WPARAM)previous, 0 ); } return previous; diff --git a/dlls/user32/misc.c b/dlls/user32/misc.c index e12a1af5571..9051e30f0f8 100644 --- a/dlls/user32/misc.c +++ b/dlls/user32/misc.c @@ -28,12 +28,15 @@ #include "winbase.h" #include "wingdi.h" #include "controls.h" +#include "imm.h" #include "user_private.h" #include "wine/debug.h" WINE_DEFAULT_DEBUG_CHANNEL(win); +BOOL WINAPI ImmSetActiveContext(HWND, HIMC, BOOL); + #define IMM_INIT_MAGIC 0x19650412 static HWND (WINAPI *imm_get_ui_window)(HKL); BOOL (WINAPI *imm_register_window)(HWND) = NULL; @@ -570,6 +573,27 @@ static BOOL is_ime_ui_msg( UINT msg ) } } +static LRESULT ime_internal_msg( WPARAM wParam, LPARAM lParam) +{ + HWND hwnd = (HWND)lParam; + HIMC himc; + + switch(wParam) + { + case IME_INTERNAL_ACTIVATE: + case IME_INTERNAL_DEACTIVATE: + himc = ImmGetContext(hwnd); + ImmSetActiveContext(hwnd, himc, wParam == IME_INTERNAL_ACTIVATE); + ImmReleaseContext(hwnd, himc); + break; + default: + FIXME("wParam = %lx\n", wParam); + break; + } + + return 0; +} + LRESULT WINAPI ImeWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) { HWND uiwnd; @@ -577,6 +601,9 @@ LRESULT WINAPI ImeWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) if (msg==WM_CREATE) return TRUE; + if (msg==WM_IME_INTERNAL) + return ime_internal_msg(wParam, lParam); + if (imm_get_ui_window && is_ime_ui_msg(msg)) { if ((uiwnd = imm_get_ui_window(GetKeyboardLayout(0)))) @@ -594,6 +621,9 @@ LRESULT WINAPI ImeWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam ) if (msg==WM_CREATE) return TRUE; + if (msg==WM_IME_INTERNAL) + return ime_internal_msg(wParam, lParam); + if (imm_get_ui_window && is_ime_ui_msg(msg)) { if ((uiwnd = imm_get_ui_window(GetKeyboardLayout(0)))) diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h index a30b9ce8734..2b0a09d4931 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h @@ -208,6 +208,9 @@ C_ASSERT( sizeof(struct user_thread_info) <= sizeof(((TEB *)0)->Win32ClientInfo) extern INT global_key_state_counter DECLSPEC_HIDDEN; extern BOOL (WINAPI *imm_register_window)(HWND) DECLSPEC_HIDDEN; extern void (WINAPI *imm_unregister_window)(HWND) DECLSPEC_HIDDEN; +#define WM_IME_INTERNAL 0x287 +#define IME_INTERNAL_ACTIVATE 0x17 +#define IME_INTERNAL_DEACTIVATE 0x18 struct user_key_state_info {