imm32: Destroy default IME windows in ImmDisableIME.
Signed-off-by: Piotr Caban <piotr@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
ea0c992fa5
commit
684d023faa
|
@ -992,18 +992,58 @@ BOOL WINAPI ImmDestroyContext(HIMC hIMC)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static HWND imm_detach_default_window(IMMThreadData *thread_data)
|
||||||
|
{
|
||||||
|
HWND to_destroy;
|
||||||
|
|
||||||
|
imm_couninit_thread(thread_data, TRUE);
|
||||||
|
to_destroy = thread_data->hwndDefault;
|
||||||
|
thread_data->hwndDefault = NULL;
|
||||||
|
thread_data->windowRefs = 0;
|
||||||
|
return to_destroy;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* ImmDisableIME (IMM32.@)
|
* ImmDisableIME (IMM32.@)
|
||||||
*/
|
*/
|
||||||
BOOL WINAPI ImmDisableIME(DWORD idThread)
|
BOOL WINAPI ImmDisableIME(DWORD idThread)
|
||||||
{
|
{
|
||||||
|
IMMThreadData *thread_data;
|
||||||
|
HWND to_destroy;
|
||||||
|
|
||||||
if (idThread == (DWORD)-1)
|
if (idThread == (DWORD)-1)
|
||||||
|
{
|
||||||
disable_ime = TRUE;
|
disable_ime = TRUE;
|
||||||
else {
|
|
||||||
IMMThreadData *thread_data = IMM_GetThreadData(NULL, idThread);
|
while (1)
|
||||||
|
{
|
||||||
|
to_destroy = 0;
|
||||||
|
EnterCriticalSection(&threaddata_cs);
|
||||||
|
LIST_FOR_EACH_ENTRY(thread_data, &ImmThreadDataList, IMMThreadData, entry)
|
||||||
|
{
|
||||||
|
if (thread_data->hwndDefault)
|
||||||
|
{
|
||||||
|
to_destroy = imm_detach_default_window(thread_data);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LeaveCriticalSection(&threaddata_cs);
|
||||||
|
|
||||||
|
if (!to_destroy)
|
||||||
|
break;
|
||||||
|
DestroyWindow(to_destroy);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
thread_data = IMM_GetThreadData(NULL, idThread);
|
||||||
if (!thread_data) return FALSE;
|
if (!thread_data) return FALSE;
|
||||||
thread_data->disableIME = TRUE;
|
thread_data->disableIME = TRUE;
|
||||||
|
to_destroy = imm_detach_default_window(thread_data);
|
||||||
LeaveCriticalSection(&threaddata_cs);
|
LeaveCriticalSection(&threaddata_cs);
|
||||||
|
|
||||||
|
if (to_destroy)
|
||||||
|
DestroyWindow(to_destroy);
|
||||||
}
|
}
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1878,11 +1918,7 @@ void WINAPI __wine_unregister_window(HWND hwnd)
|
||||||
|
|
||||||
/* Destroy default IME window */
|
/* Destroy default IME window */
|
||||||
if (thread_data->windowRefs == 0)
|
if (thread_data->windowRefs == 0)
|
||||||
{
|
to_destroy = imm_detach_default_window(thread_data);
|
||||||
imm_couninit_thread(thread_data, TRUE);
|
|
||||||
to_destroy = thread_data->hwndDefault;
|
|
||||||
thread_data->hwndDefault = NULL;
|
|
||||||
}
|
|
||||||
LeaveCriticalSection(&threaddata_cs);
|
LeaveCriticalSection(&threaddata_cs);
|
||||||
|
|
||||||
if (to_destroy) DestroyWindow( to_destroy );
|
if (to_destroy) DestroyWindow( to_destroy );
|
||||||
|
|
|
@ -2241,6 +2241,57 @@ static void test_com_initialization(void)
|
||||||
test_apttype(-1);
|
test_apttype(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DWORD WINAPI disable_ime_thread(void *arg)
|
||||||
|
{
|
||||||
|
HWND h, def;
|
||||||
|
MSG msg;
|
||||||
|
BOOL r;
|
||||||
|
|
||||||
|
h = CreateWindowA("static", "static", 0, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||||
|
ok(h != NULL, "CreateWindow failed\n");
|
||||||
|
def = ImmGetDefaultIMEWnd(h);
|
||||||
|
ok(def != NULL, "ImmGetDefaultIMEWnd returned NULL\n");
|
||||||
|
|
||||||
|
r = ImmDisableIME(arg ? GetCurrentThreadId() : 0);
|
||||||
|
ok(r, "ImmDisableIME failed\n");
|
||||||
|
|
||||||
|
if (arg)
|
||||||
|
{
|
||||||
|
def = ImmGetDefaultIMEWnd(h);
|
||||||
|
todo_wine ok(def != NULL, "ImmGetDefaultIMEWnd returned NULL\n");
|
||||||
|
while(PeekMessageA(&msg, 0, 0, 0, PM_REMOVE))
|
||||||
|
DispatchMessageA(&msg);
|
||||||
|
}
|
||||||
|
def = ImmGetDefaultIMEWnd(h);
|
||||||
|
ok(!def, "ImmGetDefaultIMEWnd returned %p\n", def);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_ImmDisableIME(void)
|
||||||
|
{
|
||||||
|
HANDLE thread;
|
||||||
|
HWND def;
|
||||||
|
BOOL r;
|
||||||
|
|
||||||
|
def = ImmGetDefaultIMEWnd(hwnd);
|
||||||
|
ok(def != NULL, "ImmGetDefaultIMEWnd(hwnd) returned NULL\n");
|
||||||
|
|
||||||
|
thread = CreateThread(NULL, 0, disable_ime_thread, 0, 0, NULL);
|
||||||
|
ok(thread != NULL, "CreateThread failed\n");
|
||||||
|
WaitForSingleObject(thread, INFINITE);
|
||||||
|
CloseHandle(thread);
|
||||||
|
|
||||||
|
thread = CreateThread(NULL, 0, disable_ime_thread, (void*)1, 0, NULL);
|
||||||
|
ok(thread != NULL, "CreateThread failed\n");
|
||||||
|
WaitForSingleObject(thread, INFINITE);
|
||||||
|
CloseHandle(thread);
|
||||||
|
|
||||||
|
r = ImmDisableIME(-1);
|
||||||
|
ok(r, "ImmDisableIME(-1) failed\n");
|
||||||
|
def = ImmGetDefaultIMEWnd(hwnd);
|
||||||
|
ok(!def, "ImmGetDefaultIMEWnd(hwnd) returned %p\n", def);
|
||||||
|
}
|
||||||
|
|
||||||
START_TEST(imm32) {
|
START_TEST(imm32) {
|
||||||
if (!is_ime_enabled())
|
if (!is_ime_enabled())
|
||||||
{
|
{
|
||||||
|
@ -2276,6 +2327,9 @@ START_TEST(imm32) {
|
||||||
if (pSendInput)
|
if (pSendInput)
|
||||||
test_ime_processkey();
|
test_ime_processkey();
|
||||||
else win_skip("SendInput is not available\n");
|
else win_skip("SendInput is not available\n");
|
||||||
|
|
||||||
|
/* there's no way of enabling IME - keep the test last */
|
||||||
|
test_ImmDisableIME();
|
||||||
}
|
}
|
||||||
cleanup();
|
cleanup();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue