1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for SetActiveWindow
5  * PROGRAMMERS:     Giannis Adamopoulos
6  */
7 
8 #include "precomp.h"
9 
10 HWND hWnd1, hWnd2;
11 
12 /* FIXME: test for HWND_TOP, etc...*/
13 static int get_iwnd(HWND hWnd)
14 {
15     if(hWnd == hWnd1) return 1;
16     else if(hWnd == hWnd2) return 2;
17     else return 0;
18 }
19 
20 LRESULT CALLBACK OwnerTestProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
21 {
22     int iwnd = get_iwnd(hWnd);
23 
24     if(message > WM_USER || !iwnd || IsDWmMsg(message) || IseKeyMsg(message))
25         return DefWindowProc(hWnd, message, wParam, lParam);
26 
27     switch(message)
28     {
29     case WM_QUERYNEWPALETTE:
30         {
31             HDC hdc = GetDC(0);
32             int bits = GetDeviceCaps(hdc,BITSPIXEL);
33             ok( bits == 8 , "expected WM_QUERYNEWPALETTE only on 8bpp\n");
34             ReleaseDC(0, hdc);
35             return FALSE;
36         }
37     case WM_IME_SETCONTEXT:
38     case WM_IME_NOTIFY :
39     case WM_GETICON :
40     case WM_GETTEXT:
41         break;
42     case WM_WINDOWPOSCHANGING:
43     case WM_WINDOWPOSCHANGED:
44         {
45             WINDOWPOS* pwp = (WINDOWPOS*)lParam;
46             ok(wParam==0,"expected wParam=0\n");
47             RECORD_MESSAGE(iwnd, message, SENT, get_iwnd(pwp->hwndInsertAfter), pwp->flags);
48             break;
49         }
50     default:
51         RECORD_MESSAGE(iwnd, message, SENT, 0,0);
52     }
53     return DefWindowProc(hWnd, message, wParam, lParam);
54 }
55 
56 static void FlushMessages()
57 {
58     MSG msg;
59 
60     while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
61     {
62         int iwnd = get_iwnd(msg.hwnd);
63         if(!(msg.message > WM_USER || !iwnd || IsDWmMsg(msg.message) || IseKeyMsg(msg.message)))
64             RECORD_MESSAGE(iwnd, msg.message, POST,0,0);
65         DispatchMessageA( &msg );
66     }
67 }
68 
69 static void create_test_windows()
70 {
71     RegisterSimpleClass(OwnerTestProc, L"ownertest");
72     hWnd1 = CreateWindowW(L"ownertest", L"ownertest", WS_OVERLAPPEDWINDOW,
73                         20, 20, 300, 300, NULL, NULL, 0, NULL);
74 
75     hWnd2 = CreateWindowW(L"ownertest", L"ownertest", WS_OVERLAPPEDWINDOW,
76                          200, 200, 300, 300, NULL, NULL, 0, NULL);
77 }
78 
79 static void set_default_zorder()
80 {
81     SetWindowPos(hWnd1, 0, 0,0,0,0, SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOSIZE|SWP_SHOWWINDOW);
82     SetWindowPos(hWnd2, 0, 0,0,0,0, SWP_NOMOVE|SWP_NOREPOSITION|SWP_NOSIZE|SWP_SHOWWINDOW);
83 
84     FlushMessages();
85     EMPTY_CACHE();
86 }
87 
88 static void destroy_test_window()
89 {
90     DestroyWindow(hWnd1);
91     DestroyWindow(hWnd2);
92     UnregisterClassW(L"testClass", 0);
93 }
94 
95 MSG_ENTRY activate2to1_chain[]={
96       {2,WM_NCACTIVATE},
97       {2,WM_ACTIVATE},
98       {1,WM_WINDOWPOSCHANGING, SENT,0, SWP_NOSIZE|SWP_NOMOVE},
99       {1,WM_WINDOWPOSCHANGED, SENT,0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTMOVE|SWP_NOCLIENTSIZE},
100       {1,WM_NCACTIVATE},
101       {1,WM_ACTIVATE},
102       {2,WM_KILLFOCUS},
103       {1,WM_SETFOCUS},
104       {0,0}};
105 
106 MSG_ENTRY activate1to2_chain[]={
107       {1,WM_NCACTIVATE},
108       {1,WM_ACTIVATE},
109       {2,WM_WINDOWPOSCHANGING, SENT,0, SWP_NOSIZE|SWP_NOMOVE},
110       {2,WM_WINDOWPOSCHANGED, SENT,0, SWP_NOSIZE|SWP_NOMOVE|SWP_NOCLIENTMOVE|SWP_NOCLIENTSIZE},
111       {2,WM_NCACTIVATE},
112       {2,WM_ACTIVATE},
113       {1,WM_KILLFOCUS},
114       {2,WM_SETFOCUS},
115       {0,0}};
116 
117 void Test_msg_simple()
118 {
119     SetCursorPos(0,0);
120 
121     create_test_windows();
122     set_default_zorder();
123 
124     SetActiveWindow(hWnd1);
125     FlushMessages();
126     COMPARE_CACHE(activate2to1_chain);
127 
128     SetActiveWindow(hWnd2);
129     FlushMessages();
130     COMPARE_CACHE(activate1to2_chain);
131 
132     destroy_test_window();
133 }
134 
135 START_TEST(SetActiveWindow)
136 {
137     Test_msg_simple();
138 }
139