Module: wine Branch: master Commit: 8d12fc61d5321350ad63b173bdfb50feef1f4b56 URL: http://source.winehq.org/git/wine.git/?a=commit;h=8d12fc61d5321350ad63b173bd...
Author: Aric Stewart aric@codeweavers.com Date: Tue Sep 7 12:34:44 2010 -0500
imm32/tests: Test various Imm call cross-thread.
---
dlls/imm32/tests/imm32.c | 91 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 90 insertions(+), 1 deletions(-)
diff --git a/dlls/imm32/tests/imm32.c b/dlls/imm32/tests/imm32.c index 06b12f3..8b8db90 100644 --- a/dlls/imm32/tests/imm32.c +++ b/dlls/imm32/tests/imm32.c @@ -22,6 +22,7 @@
#include "wine/test.h" #include "winuser.h" +#include "wingdi.h" #include "imm.h"
#define NUMELEMS(array) (sizeof((array))/sizeof((array)[0])) @@ -135,6 +136,19 @@ static void msg_spy_cleanup(void) { static const char wndcls[] = "winetest_imm32_wndcls"; static HWND hwnd;
+static LRESULT WINAPI wndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch (msg) + { + case WM_IME_SETCONTEXT: + case WM_NCCREATE: + case WM_CREATE: + return TRUE; + } + + return DefWindowProcA(hwnd,msg,wParam,lParam); +} + static BOOL init(void) { WNDCLASSEX wc; HIMC imc; @@ -145,7 +159,7 @@ static BOOL init(void) {
wc.cbSize = sizeof(WNDCLASSEX); wc.style = 0; - wc.lpfnWndProc = DefWindowProc; + wc.lpfnWndProc = wndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = GetModuleHandle(0); @@ -356,6 +370,8 @@ static DWORD WINAPI ImmGetContextThreadFunc( LPVOID lpParam) { HIMC h1,h2; HWND hwnd2; + COMPOSITIONFORM cf; + POINT pt; igc_threadinfo *info= (igc_threadinfo*)lpParam; info->hwnd = CreateWindowEx(WS_EX_CLIENTEDGE, wndcls, "Wine imm32.dll test", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, @@ -378,6 +394,10 @@ static DWORD WINAPI ImmGetContextThreadFunc( LPVOID lpParam) ImmReleaseContext(info->hwnd,h2); DestroyWindow(hwnd2);
+ /* priming for later tests */ + ImmSetCompositionWindow(h1, &cf); + ImmSetStatusWindowPos(h1, &pt); + SetEvent(info->event); Sleep(INFINITE); return 1; @@ -389,6 +409,11 @@ static void test_ImmThreads(void) igc_threadinfo threadinfo; HANDLE hThread; DWORD dwThreadId; + BOOL rc; + LOGFONT lf; + COMPOSITIONFORM cf; + DWORD status, sentence; + POINT pt;
himc = ImmGetContext(hwnd); threadinfo.event = CreateEvent(NULL, TRUE, FALSE, NULL); @@ -410,6 +435,70 @@ static void test_ImmThreads(void) ImmReleaseContext(hwnd,h1); }
+ + /* OpenStatus */ + rc = ImmSetOpenStatus(himc, TRUE); + ok(rc != 0, "ImmSetOpenStatus failed\n"); + rc = ImmGetOpenStatus(himc); + ok(rc != 0, "ImmGetOpenStatus failed\n"); + rc = ImmSetOpenStatus(himc, FALSE); + ok(rc != 0, "ImmSetOpenStatus failed\n"); + rc = ImmGetOpenStatus(himc); + ok(rc == 0, "ImmGetOpenStatus failed\n"); + + rc = ImmSetOpenStatus(otherHimc, TRUE); + todo_wine ok(rc == 0, "ImmSetOpenStatus should fail\n"); + rc = ImmGetOpenStatus(otherHimc); + todo_wine ok(rc == 0, "ImmGetOpenStatus failed\n"); + rc = ImmSetOpenStatus(otherHimc, FALSE); + todo_wine ok(rc == 0, "ImmSetOpenStatus should fail\n"); + rc = ImmGetOpenStatus(otherHimc); + ok(rc == 0, "ImmGetOpenStatus failed\n"); + + /* CompositionFont */ + rc = ImmGetCompositionFont(himc, &lf); + ok(rc != 0, "ImmGetCompositionFont failed\n"); + rc = ImmSetCompositionFont(himc, &lf); + ok(rc != 0, "ImmSetCompositionFont failed\n"); + + rc = ImmGetCompositionFont(otherHimc, &lf); + ok(rc != 0 || broken(rc == 0), "ImmGetCompositionFont failed\n"); + rc = ImmSetCompositionFont(otherHimc, &lf); + todo_wine ok(rc == 0, "ImmSetCompositionFont should fail\n"); + + /* CompositionWindow */ + rc = ImmSetCompositionWindow(himc, &cf); + ok(rc != 0, "ImmSetCompositionWindow failed\n"); + rc = ImmGetCompositionWindow(himc, &cf); + ok(rc != 0, "ImmGetCompositionWindow failed\n"); + + rc = ImmSetCompositionWindow(otherHimc, &cf); + todo_wine ok(rc == 0, "ImmSetCompositionWindow should fail\n"); + rc = ImmGetCompositionWindow(otherHimc, &cf); + ok(rc != 0 || broken(rc == 0), "ImmGetCompositionWindow failed\n"); + + /* ConversionStatus */ + rc = ImmGetConversionStatus(himc, &status, &sentence); + ok(rc != 0, "ImmGetConversionStatus failed\n"); + rc = ImmSetConversionStatus(himc, status, sentence); + ok(rc != 0, "ImmSetConversionStatus failed\n"); + + rc = ImmGetConversionStatus(otherHimc, &status, &sentence); + ok(rc != 0 || broken(rc == 0), "ImmGetConversionStatus failed\n"); + rc = ImmSetConversionStatus(otherHimc, status, sentence); + todo_wine ok(rc == 0, "ImmSetConversionStatus should fail\n"); + + /* StatusWindowPos */ + rc = ImmSetStatusWindowPos(himc, &pt); + ok(rc != 0, "ImmSetStatusWindowPos failed\n"); + rc = ImmGetStatusWindowPos(himc, &pt); + ok(rc != 0, "ImmGetStatusWindowPos failed\n"); + + rc = ImmSetStatusWindowPos(otherHimc, &pt); + todo_wine ok(rc == 0, "ImmSetStatusWindowPos should fail\n"); + rc = ImmGetStatusWindowPos(otherHimc, &pt); + ok(rc != 0 || broken(rc == 0), "ImmGetStatusWindowPos failed\n"); + ImmReleaseContext(threadinfo.hwnd,otherHimc); ImmReleaseContext(hwnd,himc);