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
12 static BOOL g_bReadyForDisplayChange
= FALSE
;
13 static HANDLE g_hSemDisplayChange
;
15 /* FIXME: test for HWND_TOP, etc...*/
16 static int get_iwnd(HWND hWnd
)
18 if(hWnd
== hWnd1
) return 1;
19 else if(hWnd
== hWnd2
) return 2;
23 LRESULT CALLBACK
SysParamsTestProc(HWND hWnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
25 int iwnd
= get_iwnd(hWnd
);
27 if(message
> WM_USER
|| !iwnd
|| IsDWmMsg(message
) || IseKeyMsg(message
))
28 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
35 case WM_WINDOWPOSCHANGING
:
36 case WM_WINDOWPOSCHANGED
:
38 WINDOWPOS
* pwp
= (WINDOWPOS
*)lParam
;
39 ok(wParam
==0,"expected wParam=0\n");
40 RECORD_MESSAGE(iwnd
, message
, SENT
, get_iwnd(pwp
->hwndInsertAfter
), pwp
->flags
);
43 case WM_DISPLAYCHANGE
:
44 if (g_bReadyForDisplayChange
)
46 g_bReadyForDisplayChange
= FALSE
;
47 ReleaseSemaphore(g_hSemDisplayChange
, 1, 0);
51 RECORD_MESSAGE(iwnd
, message
, SENT
, 0,0);
53 return DefWindowProc(hWnd
, message
, wParam
, lParam
);
56 static void FlushMessages()
60 while (PeekMessage( &msg
, 0, 0, 0, PM_REMOVE
))
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
);
69 MSG_ENTRY NcMetricsChange_chain
[]={
70 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
},
73 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
| SWP_NOCLIENTSIZE
| SWP_NOCLIENTMOVE
| SWP_NOSIZE
},
74 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
},
77 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
| SWP_NOCLIENTSIZE
| SWP_NOCLIENTMOVE
| SWP_NOSIZE
},
80 MSG_ENTRY NcMetricsChange1_chain
[]={
81 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
},
84 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
| SWP_NOCLIENTSIZE
| SWP_NOCLIENTMOVE
| SWP_NOSIZE
},
85 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
},
88 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
| SWP_NOCLIENTSIZE
| SWP_NOCLIENTMOVE
| SWP_NOSIZE
},
93 MSG_ENTRY CaptionHeight_chain
[]={
94 {2,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
},
97 {2,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
| SWP_NOCLIENTSIZE
},
99 {1,WM_WINDOWPOSCHANGING
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
},
100 {1,WM_GETMINMAXINFO
},
102 {1,WM_WINDOWPOSCHANGED
, SENT
, 0, SWP_FRAMECHANGED
|SWP_NOACTIVATE
|SWP_NOCOPYBITS
|SWP_NOMOVE
|SWP_NOZORDER
|SWP_NOREDRAW
| SWP_NOCLIENTSIZE
},
106 static void Test_NonClientMetrics()
108 NONCLIENTMETRICS NonClientMetrics
;
110 /* WARNING: this test requires themes and dwm to be disabled */
114 /* Retrieve th non client metrics */
115 NonClientMetrics
.cbSize
= sizeof(NONCLIENTMETRICS
);
116 SystemParametersInfo(SPI_GETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICS
), &NonClientMetrics
, 0);
118 COMPARE_CACHE(empty_chain
);
120 /* Set the non client metric without making any change */
121 SystemParametersInfo(SPI_SETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICS
), &NonClientMetrics
, 0);
123 COMPARE_CACHE(NcMetricsChange_chain
);
125 /* Set the same metrics again with the SPIF_SENDCHANGE param */
126 SystemParametersInfo(SPI_SETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICS
), &NonClientMetrics
, SPIF_SENDCHANGE
|SPIF_UPDATEINIFILE
);
128 COMPARE_CACHE(NcMetricsChange1_chain
);
130 /* Slightly change the caption height */
131 NonClientMetrics
.iCaptionHeight
+= 1;
132 SystemParametersInfo(SPI_SETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICS
), &NonClientMetrics
, 0);
134 COMPARE_CACHE(CaptionHeight_chain
);
136 /* Restore the original caption height */
137 NonClientMetrics
.iCaptionHeight
-= 1;
138 SystemParametersInfo(SPI_SETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICS
), &NonClientMetrics
, 0);
140 COMPARE_CACHE(CaptionHeight_chain
);
143 static void Test_MouseSpeed()
145 ULONG ulMouseSpeed
, temp
;
148 ret
= SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &ulMouseSpeed
, 0);
149 ok(ret
, "SystemParametersInfo failed\n");
150 ok(ulMouseSpeed
>= 1 && ulMouseSpeed
<=20, "Wrong mouse speed (%d)\n", (int)ulMouseSpeed
);
153 ret
= SystemParametersInfo(SPI_SETMOUSESPEED
, 0, UlongToPtr(temp
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
154 ok(ret
, "SystemParametersInfo failed\n");
155 ret
= SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &temp
, 0);
156 ok(ret
, "SystemParametersInfo failed\n");
157 ok(temp
== 1, "SPI_GETMOUSESPEED did not get value set by SPI_SETMOUSESPEED (%d instead of 1)\n", (int)temp
);
160 ret
= SystemParametersInfo(SPI_SETMOUSESPEED
, 0, UlongToPtr(temp
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
161 ok(ret
, "SystemParametersInfo failed\n");
162 ret
= SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &temp
, 0);
163 ok(ret
, "SystemParametersInfo failed\n");
164 ok(temp
== 20, "SPI_GETMOUSESPEED did not get value set by SPI_SETMOUSESPEED (%d instead of 20)\n", (int)temp
);
167 ret
= SystemParametersInfo(SPI_SETMOUSESPEED
, 0, UlongToPtr(temp
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
168 ok(!ret
, "expected SystemParametersInfo to fail\n");
169 ret
= SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &temp
, 0);
170 ok(ret
, "SystemParametersInfo failed\n");
171 ok(temp
== 20, "SPI_GETMOUSESPEED got unexpected value (%d instead of 20)\n", (int)temp
);
174 ret
= SystemParametersInfo(SPI_SETMOUSESPEED
, 0, UlongToPtr(temp
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
175 ok(!ret
, "expected SystemParametersInfo to fail\n");
176 ret
= SystemParametersInfo(SPI_GETMOUSESPEED
, 0, &temp
, 0);
177 ok(ret
, "SystemParametersInfo failed\n");
178 ok(temp
== 20, "SPI_GETMOUSESPEED got unexpected value (%d instead of 20)\n", (int)temp
);
180 ret
= SystemParametersInfo(SPI_SETMOUSESPEED
, 0, UlongToPtr(ulMouseSpeed
), SPIF_SENDCHANGE
| SPIF_UPDATEINIFILE
);
181 ok(ret
, "SystemParametersInfo failed\n");
184 static void Test_GradientCaptions(void)
189 BOOL bGradientCaptions
, bModeFound
;
190 DEVMODEW OldDevMode
, NewDevMode
;
193 ret
= SystemParametersInfo(SPI_GETGRADIENTCAPTIONS
, 0, &bGradientCaptions
, 0);
194 ok(ret
, "SystemParametersInfo failed\n");
195 if (bGradientCaptions
== FALSE
)
197 skip("GRADIENTCAPTIONS value has changed from its original state\n");
201 /* Try to find a graphics mode with 16 or 256 colors */
204 while (EnumDisplaySettingsW(NULL
, iMode
, &NewDevMode
))
206 if ((NewDevMode
.dmBitsPerPel
== 4) ||
207 (NewDevMode
.dmBitsPerPel
== 8))
217 skip("4bpp/8bpp graphics mode is not supported\n");
221 /* Save the current graphics mode */
222 ret
= EnumDisplaySettingsW(NULL
, ENUM_CURRENT_SETTINGS
, &OldDevMode
);
223 ok(ret
, "EnumDisplaySettingsW failed\n");
225 g_hSemDisplayChange
= CreateSemaphoreW(NULL
, 0, 1, NULL
);
227 /* Switch to the new graphics mode */
228 g_bReadyForDisplayChange
= TRUE
;
229 lResult
= ChangeDisplaySettingsExW(NULL
, &NewDevMode
, NULL
, 0, NULL
);
230 if (lResult
== DISP_CHANGE_SUCCESSFUL
)
232 dwResult
= WaitForSingleObject(g_hSemDisplayChange
, 10000);
233 ok(dwResult
== WAIT_OBJECT_0
, "Waiting for the WM_DISPLAYCHANGE message timed out\n");
235 g_bReadyForDisplayChange
= FALSE
;
236 ok(lResult
== DISP_CHANGE_SUCCESSFUL
, "ChangeDisplaySettingsExW returned %ld\n", lResult
);
238 /* SPI_GETGRADIENTCAPTIONS will now always return FALSE */
239 ret
= SystemParametersInfo(SPI_GETGRADIENTCAPTIONS
, 0, &bGradientCaptions
, 0);
240 ok(ret
, "SystemParametersInfo failed\n");
241 ok(bGradientCaptions
== FALSE
, "SPI_GETGRADIENTCAPTIONS got unexpected value (%d instead of 0)\n", bGradientCaptions
);
243 /* Enable gradient captions */
244 bGradientCaptions
= TRUE
;
245 SystemParametersInfo(SPI_SETGRADIENTCAPTIONS
, 0, UlongToPtr(bGradientCaptions
), 0);
248 ret
= SystemParametersInfo(SPI_GETGRADIENTCAPTIONS
, 0, &bGradientCaptions
, 0);
249 ok(ret
, "SystemParametersInfo failed\n");
250 ok(bGradientCaptions
== FALSE
, "SPI_GETGRADIENTCAPTIONS got unexpected value (%d instead of 0)\n", bGradientCaptions
);
252 /* Restore the previous graphics mode */
253 g_bReadyForDisplayChange
= TRUE
;
254 lResult
= ChangeDisplaySettingsExW(NULL
, &OldDevMode
, NULL
, 0, NULL
);
255 if (lResult
== DISP_CHANGE_SUCCESSFUL
)
257 dwResult
= WaitForSingleObject(g_hSemDisplayChange
, 10000);
258 ok(dwResult
== WAIT_OBJECT_0
, "Waiting for the WM_DISPLAYCHANGE message timed out\n");
260 g_bReadyForDisplayChange
= FALSE
;
261 ok(lResult
== DISP_CHANGE_SUCCESSFUL
, "ChangeDisplaySettingsExW returned %ld\n", lResult
);
263 /* The original value should be restored */
264 ret
= SystemParametersInfo(SPI_GETGRADIENTCAPTIONS
, 0, &bGradientCaptions
, 0);
265 ok(ret
, "SystemParametersInfo failed\n");
266 ok(bGradientCaptions
== TRUE
, "SPI_GETGRADIENTCAPTIONS got unexpected value (%d instead of 1)\n", bGradientCaptions
);
268 CloseHandle(g_hSemDisplayChange
);
271 START_TEST(SystemParametersInfo
)
273 RegisterSimpleClass(SysParamsTestProc
, L
"sysparamstest");
274 hWnd1
= CreateWindowW(L
"sysparamstest", L
"sysparamstest", WS_OVERLAPPEDWINDOW
,
275 20, 20, 300, 300, NULL
, NULL
, 0, NULL
);
277 hWnd2
= CreateWindowW(L
"sysparamstest", L
"sysparamstest", WS_OVERLAPPEDWINDOW
,
278 200, 200, 300, 300, NULL
, NULL
, 0, NULL
);
280 Test_NonClientMetrics();
282 Test_GradientCaptions();
284 DestroyWindow(hWnd1
);
285 DestroyWindow(hWnd2
);
286 UnregisterClassW(L
"sysparamstest", 0);