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