a86b249fbb345783297fc6acfdaeac4e88d012fc
[reactos.git] / rostests / apitests / user32 / SystemParametersInfo.c
1 /*
2 * PROJECT: ReactOS API tests
3 * LICENSE: GPL - See COPYING in the top level directory
4 * PURPOSE: Test for SystemParametersInfo function family
5 * PROGRAMMERS: Giannis Adamopoulos
6 */
7
8 #include <wine/test.h>
9 #include <wingdi.h>
10 #include <winuser.h>
11 #include "helper.h"
12 #include <undocuser.h>
13
14 HWND hWnd1, hWnd2;
15
16 /* FIXME: test for HWND_TOP, etc...*/
17 static int get_iwnd(HWND hWnd)
18 {
19 if(hWnd == hWnd1) return 1;
20 else if(hWnd == hWnd2) return 2;
21 else return 0;
22 }
23
24 LRESULT CALLBACK SysParamsTestProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
25 {
26 int iwnd = get_iwnd(hWnd);
27
28 if(message > WM_USER || !iwnd || IsDWmMsg(message) || IseKeyMsg(message))
29 return DefWindowProc(hWnd, message, wParam, lParam);
30
31 switch(message)
32 {
33 case WM_GETICON :
34 case WM_SETICON:
35 break;
36 case WM_WINDOWPOSCHANGING:
37 case WM_WINDOWPOSCHANGED:
38 {
39 WINDOWPOS* pwp = (WINDOWPOS*)lParam;
40 ok(wParam==0,"expected wParam=0\n");
41 RECOND_MESSAGE(iwnd, message, SENT, get_iwnd(pwp->hwndInsertAfter), pwp->flags);
42 break;
43 }
44 default:
45 RECOND_MESSAGE(iwnd, message, SENT, 0,0);
46 }
47 return DefWindowProc(hWnd, message, wParam, lParam);
48 }
49
50 static void FlushMessages()
51 {
52 MSG msg;
53
54 while (PeekMessage( &msg, 0, 0, 0, PM_REMOVE ))
55 {
56 int iwnd = get_iwnd(msg.hwnd);
57 if(!(msg.message > WM_USER || !iwnd || IsDWmMsg(msg.message) || IseKeyMsg(msg.message)))
58 RECOND_MESSAGE(iwnd, msg.message, POST,0,0);
59 DispatchMessageA( &msg );
60 }
61 }
62
63 MSG_ENTRY NcMetricsChange_chain[]={
64 {2,WM_WINDOWPOSCHANGING, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW},
65 {2,WM_GETMINMAXINFO},
66 {2,WM_NCCALCSIZE},
67 {2,WM_WINDOWPOSCHANGED, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOSIZE},
68 {1,WM_WINDOWPOSCHANGING, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW},
69 {1,WM_GETMINMAXINFO},
70 {1,WM_NCCALCSIZE},
71 {1,WM_WINDOWPOSCHANGED, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOSIZE},
72 {0,0}};
73
74 MSG_ENTRY NcMetricsChange1_chain[]={
75 {2,WM_WINDOWPOSCHANGING, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW},
76 {2,WM_GETMINMAXINFO},
77 {2,WM_NCCALCSIZE},
78 {2,WM_WINDOWPOSCHANGED, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOSIZE},
79 {1,WM_WINDOWPOSCHANGING, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW},
80 {1,WM_GETMINMAXINFO},
81 {1,WM_NCCALCSIZE},
82 {1,WM_WINDOWPOSCHANGED, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW | SWP_NOCLIENTSIZE | SWP_NOCLIENTMOVE | SWP_NOSIZE},
83 {2,WM_SETTINGCHANGE},
84 {1,WM_SETTINGCHANGE},
85 {0,0}};
86
87 MSG_ENTRY CaptionHeight_chain[]={
88 {2,WM_WINDOWPOSCHANGING, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW},
89 {2,WM_GETMINMAXINFO},
90 {2,WM_NCCALCSIZE},
91 {2,WM_WINDOWPOSCHANGED, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW | SWP_NOCLIENTSIZE},
92 {2,WM_MOVE},
93 {1,WM_WINDOWPOSCHANGING, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW},
94 {1,WM_GETMINMAXINFO},
95 {1,WM_NCCALCSIZE},
96 {1,WM_WINDOWPOSCHANGED, SENT, 0, SWP_FRAMECHANGED|SWP_NOACTIVATE|SWP_NOCOPYBITS|SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW | SWP_NOCLIENTSIZE},
97 {1,WM_MOVE},
98 {0,0}};
99
100 static void Test_NonClientMetrics()
101 {
102 NONCLIENTMETRICS NonClientMetrics;
103
104 /* WARNING: this test requires themes and dwm to be disabled */
105
106 SetCursorPos(0,0);
107
108 /* Retrieve th non client metrics */
109 NonClientMetrics.cbSize = sizeof(NONCLIENTMETRICS);
110 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
111 FlushMessages();
112 COMPARE_CACHE(empty_chain);
113
114 /* Set the non client metric without making any change */
115 SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
116 FlushMessages();
117 COMPARE_CACHE(NcMetricsChange_chain);
118
119 /* Set the same metrics again with the SPIF_SENDCHANGE param */
120 SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, SPIF_SENDCHANGE|SPIF_UPDATEINIFILE );
121 FlushMessages();
122 COMPARE_CACHE(NcMetricsChange1_chain);
123
124 /* Slightly change the caption height */
125 NonClientMetrics.iCaptionHeight += 1;
126 SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
127 FlushMessages();
128 COMPARE_CACHE(CaptionHeight_chain);
129
130 /* Restore the original caption height */
131 NonClientMetrics.iCaptionHeight -= 1;
132 SystemParametersInfo(SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &NonClientMetrics, 0);
133 FlushMessages();
134 COMPARE_CACHE(CaptionHeight_chain);
135 }
136
137 static void Test_MouseSpeed()
138 {
139 ULONG ulMouseSpeed, temp;
140 BOOL ret;
141
142 ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &ulMouseSpeed, 0);
143 ok(ret, "SystemParametersInfo failed\n");
144 ok(ulMouseSpeed >= 1 && ulMouseSpeed <=20, "Wrong mouse speed (%d)\n", (int)ulMouseSpeed);
145
146 temp = 1;
147 ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)temp, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
148 ok(ret, "SystemParametersInfo failed\n");
149 ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &temp, 0);
150 ok(ret, "SystemParametersInfo failed\n");
151 ok(temp == 1, "SPI_GETMOUSESPEED did not get value set by SPI_SETMOUSESPEED (%d instead of 1)\n", (int)temp);
152
153 temp = 20;
154 ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)temp, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
155 ok(ret, "SystemParametersInfo failed\n");
156 ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &temp, 0);
157 ok(ret, "SystemParametersInfo failed\n");
158 ok(temp == 20, "SPI_GETMOUSESPEED did not get value set by SPI_SETMOUSESPEED (%d instead of 20)\n", (int)temp);
159
160 temp = 21;
161 ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)temp, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
162 ok(!ret, "expected SystemParametersInfo to fail\n");
163 ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &temp, 0);
164 ok(ret, "SystemParametersInfo failed\n");
165 ok(temp == 20, "SPI_GETMOUSESPEED got unexpected value (%d instead of 20)\n", (int)temp);
166
167 temp = 0;
168 ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)temp, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
169 ok(!ret, "expected SystemParametersInfo to fail\n");
170 ret = SystemParametersInfo(SPI_GETMOUSESPEED, 0, &temp, 0);
171 ok(ret, "SystemParametersInfo failed\n");
172 ok(temp == 20, "SPI_GETMOUSESPEED got unexpected value (%d instead of 20)\n", (int)temp);
173
174 ret = SystemParametersInfo(SPI_SETMOUSESPEED, 0, (PVOID)ulMouseSpeed, SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
175 ok(ret, "SystemParametersInfo failed\n");
176 }
177
178 START_TEST(SystemParametersInfo)
179 {
180 RegisterSimpleClass(SysParamsTestProc, L"sysparamstest");
181 hWnd1 = CreateWindowW(L"sysparamstest", L"sysparamstest", WS_OVERLAPPEDWINDOW,
182 20, 20, 300, 300, NULL, NULL, 0, NULL);
183
184 hWnd2 = CreateWindowW(L"sysparamstest", L"sysparamstest", WS_OVERLAPPEDWINDOW,
185 200, 200, 300, 300, NULL, NULL, 0, NULL);
186
187 Test_NonClientMetrics();
188 Test_MouseSpeed();
189
190 DestroyWindow(hWnd1);
191 DestroyWindow(hWnd2);
192 UnregisterClassW(L"sysparamstest", 0);
193 }