Aric Stewart : imm32/tests: Test various Imm call cross-thread.
Alexandre Julliard
julliard at winehq.org
Wed Sep 8 13:32:10 CDT 2010
Module: wine
Branch: master
Commit: 8d12fc61d5321350ad63b173bdfb50feef1f4b56
URL: http://source.winehq.org/git/wine.git/?a=commit;h=8d12fc61d5321350ad63b173bdfb50feef1f4b56
Author: Aric Stewart <aric at 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);
More information about the wine-cvs
mailing list