user32: Partially implement GetWindowDpiAwarenessContext().
[wine.git] / dlls / user32 / tests / sysparams.c
blob876f84ffb0fd12630ad6395b9c772ec9034c5cdb
1 /* Unit test suite for functions SystemParametersInfo and GetSystemMetrics.
3 * Copyright 2002 Andriy Palamarchuk
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #define _WIN32_WINNT 0x0600 /* For SPI_GETMOUSEHOVERWIDTH and more */
21 #define _WIN32_IE 0x0700
22 #define WINVER 0x0600 /* For COLOR_MENUBAR, NONCLIENTMETRICS with padding */
24 #include <assert.h>
25 #include <stdlib.h>
26 #include <stdarg.h>
27 #include <stdio.h>
29 #include "wine/test.h"
30 #include "windef.h"
31 #include "winbase.h"
32 #include "wingdi.h"
33 #include "winreg.h"
34 #include "winuser.h"
35 #include "winnls.h"
37 #ifndef SPI_GETDESKWALLPAPER
38 # define SPI_GETDESKWALLPAPER 0x0073
39 #endif
41 static LONG (WINAPI *pChangeDisplaySettingsExA)(LPCSTR, LPDEVMODEA, HWND, DWORD, LPVOID);
42 static BOOL (WINAPI *pIsProcessDPIAware)(void);
43 static BOOL (WINAPI *pSetProcessDPIAware)(void);
44 static BOOL (WINAPI *pSetProcessDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
45 static DPI_AWARENESS_CONTEXT (WINAPI *pGetThreadDpiAwarenessContext)(void);
46 static DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
47 static DPI_AWARENESS_CONTEXT (WINAPI *pGetWindowDpiAwarenessContext)(HWND);
48 static DPI_AWARENESS (WINAPI *pGetAwarenessFromDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
50 static BOOL strict;
51 static int dpi, real_dpi;
52 static BOOL iswin9x;
53 static HDC hdc;
55 #define eq(received, expected, label, type) \
56 ok((received) == (expected), "%s: got " type " instead of " type "\n", (label),(received),(expected))
59 #define SPI_SETBEEP_REGKEY "Control Panel\\Sound"
60 #define SPI_SETBEEP_VALNAME "Beep"
61 #define SPI_SETMOUSE_REGKEY "Control Panel\\Mouse"
62 #define SPI_SETMOUSE_VALNAME1 "MouseThreshold1"
63 #define SPI_SETMOUSE_VALNAME2 "MouseThreshold2"
64 #define SPI_SETMOUSE_VALNAME3 "MouseSpeed"
65 #define SPI_SETBORDER_REGKEY "Control Panel\\Desktop\\WindowMetrics"
66 #define SPI_SETBORDER_REGKEY2 "Control Panel\\Desktop"
67 #define SPI_SETBORDER_VALNAME "BorderWidth"
68 #define SPI_METRIC_REGKEY "Control Panel\\Desktop\\WindowMetrics"
69 #define SPI_SCROLLWIDTH_VALNAME "ScrollWidth"
70 #define SPI_SCROLLHEIGHT_VALNAME "ScrollHeight"
71 #define SPI_CAPTIONWIDTH_VALNAME "CaptionWidth"
72 #define SPI_CAPTIONHEIGHT_VALNAME "CaptionHeight"
73 #define SPI_CAPTIONFONT_VALNAME "CaptionFont"
74 #define SPI_SMCAPTIONWIDTH_VALNAME "SmCaptionWidth"
75 #define SPI_SMCAPTIONHEIGHT_VALNAME "SmCaptionHeight"
76 #define SPI_SMCAPTIONFONT_VALNAME "SmCaptionFont"
77 #define SPI_MENUWIDTH_VALNAME "MenuWidth"
78 #define SPI_MENUHEIGHT_VALNAME "MenuHeight"
79 #define SPI_MENUFONT_VALNAME "MenuFont"
80 #define SPI_STATUSFONT_VALNAME "StatusFont"
81 #define SPI_MESSAGEFONT_VALNAME "MessageFont"
83 #define SPI_SETKEYBOARDSPEED_REGKEY "Control Panel\\Keyboard"
84 #define SPI_SETKEYBOARDSPEED_VALNAME "KeyboardSpeed"
85 #define SPI_ICONHORIZONTALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
86 #define SPI_ICONHORIZONTALSPACING_REGKEY2 "Control Panel\\Desktop"
87 #define SPI_ICONHORIZONTALSPACING_VALNAME "IconSpacing"
88 #define SPI_ICONVERTICALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
89 #define SPI_ICONVERTICALSPACING_REGKEY2 "Control Panel\\Desktop"
90 #define SPI_ICONVERTICALSPACING_VALNAME "IconVerticalSpacing"
91 #define SPI_MINIMIZEDMETRICS_REGKEY "Control Panel\\Desktop\\WindowMetrics"
92 #define SPI_MINWIDTH_VALNAME "MinWidth"
93 #define SPI_MINHORZGAP_VALNAME "MinHorzGap"
94 #define SPI_MINVERTGAP_VALNAME "MinVertGap"
95 #define SPI_MINARRANGE_VALNAME "MinArrange"
96 #define SPI_SETSCREENSAVETIMEOUT_REGKEY "Control Panel\\Desktop"
97 #define SPI_SETSCREENSAVETIMEOUT_VALNAME "ScreenSaveTimeOut"
98 #define SPI_SETSCREENSAVEACTIVE_REGKEY "Control Panel\\Desktop"
99 #define SPI_SETSCREENSAVEACTIVE_VALNAME "ScreenSaveActive"
100 #define SPI_SETGRIDGRANULARITY_REGKEY "Control Panel\\Desktop"
101 #define SPI_SETGRIDGRANULARITY_VALNAME "GridGranularity"
102 #define SPI_SETKEYBOARDDELAY_REGKEY "Control Panel\\Keyboard"
103 #define SPI_SETKEYBOARDDELAY_VALNAME "KeyboardDelay"
104 #define SPI_SETICONTITLEWRAP_REGKEY1 "Control Panel\\Desktop\\WindowMetrics"
105 #define SPI_SETICONTITLEWRAP_REGKEY2 "Control Panel\\Desktop"
106 #define SPI_SETICONTITLEWRAP_VALNAME "IconTitleWrap"
107 #define SPI_SETMENUDROPALIGNMENT_REGKEY1 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"
108 #define SPI_SETMENUDROPALIGNMENT_REGKEY2 "Control Panel\\Desktop"
109 #define SPI_SETMENUDROPALIGNMENT_VALNAME "MenuDropAlignment"
110 #define SPI_SETDOUBLECLKWIDTH_REGKEY1 "Control Panel\\Mouse"
111 #define SPI_SETDOUBLECLKWIDTH_REGKEY2 "Control Panel\\Desktop"
112 #define SPI_SETDOUBLECLKWIDTH_VALNAME "DoubleClickWidth"
113 #define SPI_SETDOUBLECLKHEIGHT_REGKEY1 "Control Panel\\Mouse"
114 #define SPI_SETDOUBLECLKHEIGHT_REGKEY2 "Control Panel\\Desktop"
115 #define SPI_SETDOUBLECLKHEIGHT_VALNAME "DoubleClickHeight"
116 #define SPI_SETDOUBLECLICKTIME_REGKEY "Control Panel\\Mouse"
117 #define SPI_SETDOUBLECLICKTIME_VALNAME "DoubleClickSpeed"
118 #define SPI_SETMOUSEBUTTONSWAP_REGKEY "Control Panel\\Mouse"
119 #define SPI_SETMOUSEBUTTONSWAP_VALNAME "SwapMouseButtons"
120 #define SPI_SETWORKAREA_REGKEY "Control Panel\\Desktop"
121 #define SPI_SETWORKAREA_VALNAME "WINE_WorkArea"
122 #define SPI_SETSHOWSOUNDS_REGKEY "Control Panel\\Accessibility\\ShowSounds"
123 #define SPI_SETSHOWSOUNDS_VALNAME "On"
124 #define SPI_SETKEYBOARDPREF_REGKEY "Control Panel\\Accessibility\\Keyboard Preference"
125 #define SPI_SETKEYBOARDPREF_VALNAME "On"
126 #define SPI_SETKEYBOARDPREF_REGKEY_LEGACY "Control Panel\\Accessibility"
127 #define SPI_SETKEYBOARDPREF_VALNAME_LEGACY "Keyboard Preference"
128 #define SPI_SETSCREENREADER_REGKEY "Control Panel\\Accessibility\\Blind Access"
129 #define SPI_SETSCREENREADER_VALNAME "On"
130 #define SPI_SETSCREENREADER_REGKEY_LEGACY "Control Panel\\Accessibility"
131 #define SPI_SETSCREENREADER_VALNAME_LEGACY "Blind Access"
132 #define SPI_SETFONTSMOOTHING_REGKEY "Control Panel\\Desktop"
133 #define SPI_SETFONTSMOOTHING_VALNAME "FontSmoothing"
134 #define SPI_SETFONTSMOOTHINGTYPE_VALNAME "FontSmoothingType"
135 #define SPI_SETFONTSMOOTHINGCONTRAST_VALNAME "FontSmoothingGamma"
136 #define SPI_SETFONTSMOOTHINGORIENTATION_VALNAME "FontSmoothingOrientation"
137 #define SPI_SETLOWPOWERACTIVE_REGKEY "Control Panel\\Desktop"
138 #define SPI_SETLOWPOWERACTIVE_VALNAME "LowPowerActive"
139 #define SPI_SETPOWEROFFACTIVE_REGKEY "Control Panel\\Desktop"
140 #define SPI_SETPOWEROFFACTIVE_VALNAME "PowerOffActive"
141 #define SPI_SETDRAGFULLWINDOWS_REGKEY "Control Panel\\Desktop"
142 #define SPI_SETDRAGFULLWINDOWS_VALNAME "DragFullWindows"
143 #define SPI_SETSNAPTODEFBUTTON_REGKEY "Control Panel\\Mouse"
144 #define SPI_SETSNAPTODEFBUTTON_VALNAME "SnapToDefaultButton"
145 #define SPI_SETMOUSEHOVERWIDTH_REGKEY "Control Panel\\Mouse"
146 #define SPI_SETMOUSEHOVERWIDTH_VALNAME "MouseHoverWidth"
147 #define SPI_SETMOUSEHOVERHEIGHT_REGKEY "Control Panel\\Mouse"
148 #define SPI_SETMOUSEHOVERHEIGHT_VALNAME "MouseHoverHeight"
149 #define SPI_SETMOUSEHOVERTIME_REGKEY "Control Panel\\Mouse"
150 #define SPI_SETMOUSEHOVERTIME_VALNAME "MouseHoverTime"
151 #define SPI_SETMOUSESCROLLCHARS_REGKEY "Control Panel\\Desktop"
152 #define SPI_SETMOUSESCROLLCHARS_VALNAME "WheelScrollChars"
153 #define SPI_SETMOUSESCROLLLINES_REGKEY "Control Panel\\Desktop"
154 #define SPI_SETMOUSESCROLLLINES_VALNAME "WheelScrollLines"
155 #define SPI_SETMENUSHOWDELAY_REGKEY "Control Panel\\Desktop"
156 #define SPI_SETMENUSHOWDELAY_VALNAME "MenuShowDelay"
157 #define SPI_SETDESKWALLPAPER_REGKEY "Control Panel\\Desktop"
158 #define SPI_SETDESKWALLPAPER_VALNAME "Wallpaper"
160 /* volatile registry branch under CURRENT_USER_REGKEY for temporary values storage */
161 #define WINE_CURRENT_USER_REGKEY "Wine"
163 static HWND ghTestWnd;
165 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam );
166 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
167 LPARAM lParam );
168 static int change_counter;
169 static int change_setworkarea_param, change_iconverticalspacing_param;
170 static int change_last_param;
171 static int last_bpp;
172 static BOOL displaychange_ok = FALSE, displaychange_test_active = FALSE;
173 static HANDLE displaychange_sem = 0;
175 static BOOL get_reg_dword(HKEY base, const char *key_name, const char *value_name, DWORD *value)
177 HKEY key;
178 DWORD type, data, size = sizeof(data);
179 BOOL ret = FALSE;
181 if (RegOpenKeyA(base, key_name, &key) == ERROR_SUCCESS)
183 if (RegQueryValueExA(key, value_name, NULL, &type, (void *)&data, &size) == ERROR_SUCCESS &&
184 type == REG_DWORD)
186 *value = data;
187 ret = TRUE;
189 RegCloseKey(key);
191 return ret;
194 static DWORD get_real_dpi(void)
196 DWORD dpi;
198 if (get_reg_dword(HKEY_CURRENT_USER, "Control Panel\\Desktop", "LogPixels", &dpi))
199 return dpi;
200 if (get_reg_dword(HKEY_CURRENT_CONFIG, "Software\\Fonts", "LogPixels", &dpi))
201 return dpi;
202 return USER_DEFAULT_SCREEN_DPI;
205 static LRESULT CALLBACK SysParamsTestWndProc( HWND hWnd, UINT msg, WPARAM wParam,
206 LPARAM lParam )
208 switch (msg) {
210 case WM_DISPLAYCHANGE:
211 ok(displaychange_ok, "Unexpected WM_DISPLAYCHANGE message\n");
212 last_bpp = wParam;
213 displaychange_ok = FALSE;
214 ReleaseSemaphore(displaychange_sem, 1, 0);
215 break;
217 case WM_SETTINGCHANGE:
218 if (change_counter>0) {
219 /* ignore these messages caused by resizing of toolbars */
220 if( wParam == SPI_SETWORKAREA){
221 change_setworkarea_param = 1;
222 break;
223 } else if( wParam == SPI_ICONVERTICALSPACING) {
224 change_iconverticalspacing_param = 1;
225 break;
226 } else if( displaychange_test_active)
227 break;
228 if( !change_last_param){
229 change_last_param = wParam;
230 break;
232 ok(0,"too many changes counter=%d last change=%d\n",
233 change_counter,change_last_param);
234 change_counter++;
235 change_last_param = wParam;
236 break;
238 change_counter++;
239 change_last_param = change_setworkarea_param = change_iconverticalspacing_param =0;
240 if( wParam == SPI_SETWORKAREA)
241 change_setworkarea_param = 1;
242 else if( wParam == SPI_ICONVERTICALSPACING)
243 change_iconverticalspacing_param = 1;
244 else
245 change_last_param = wParam;
246 break;
248 case WM_DESTROY:
249 PostQuitMessage( 0 );
250 break;
252 /* drop through */
253 default:
254 return( DefWindowProcA( hWnd, msg, wParam, lParam ) );
257 return 0;
261 Performs testing for system parameters messages
262 params:
263 - system parameter id
264 - supposed value of the registry key
266 static void test_change_message( int action, int optional )
268 if (change_counter==0 && optional==1)
269 return;
270 ok( 1 == change_counter,
271 "Missed a message: change_counter=%d\n", change_counter );
272 change_counter = 0;
273 ok( action == change_last_param ||
274 ( change_setworkarea_param && action == SPI_SETWORKAREA) ||
275 ( change_iconverticalspacing_param && action == SPI_ICONVERTICALSPACING),
276 "Wrong action got %d expected %d\n", change_last_param, action );
277 change_last_param = 0;
280 static BOOL test_error_msg ( int rc, const char *name )
282 DWORD last_error = GetLastError();
284 if (rc==0)
286 if (last_error==0xdeadbeef || last_error==ERROR_INVALID_SPI_VALUE || last_error==ERROR_INVALID_PARAMETER)
288 skip("%s not supported on this platform\n", name);
290 else if (last_error==ERROR_ACCESS_DENIED)
292 skip("%s does not have privileges to run\n", name);
294 else
296 trace("%s failed for reason: %d. Indicating test failure and skipping remainder of test\n",name,last_error);
297 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
299 return FALSE;
301 else
303 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc,last_error);
304 return TRUE;
309 * Tests the HKEY_CURRENT_USER subkey value.
310 * The value should contain string value.
312 static void _test_reg_key( LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName1, LPCSTR valName2,
313 const void *exp_value, DWORD exp_type, BOOL optional )
315 CHAR value[MAX_PATH];
316 DWORD valueLen;
317 DWORD type;
318 HKEY hKey;
319 LONG rc;
320 int found=0;
322 *value='\0';
323 valueLen=sizeof(value);
324 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
325 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
326 RegCloseKey( hKey );
327 if (rc==ERROR_SUCCESS)
329 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
330 switch (exp_type)
332 case REG_DWORD:
333 ok( *(DWORD *)value == *(DWORD *)exp_value,
334 "Wrong value in registry: %s %s %08x/%08x\n",
335 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
336 break;
337 case REG_SZ:
338 ok( !strcmp( exp_value, value ),
339 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
340 subKey1, valName1, value, (const char *)exp_value );
341 break;
343 found++;
345 else if (strict)
347 ok(0,"Missing registry entry: subKey=%s, valName=%s\n",
348 subKey1, valName1);
350 if (valName2)
352 *value='\0';
353 valueLen=sizeof(value);
354 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
355 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
356 RegCloseKey( hKey );
357 if (rc==ERROR_SUCCESS)
359 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
360 switch (exp_type)
362 case REG_DWORD:
363 ok( *(DWORD *)value == *(DWORD *)exp_value,
364 "Wrong value in registry: %s %s %08x/%08x\n",
365 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
366 break;
367 case REG_SZ:
368 ok( !strcmp( exp_value, value ),
369 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
370 subKey1, valName1, value, (const char *)exp_value );
371 break;
373 found++;
375 else if (strict)
377 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
378 subKey1, valName2 );
381 if (subKey2 && !strict)
383 *value='\0';
384 valueLen=sizeof(value);
385 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
386 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
387 RegCloseKey( hKey );
388 if (rc==ERROR_SUCCESS)
390 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
391 switch (exp_type)
393 case REG_DWORD:
394 ok( *(DWORD *)value == *(DWORD *)exp_value,
395 "Wrong value in registry: %s %s %08x/%08x\n",
396 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
397 break;
398 case REG_SZ:
399 ok( !strcmp( exp_value, value ),
400 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
401 subKey1, valName1, value, (const char *)exp_value );
402 break;
404 found++;
406 else if (strict)
408 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
409 subKey2, valName1 );
411 if (valName2)
413 *value='\0';
414 valueLen=sizeof(value);
415 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
416 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
417 RegCloseKey( hKey );
418 if (rc==ERROR_SUCCESS)
420 ok( type == exp_type, "wrong type %u/%u\n", type, exp_type );
421 switch (exp_type)
423 case REG_DWORD:
424 ok( *(DWORD *)value == *(DWORD *)exp_value,
425 "Wrong value in registry: %s %s %08x/%08x\n",
426 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
427 break;
428 case REG_SZ:
429 ok( !strcmp( exp_value, value ),
430 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
431 subKey1, valName1, value, (const char *)exp_value );
432 break;
434 found++;
436 else if (strict)
438 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
439 subKey2, valName2 );
443 ok(found || optional,
444 "Missing registry values: %s or %s in keys: %s or %s\n",
445 valName1, (valName2?valName2:"<n/a>"), subKey1, (subKey2?subKey2:"<n/a>") );
448 #define test_reg_key( subKey, valName, testValue ) \
449 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, FALSE )
450 #define test_reg_key_optional( subKey, valName, testValue ) \
451 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, TRUE )
452 #define test_reg_key_ex( subKey1, subKey2, valName, testValue ) \
453 _test_reg_key( subKey1, subKey2, valName, NULL, testValue, REG_SZ, FALSE )
454 #define test_reg_key_ex2( subKey1, subKey2, valName1, valName2, testValue ) \
455 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, FALSE )
456 #define test_reg_key_ex2_optional( subKey1, subKey2, valName1, valName2, testValue ) \
457 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, TRUE )
458 #define test_reg_key_dword( subKey, valName, testValue ) \
459 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_DWORD, FALSE )
461 /* get a metric from the registry. If the value is negative
462 * it is assumed to be in twips and converted to pixels */
463 static UINT metricfromreg( const char *keyname, const char *valname, int dpi)
465 HKEY hkey;
466 char buf[64];
467 DWORD ret;
468 DWORD size, type;
469 int value;
471 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
472 size = sizeof(buf);
473 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)buf, &size );
474 RegCloseKey( hkey );
475 if( ret != ERROR_SUCCESS) return -1;
476 value = atoi( buf);
477 if( value < 0)
478 value = ( -value * dpi + 720) / 1440;
479 return value;
482 typedef struct
484 INT16 lfHeight;
485 INT16 lfWidth;
486 INT16 lfEscapement;
487 INT16 lfOrientation;
488 INT16 lfWeight;
489 BYTE lfItalic;
490 BYTE lfUnderline;
491 BYTE lfStrikeOut;
492 BYTE lfCharSet;
493 BYTE lfOutPrecision;
494 BYTE lfClipPrecision;
495 BYTE lfQuality;
496 BYTE lfPitchAndFamily;
497 CHAR lfFaceName[LF_FACESIZE];
498 } LOGFONT16, *LPLOGFONT16;
500 /* get logfont from the registry */
501 static int lffromreg( const char *keyname, const char *valname, LOGFONTA *plf)
503 HKEY hkey;
504 LOGFONTW lfw;
505 DWORD ret, size, type;
507 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
508 size = sizeof( lfw);
509 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)&lfw, &size );
510 RegCloseKey( hkey );
511 ok( ret == ERROR_SUCCESS, "Key \"%s\" value \"%s\" not found\n", keyname, valname);
512 if( ret != ERROR_SUCCESS)
513 return FALSE;
514 if( size <= sizeof( LOGFONT16)) {
515 LOGFONT16 *plf16 = (LOGFONT16*) &lfw;
516 plf->lfHeight = plf16->lfHeight;
517 plf->lfWidth = plf16->lfWidth;
518 plf->lfEscapement = plf16->lfEscapement;
519 plf->lfOrientation = plf16->lfOrientation;
520 plf->lfWeight = plf16->lfWeight;
521 plf->lfItalic = plf16->lfItalic;
522 plf->lfUnderline = plf16->lfUnderline;
523 plf->lfStrikeOut = plf16->lfStrikeOut;
524 plf->lfCharSet = plf16->lfCharSet;
525 plf->lfOutPrecision = plf16->lfOutPrecision;
526 plf->lfClipPrecision = plf16->lfClipPrecision;
527 plf->lfQuality = plf16->lfQuality;
528 plf->lfPitchAndFamily = plf16->lfPitchAndFamily;
529 memcpy( plf->lfFaceName, plf16->lfFaceName, LF_FACESIZE );
530 } else if( size <= sizeof( LOGFONTA)) {
531 plf = (LOGFONTA*) &lfw;
532 } else {
533 plf->lfHeight = lfw.lfHeight;
534 plf->lfWidth = lfw.lfWidth;
535 plf->lfEscapement = lfw.lfEscapement;
536 plf->lfOrientation = lfw.lfOrientation;
537 plf->lfWeight = lfw.lfWeight;
538 plf->lfItalic = lfw.lfItalic;
539 plf->lfUnderline = lfw.lfUnderline;
540 plf->lfStrikeOut = lfw.lfStrikeOut;
541 plf->lfCharSet = lfw.lfCharSet;
542 plf->lfOutPrecision = lfw.lfOutPrecision;
543 plf->lfClipPrecision = lfw.lfClipPrecision;
544 plf->lfQuality = lfw.lfQuality;
545 plf->lfPitchAndFamily = lfw.lfPitchAndFamily;
546 WideCharToMultiByte( CP_ACP, 0, lfw.lfFaceName, -1, plf->lfFaceName,
547 LF_FACESIZE, NULL, NULL);
550 return TRUE;
553 static void test_SPI_SETBEEP( void ) /* 2 */
555 BOOL rc;
556 BOOL old_b;
557 BOOL b;
558 BOOL curr_val;
560 trace("testing SPI_{GET,SET}BEEP\n");
561 SetLastError(0xdeadbeef);
562 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &old_b, 0 );
563 if (!test_error_msg(rc,"SPI_{GET,SET}BEEP"))
564 return;
566 curr_val = TRUE;
567 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
568 if (!test_error_msg(rc,"SPI_SETBEEP")) return;
569 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
570 test_change_message( SPI_SETBEEP, 0 );
571 test_reg_key( SPI_SETBEEP_REGKEY,
572 SPI_SETBEEP_VALNAME,
573 curr_val ? "Yes" : "No" );
574 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
575 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
576 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
577 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
578 if (rc || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
580 ok(rc, "SystemParametersInfoW: rc=%d err=%d\n", rc, GetLastError());
581 eq( b, curr_val, "SystemParametersInfoW", "%d" );
584 /* is a message sent for the second change? */
585 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
586 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
587 test_change_message( SPI_SETBEEP, 0 );
589 curr_val = FALSE;
590 rc=SystemParametersInfoW( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
591 if (rc == FALSE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
592 rc=SystemParametersInfoA( SPI_SETBEEP, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
593 ok(rc, "SystemParametersInfo: rc=%d err=%d\n", rc, GetLastError());
594 test_change_message( SPI_SETBEEP, 0 );
595 test_reg_key( SPI_SETBEEP_REGKEY,
596 SPI_SETBEEP_VALNAME,
597 curr_val ? "Yes" : "No" );
598 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
599 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
600 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
601 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
602 if (rc || GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
604 ok(rc, "SystemParametersInfoW: rc=%d err=%d\n", rc, GetLastError());
605 eq( b, curr_val, "SystemParametersInfoW", "%d" );
607 ok( MessageBeep( MB_OK ), "Return value of MessageBeep when sound is disabled\n" );
609 rc=SystemParametersInfoA( SPI_SETBEEP, old_b, 0, SPIF_UPDATEINIFILE );
610 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
613 static const char *setmouse_valuenames[3] = {
614 SPI_SETMOUSE_VALNAME1,
615 SPI_SETMOUSE_VALNAME2,
616 SPI_SETMOUSE_VALNAME3
620 * Runs check for one setting of spi_setmouse.
622 static BOOL run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *proj_change, int nchange )
624 BOOL rc;
625 INT mi[3];
626 static int aw_turn = 0;
627 static BOOL w_implemented = TRUE;
629 char buf[20];
630 int i;
632 aw_turn++;
633 rc = FALSE;
634 if ((aw_turn % 2!=0) && (w_implemented))
636 /* call unicode on odd (non even) calls */
637 SetLastError(0xdeadbeef);
638 rc=SystemParametersInfoW( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
639 if (rc == FALSE && GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
641 w_implemented = FALSE;
642 trace("SystemParametersInfoW not supported on this platform\n");
646 if ((aw_turn % 2==0) || (!w_implemented))
648 /* call ascii version on even calls or if unicode is not available */
649 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, curr_val, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
651 if (!test_error_msg(rc,"SPI_SETMOUSE")) return FALSE;
653 ok(rc, "SystemParametersInfo: rc=%d err=%d\n", rc, GetLastError());
654 test_change_message( SPI_SETMOUSE, 0 );
655 for (i = 0; i < 3; i++)
657 sprintf( buf, "%d", curr_val[i] );
658 test_reg_key( SPI_SETMOUSE_REGKEY, setmouse_valuenames[i], buf );
661 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, mi, 0 );
662 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
663 for (i = 0; i < 3; i++)
665 ok(mi[i] == curr_val[i],
666 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
669 if (w_implemented)
671 rc=SystemParametersInfoW( SPI_GETMOUSE, 0, mi, 0 );
672 ok(rc, "SystemParametersInfoW: rc=%d err=%d\n", rc, GetLastError());
673 for (i = 0; i < 3; i++)
675 ok(mi[i] == curr_val[i],
676 "incorrect value for %d: %d != %d\n", i, mi[i], curr_val[i]);
680 if (0)
682 /* FIXME: this always fails for me - AJ */
683 for (i = 0; i < nchange; i++)
685 POINT mv;
686 mouse_event( MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_MOVE, 0, 0, 0, 0 );
687 mouse_event( MOUSEEVENTF_MOVE, req_change[i].x, req_change[i].y, 0, 0 );
688 GetCursorPos( &mv );
689 ok( proj_change[i].x == mv.x, "Projected dx and real dx comparison. May fail under high load.\n" );
690 ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load.\n" );
693 return TRUE;
696 static void test_SPI_SETMOUSE( void ) /* 4 */
698 BOOL rc;
699 INT old_mi[3];
701 /* win nt default values - 6, 10, 1 */
702 INT curr_val[3] = {6, 10, 1};
704 /* requested and projected mouse movements */
705 POINT req_change[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
706 POINT proj_change1[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
707 POINT proj_change2[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {44, 20}, {400, 400} };
708 POINT proj_change3[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
709 POINT proj_change4[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
710 POINT proj_change5[] = { {6, 6}, { 7, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
711 POINT proj_change6[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
712 POINT proj_change7[] = { {6, 6}, {14, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
713 POINT proj_change8[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
715 int nchange = sizeof( req_change ) / sizeof( POINT );
717 trace("testing SPI_{GET,SET}MOUSE\n");
718 SetLastError(0xdeadbeef);
719 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, old_mi, 0 );
720 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSE"))
721 return;
723 if (!run_spi_setmouse_test( curr_val, req_change, proj_change1, nchange )) return;
725 /* acceleration change */
726 curr_val[2] = 2;
727 run_spi_setmouse_test( curr_val, req_change, proj_change2, nchange );
729 /* acceleration change */
730 curr_val[2] = 3;
731 run_spi_setmouse_test( curr_val, req_change, proj_change3, nchange );
733 /* acceleration change */
734 curr_val[2] = 0;
735 run_spi_setmouse_test( curr_val, req_change, proj_change4, nchange );
737 /* threshold change */
738 curr_val[2] = 1;
739 curr_val[0] = 7;
740 run_spi_setmouse_test( curr_val, req_change, proj_change5, nchange );
742 /* threshold change */
743 curr_val[2] = 2;
744 curr_val[0] = 6;
745 curr_val[1] = 6;
746 run_spi_setmouse_test( curr_val, req_change, proj_change6, nchange );
748 /* threshold change */
749 curr_val[1] = 7;
750 run_spi_setmouse_test( curr_val, req_change, proj_change7, nchange );
752 /* threshold change */
753 curr_val[1] = 5;
754 run_spi_setmouse_test( curr_val, req_change, proj_change8, nchange );
756 rc=SystemParametersInfoA( SPI_SETMOUSE, 0, old_mi, SPIF_UPDATEINIFILE );
757 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
760 static BOOL test_setborder(UINT curr_val, int usesetborder, int dpi)
762 BOOL rc;
763 UINT border, regval;
764 INT frame;
765 NONCLIENTMETRICSA ncm;
767 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
768 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
769 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
770 if( usesetborder) {
771 rc=SystemParametersInfoA( SPI_SETBORDER, curr_val, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
772 if (!test_error_msg(rc,"SPI_SETBORDER")) return FALSE;
773 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
774 test_change_message( SPI_SETBORDER, 1 );
775 } else { /* set non client metrics */
776 ncm.iBorderWidth = curr_val;
777 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncm, SPIF_UPDATEINIFILE|
778 SPIF_SENDCHANGE);
779 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return FALSE;
780 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
781 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
783 if( curr_val) { /* skip if 0, some windows versions return 0 others 1 */
784 regval = metricfromreg( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_VALNAME, dpi);
785 if( regval != curr_val)
786 regval = metricfromreg( SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, dpi);
787 ok( regval==curr_val, "wrong value in registry %d, expected %d\n", regval, curr_val);
789 /* minimum border width is 1 */
790 if (curr_val == 0) curr_val = 1;
791 /* should be the same as the non client metrics */
792 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
793 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
794 eq( (UINT)ncm.iBorderWidth, curr_val, "NonClientMetric.iBorderWidth", "%d");
795 /* and from SPI_GETBORDER */
796 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &border, 0 );
797 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
798 eq( border, curr_val, "SPI_{GET,SET}BORDER", "%d");
799 /* test some SystemMetrics */
800 frame = curr_val + GetSystemMetrics( SM_CXDLGFRAME );
801 eq( frame, GetSystemMetrics( SM_CXFRAME ), "SM_CXFRAME", "%d" );
802 eq( frame, GetSystemMetrics( SM_CYFRAME ), "SM_CYFRAME", "%d" );
803 eq( frame, GetSystemMetrics( SM_CXSIZEFRAME ), "SM_CXSIZEFRAME", "%d" );
804 eq( frame, GetSystemMetrics( SM_CYSIZEFRAME ), "SM_CYSIZEFRAME", "%d" );
805 return TRUE;
808 static void test_SPI_SETBORDER( void ) /* 6 */
810 BOOL rc;
811 UINT old_border;
812 NONCLIENTMETRICSA ncmsave;
813 INT CaptionWidth,
814 PaddedBorderWidth;
816 ncmsave.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
817 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncmsave, 0);
818 if( !rc) {
819 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
820 return;
822 /* CaptionWidth from the registry may have different value of iCaptionWidth
823 * from the non client metrics (observed on WinXP).
824 * Fix this so we can safely restore settings with the nonclientmetrics */
825 CaptionWidth = metricfromreg(
826 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
827 ncmsave.iCaptionWidth = CaptionWidth;
829 /* These tests hang when XFree86 4.0 for Windows is running (tested on
830 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
831 * running.
833 if (FindWindowA( NULL, "Cygwin/XFree86" ))
834 return;
836 trace("testing SPI_{GET,SET}BORDER\n");
838 SetLastError(0xdeadbeef);
839 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &old_border, 0 );
840 if (!test_error_msg(rc,"SPI_{GET,SET}BORDER"))
841 return;
842 /* FIXME: include new PaddedBorderWidth parameter */
843 PaddedBorderWidth = ncmsave.iBorderWidth - old_border;
844 if( PaddedBorderWidth){
845 win_skip( "Cannot reliably restore border width yet (PaddedBorderWidth = %d)\n",
846 PaddedBorderWidth);
847 return;
849 /* This will restore sane values if the test hang previous run. */
850 if ( old_border == 7 || old_border == 20 )
851 old_border = 1;
853 /* The SPI_SETBORDER seems to be buggy on Win9x/ME (looks like you need to
854 * do it twice to make the intended change). So skip parts of the tests on
855 * those platforms */
856 if( !iswin9x) {
857 /* win2k3 fails if you set the same border twice, or if size is 0 */
858 if (!test_setborder(2, 1, dpi)) return;
859 test_setborder(1, 1, dpi);
860 test_setborder(3, 1, dpi);
862 if (!test_setborder(1, 0, dpi)) return;
863 test_setborder(0, 0, dpi);
864 test_setborder(3, 0, dpi);
866 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncmsave,
867 SPIF_UPDATEINIFILE| SPIF_SENDCHANGE);
868 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
869 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
872 static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */
874 BOOL rc;
875 UINT old_speed;
876 const UINT vals[]={0,20,31};
877 unsigned int i;
879 trace("testing SPI_{GET,SET}KEYBOARDSPEED\n");
880 SetLastError(0xdeadbeef);
881 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &old_speed, 0 );
882 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDSPEED"))
883 return;
885 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
887 UINT v;
888 char buf[10];
890 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, vals[i], 0,
891 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
892 if (!test_error_msg(rc,"SPI_SETKEYBOARDSPEED")) return;
893 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
894 test_change_message( SPI_SETKEYBOARDSPEED, 0 );
895 sprintf( buf, "%d", vals[i] );
896 test_reg_key( SPI_SETKEYBOARDSPEED_REGKEY, SPI_SETKEYBOARDSPEED_VALNAME, buf );
898 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &v, 0 );
899 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
900 eq( v, vals[i], "SPI_{GET,SET}KEYBOARDSPEED", "%d" );
903 rc=SystemParametersInfoA( SPI_SETKEYBOARDSPEED, old_speed, 0, SPIF_UPDATEINIFILE );
904 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
907 /* test_SPI_ICONHORIZONTALSPACING helper */
908 static BOOL dotest_spi_iconhorizontalspacing( INT curr_val)
910 BOOL rc;
911 INT spacing, regval, min_val = MulDiv( 32, dpi, USER_DEFAULT_SCREEN_DPI );
912 ICONMETRICSA im;
914 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, curr_val, 0,
915 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
916 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING")) return FALSE;
917 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
918 test_change_message( SPI_ICONHORIZONTALSPACING, 0 );
919 curr_val = max( curr_val, min_val );
920 /* The registry keys depend on the Windows version and the values too
921 * let's test (works on win95,ME,NT4,2k,XP)
923 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY2, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
924 if( regval != curr_val)
925 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
926 ok( curr_val == regval,
927 "wrong value in registry %d, expected %d\n", regval, curr_val);
928 /* compare with what SPI_ICONHORIZONTALSPACING returns */
929 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
930 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
931 eq( spacing, curr_val, "ICONHORIZONTALSPACING", "%d");
932 /* and with a system metrics */
933 eq( GetSystemMetrics( SM_CXICONSPACING ), curr_val, "SM_CXICONSPACING", "%d" );
934 /* and with what SPI_GETICONMETRICS returns */
935 im.cbSize = sizeof(ICONMETRICSA);
936 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
937 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
938 eq( im.iHorzSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
939 return TRUE;
942 static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */
944 BOOL rc;
945 INT old_spacing;
947 trace("testing SPI_ICONHORIZONTALSPACING\n");
948 SetLastError(0xdeadbeef);
949 /* default value: 75 */
950 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &old_spacing, 0 );
951 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING"))
952 return;
953 /* do not increase the value as it would upset the user's icon layout */
954 if (!dotest_spi_iconhorizontalspacing( old_spacing - 1)) return;
955 dotest_spi_iconhorizontalspacing( 10); /* minimum is 32 */
956 /* restore */
957 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, old_spacing, 0, SPIF_UPDATEINIFILE );
958 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
961 static void test_SPI_SETSCREENSAVETIMEOUT( void ) /* 14 */
963 BOOL rc;
964 UINT old_timeout;
965 const UINT vals[]={0,32767};
966 unsigned int i;
968 trace("testing SPI_{GET,SET}SCREENSAVETIMEOUT\n");
969 SetLastError(0xdeadbeef);
970 rc=SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &old_timeout, 0 );
971 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVETIMEOUT"))
972 return;
974 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
976 UINT v;
977 char buf[10];
979 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, vals[i], 0,
980 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
981 if (!test_error_msg(rc,"SPI_SETSCREENSAVETIMEOUT")) return;
982 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
983 test_change_message( SPI_SETSCREENSAVETIMEOUT, 0 );
984 sprintf( buf, "%d", vals[i] );
985 test_reg_key( SPI_SETSCREENSAVETIMEOUT_REGKEY,
986 SPI_SETSCREENSAVETIMEOUT_VALNAME, buf );
988 rc = SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &v, 0 );
989 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
990 eq( v, vals[i], "SPI_{GET,SET}SCREENSAVETIMEOUT", "%d" );
993 rc=SystemParametersInfoA( SPI_SETSCREENSAVETIMEOUT, old_timeout, 0,
994 SPIF_UPDATEINIFILE );
995 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
998 static void test_SPI_SETSCREENSAVEACTIVE( void ) /* 17 */
1000 BOOL rc;
1001 BOOL old_b;
1002 const UINT vals[]={TRUE,FALSE};
1003 unsigned int i;
1005 trace("testing SPI_{GET,SET}SCREENSAVEACTIVE\n");
1006 SetLastError(0xdeadbeef);
1007 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &old_b, 0 );
1008 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVEACTIVE"))
1009 return;
1011 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1013 UINT v;
1015 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, vals[i], 0,
1016 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1017 if (!test_error_msg(rc,"SPI_SETSCREENSAVEACTIVE")) return;
1018 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1019 test_change_message( SPI_SETSCREENSAVEACTIVE, 0 );
1020 test_reg_key( SPI_SETSCREENSAVEACTIVE_REGKEY,
1021 SPI_SETSCREENSAVEACTIVE_VALNAME,
1022 vals[i] ? "1" : "0" );
1024 rc=SystemParametersInfoA( SPI_GETSCREENSAVEACTIVE, 0, &v, 0 );
1025 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1026 ok(v == vals[i] || broken(! v) /* Win 7 */,
1027 "SPI_{GET,SET}SCREENSAVEACTIVE: got %d instead of %d\n", v, vals[i]);
1030 rc=SystemParametersInfoA( SPI_SETSCREENSAVEACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
1031 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1034 static void test_SPI_SETGRIDGRANULARITY( void ) /* 19 */
1036 /* ??? */;
1039 static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */
1041 BOOL rc;
1042 UINT old_delay;
1043 const UINT vals[]={0,3};
1044 unsigned int i;
1046 trace("testing SPI_{GET,SET}KEYBOARDDELAY\n");
1047 SetLastError(0xdeadbeef);
1048 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &old_delay, 0 );
1049 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDDELAY"))
1050 return;
1052 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1054 UINT delay;
1055 char buf[10];
1057 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, vals[i], 0,
1058 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1059 if (!test_error_msg(rc,"SPI_SETKEYBOARDDELAY")) return;
1060 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1061 test_change_message( SPI_SETKEYBOARDDELAY, 0 );
1062 sprintf( buf, "%d", vals[i] );
1063 test_reg_key( SPI_SETKEYBOARDDELAY_REGKEY,
1064 SPI_SETKEYBOARDDELAY_VALNAME, buf );
1066 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &delay, 0 );
1067 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1068 eq( delay, vals[i], "SPI_{GET,SET}KEYBOARDDELAY", "%d" );
1071 rc=SystemParametersInfoA( SPI_SETKEYBOARDDELAY, old_delay, 0, SPIF_UPDATEINIFILE );
1072 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1076 /* test_SPI_ICONVERTICALSPACING helper */
1077 static BOOL dotest_spi_iconverticalspacing( INT curr_val)
1079 BOOL rc;
1080 INT spacing, regval, min_val = MulDiv( 32, dpi, USER_DEFAULT_SCREEN_DPI );
1081 ICONMETRICSA im;
1083 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, curr_val, 0,
1084 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
1085 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING")) return FALSE;
1086 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1087 test_change_message( SPI_ICONVERTICALSPACING, 0 );
1088 curr_val = max( curr_val, min_val );
1089 /* The registry keys depend on the Windows version and the values too
1090 * let's test (works on win95,ME,NT4,2k,XP)
1092 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY2, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1093 if( regval != curr_val)
1094 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1095 ok( curr_val == regval,
1096 "wrong value in registry %d, expected %d\n", regval, curr_val);
1097 /* compare with what SPI_ICONVERTICALSPACING returns */
1098 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1099 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1100 eq( spacing, curr_val, "ICONVERTICALSPACING", "%d" );
1101 /* and with a system metrics */
1102 eq( GetSystemMetrics( SM_CYICONSPACING ), curr_val, "SM_CYICONSPACING", "%d" );
1103 /* and with what SPI_GETICONMETRICS returns */
1104 im.cbSize = sizeof(ICONMETRICSA);
1105 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1106 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1107 eq( im.iVertSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
1108 return TRUE;
1111 static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */
1113 BOOL rc;
1114 INT old_spacing;
1116 trace("testing SPI_ICONVERTICALSPACING\n");
1117 SetLastError(0xdeadbeef);
1118 /* default value: 75 */
1119 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &old_spacing, 0 );
1120 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING"))
1121 return;
1122 /* do not increase the value as it would upset the user's icon layout */
1123 if (!dotest_spi_iconverticalspacing( old_spacing - 1)) return;
1124 /* same tests with a value less than the minimum 32 */
1125 dotest_spi_iconverticalspacing( 10);
1126 /* restore */
1127 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, old_spacing, 0,
1128 SPIF_UPDATEINIFILE );
1129 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1132 static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */
1134 BOOL rc;
1135 BOOL old_b;
1136 const UINT vals[]={TRUE,FALSE};
1137 unsigned int i;
1138 ICONMETRICSA im;
1140 /* These tests hang when XFree86 4.0 for Windows is running (tested on
1141 * WinNT, SP2, Cygwin/XFree 4.1.0. Skip the test when XFree86 is
1142 * running.
1144 if (FindWindowA( NULL, "Cygwin/XFree86" ))
1145 return;
1147 trace("testing SPI_{GET,SET}ICONTITLEWRAP\n");
1148 SetLastError(0xdeadbeef);
1149 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &old_b, 0 );
1150 if (!test_error_msg(rc,"SPI_{GET,SET}ICONTITLEWRAP"))
1151 return;
1153 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1155 UINT v;
1156 UINT regval;
1158 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, vals[i], 0,
1159 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1160 if (!test_error_msg(rc,"SPI_SETICONTITLEWRAP")) return;
1161 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1162 test_change_message( SPI_SETICONTITLEWRAP, 1 );
1163 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2,
1164 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1165 if( regval != vals[i])
1166 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1,
1167 SPI_SETICONTITLEWRAP_VALNAME, dpi);
1168 ok( regval == vals[i] || broken(regval == -1), /* win9x */
1169 "wrong value in registry %d, expected %d\n", regval, vals[i] );
1171 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &v, 0 );
1172 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1173 eq( v, vals[i], "SPI_{GET,SET}ICONTITLEWRAP", "%d" );
1174 /* and test with what SPI_GETICONMETRICS returns */
1175 im.cbSize = sizeof(ICONMETRICSA);
1176 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1177 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1178 eq( im.iTitleWrap, (BOOL)vals[i], "SPI_GETICONMETRICS", "%d" );
1181 rc=SystemParametersInfoA( SPI_SETICONTITLEWRAP, old_b, 0, SPIF_UPDATEINIFILE );
1182 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1185 static void test_SPI_SETMENUDROPALIGNMENT( void ) /* 28 */
1187 BOOL rc;
1188 BOOL old_b;
1189 const UINT vals[]={TRUE,FALSE};
1190 unsigned int i;
1192 trace("testing SPI_{GET,SET}MENUDROPALIGNMENT\n");
1193 SetLastError(0xdeadbeef);
1194 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &old_b, 0 );
1195 if (!test_error_msg(rc,"SPI_{GET,SET}MENUDROPALIGNMENT"))
1196 return;
1198 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1200 UINT v;
1202 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, vals[i], 0,
1203 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1204 if (!test_error_msg(rc,"SPI_SETMENUDROPALIGNMENT")) return;
1205 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1206 test_change_message( SPI_SETMENUDROPALIGNMENT, 0 );
1207 test_reg_key_ex( SPI_SETMENUDROPALIGNMENT_REGKEY1,
1208 SPI_SETMENUDROPALIGNMENT_REGKEY2,
1209 SPI_SETMENUDROPALIGNMENT_VALNAME,
1210 vals[i] ? "1" : "0" );
1212 rc=SystemParametersInfoA( SPI_GETMENUDROPALIGNMENT, 0, &v, 0 );
1213 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1214 eq( v, vals[i], "SPI_{GET,SET}MENUDROPALIGNMENT", "%d" );
1215 eq( GetSystemMetrics( SM_MENUDROPALIGNMENT ), (int)vals[i],
1216 "SM_MENUDROPALIGNMENT", "%d" );
1219 rc=SystemParametersInfoA( SPI_SETMENUDROPALIGNMENT, old_b, 0,
1220 SPIF_UPDATEINIFILE );
1221 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1224 static void test_SPI_SETDOUBLECLKWIDTH( void ) /* 29 */
1226 BOOL rc;
1227 INT old_width;
1228 const UINT vals[]={0,10000};
1229 unsigned int i;
1231 trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
1232 old_width = GetSystemMetrics( SM_CXDOUBLECLK );
1234 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1236 char buf[10];
1238 SetLastError(0xdeadbeef);
1239 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, vals[i], 0,
1240 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1241 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKWIDTH"))
1242 return;
1244 test_change_message( SPI_SETDOUBLECLKWIDTH, 0 );
1245 sprintf( buf, "%d", vals[i] );
1246 test_reg_key_ex( SPI_SETDOUBLECLKWIDTH_REGKEY1,
1247 SPI_SETDOUBLECLKWIDTH_REGKEY2,
1248 SPI_SETDOUBLECLKWIDTH_VALNAME, buf );
1249 eq( GetSystemMetrics( SM_CXDOUBLECLK ), (int)vals[i],
1250 "SM_CXDOUBLECLK", "%d" );
1253 rc=SystemParametersInfoA( SPI_SETDOUBLECLKWIDTH, old_width, 0,
1254 SPIF_UPDATEINIFILE );
1255 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1258 static void test_SPI_SETDOUBLECLKHEIGHT( void ) /* 30 */
1260 BOOL rc;
1261 INT old_height;
1262 const UINT vals[]={0,10000};
1263 unsigned int i;
1265 trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
1266 old_height = GetSystemMetrics( SM_CYDOUBLECLK );
1268 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1270 char buf[10];
1272 SetLastError(0xdeadbeef);
1273 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, vals[i], 0,
1274 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1275 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKHEIGHT"))
1276 return;
1278 test_change_message( SPI_SETDOUBLECLKHEIGHT, 0 );
1279 sprintf( buf, "%d", vals[i] );
1280 test_reg_key_ex( SPI_SETDOUBLECLKHEIGHT_REGKEY1,
1281 SPI_SETDOUBLECLKHEIGHT_REGKEY2,
1282 SPI_SETDOUBLECLKHEIGHT_VALNAME, buf );
1283 eq( GetSystemMetrics( SM_CYDOUBLECLK ), (int)vals[i],
1284 "SM_CYDOUBLECLK", "%d" );
1287 rc=SystemParametersInfoA( SPI_SETDOUBLECLKHEIGHT, old_height, 0,
1288 SPIF_UPDATEINIFILE );
1289 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1292 static void test_SPI_SETDOUBLECLICKTIME( void ) /* 32 */
1294 BOOL rc;
1295 UINT curr_val;
1296 UINT saved_val;
1297 UINT old_time;
1298 char buf[10];
1300 trace("testing SPI_{GET,SET}DOUBLECLICKTIME\n");
1301 old_time = GetDoubleClickTime();
1303 curr_val = 0;
1304 SetLastError(0xdeadbeef);
1305 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1306 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1307 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLICKTIME"))
1308 return;
1310 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1311 sprintf( buf, "%d", curr_val );
1312 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1313 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1314 curr_val = 500; /* used value for 0 */
1315 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1317 curr_val = 1000;
1318 rc=SystemParametersInfoA( SPI_SETDOUBLECLICKTIME, curr_val, 0,
1319 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1320 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1321 test_change_message( SPI_SETDOUBLECLICKTIME, 0 );
1322 sprintf( buf, "%d", curr_val );
1323 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1324 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1325 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1327 saved_val = curr_val;
1329 curr_val = 0;
1330 SetDoubleClickTime( curr_val );
1331 sprintf( buf, "%d", saved_val );
1332 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1333 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1334 curr_val = 500; /* used value for 0 */
1335 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1337 curr_val = 1000;
1338 SetDoubleClickTime( curr_val );
1339 sprintf( buf, "%d", saved_val );
1340 test_reg_key( SPI_SETDOUBLECLICKTIME_REGKEY,
1341 SPI_SETDOUBLECLICKTIME_VALNAME, buf );
1342 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1344 rc=SystemParametersInfoA(SPI_SETDOUBLECLICKTIME, old_time, 0, SPIF_UPDATEINIFILE);
1345 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1348 static void test_SPI_SETMOUSEBUTTONSWAP( void ) /* 33 */
1350 BOOL rc;
1351 BOOL old_b;
1352 const UINT vals[]={TRUE,FALSE};
1353 unsigned int i;
1355 trace("testing SPI_{GET,SET}MOUSEBUTTONSWAP\n");
1356 old_b = GetSystemMetrics( SM_SWAPBUTTON );
1358 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1360 SetLastError(0xdeadbeef);
1361 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, vals[i], 0,
1362 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1363 if (!test_error_msg(rc,"SPI_SETMOUSEBUTTONSWAP")) return;
1365 test_change_message( SPI_SETMOUSEBUTTONSWAP, 0 );
1366 test_reg_key( SPI_SETMOUSEBUTTONSWAP_REGKEY,
1367 SPI_SETMOUSEBUTTONSWAP_VALNAME,
1368 vals[i] ? "1" : "0" );
1369 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i],
1370 "SM_SWAPBUTTON", "%d" );
1371 rc=SwapMouseButton((BOOL)vals[i^1]);
1372 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i^1],
1373 "SwapMouseButton", "%d" );
1374 ok( rc==(BOOL)vals[i], "SwapMouseButton does not return previous state (really %d)\n", rc );
1377 rc=SystemParametersInfoA( SPI_SETMOUSEBUTTONSWAP, old_b, 0,
1378 SPIF_UPDATEINIFILE );
1379 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1382 static void test_SPI_SETFASTTASKSWITCH( void ) /* 36 */
1384 BOOL rc;
1385 BOOL v;
1387 trace("testing SPI_GETFASTTASKSWITCH\n");
1388 SetLastError(0xdeadbeef);
1389 rc=SystemParametersInfoA( SPI_GETFASTTASKSWITCH, 0, &v, 0 );
1390 if (!test_error_msg(rc,"SPI_{GET,SET}FASTTASKSWITCH"))
1391 return;
1393 /* there is not a single Windows platform on which SPI_GETFASTTASKSWITCH
1394 * works. That sure simplifies testing!
1398 static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */
1400 BOOL rc;
1401 BOOL old_b;
1402 const UINT vals[]={TRUE,FALSE};
1403 unsigned int i;
1405 trace("testing SPI_{GET,SET}DRAGFULLWINDOWS\n");
1406 SetLastError(0xdeadbeef);
1407 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &old_b, 0 );
1409 /* SPI_{GET,SET}DRAGFULLWINDOWS is not implemented on Win95 */
1410 if (!test_error_msg(rc,"SPI_{GET,SET}DRAGFULLWINDOWS"))
1411 return;
1413 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1415 UINT v;
1417 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, vals[i], 0,
1418 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1419 if (!test_error_msg(rc,"SPI_SETDRAGFULLWINDOWS")) return;
1420 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1421 test_change_message( SPI_SETDRAGFULLWINDOWS, 0 );
1422 test_reg_key( SPI_SETDRAGFULLWINDOWS_REGKEY,
1423 SPI_SETDRAGFULLWINDOWS_VALNAME,
1424 vals[i] ? "1" : "0" );
1426 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &v, 0 );
1427 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1428 eq( v, vals[i], "SPI_{GET,SET}DRAGFULLWINDOWS", "%d" );
1431 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, old_b, 0, SPIF_UPDATEINIFILE );
1432 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1435 #define test_reg_metric( KEY, VAL, val) \
1436 { INT regval;\
1437 regval = metricfromreg( KEY, VAL, dpi);\
1438 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1441 #define test_reg_metric2( KEY1, KEY2, VAL, val) \
1442 { INT regval;\
1443 regval = metricfromreg( KEY1, VAL, dpi);\
1444 if( regval != val) regval = metricfromreg( KEY2, VAL, dpi);\
1445 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1448 #define test_reg_font( KEY, VAL, LF) \
1449 { LOGFONTA lfreg;\
1450 lffromreg( KEY, VAL, &lfreg);\
1451 ok( (lfreg.lfHeight < 0 ? (LF).lfHeight == MulDiv( lfreg.lfHeight, dpi, real_dpi ) : \
1452 MulDiv( -(LF).lfHeight , 72, dpi) == lfreg.lfHeight )&&\
1453 (LF).lfWidth == lfreg.lfWidth &&\
1454 (LF).lfWeight == lfreg.lfWeight &&\
1455 !strcmp( (LF).lfFaceName, lfreg.lfFaceName)\
1456 , "wrong value \"%s\" in registry %d, %d\n", VAL, (LF).lfHeight, lfreg.lfHeight);\
1459 #define TEST_NONCLIENTMETRICS_REG( ncm) \
1460 /*FIXME: test_reg_metric2( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, (ncm).iBorderWidth);*/\
1461 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLWIDTH_VALNAME, (ncm).iScrollWidth);\
1462 test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLHEIGHT_VALNAME, (ncm).iScrollHeight);\
1463 /*FIXME: test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, (ncm).iCaptionWidth);*/\
1464 test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, (ncm).iCaptionHeight);\
1465 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONWIDTH_VALNAME, (ncm).iSmCaptionWidth);\
1466 test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, (ncm).iSmCaptionHeight);\
1467 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUWIDTH_VALNAME, (ncm).iMenuWidth);\
1468 test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, (ncm).iMenuHeight);\
1469 test_reg_font( SPI_METRIC_REGKEY, SPI_MENUFONT_VALNAME, (ncm).lfMenuFont);\
1470 test_reg_font( SPI_METRIC_REGKEY, SPI_CAPTIONFONT_VALNAME, (ncm).lfCaptionFont);\
1471 test_reg_font( SPI_METRIC_REGKEY, SPI_SMCAPTIONFONT_VALNAME, (ncm).lfSmCaptionFont);\
1472 test_reg_font( SPI_METRIC_REGKEY, SPI_STATUSFONT_VALNAME, (ncm).lfStatusFont);\
1473 test_reg_font( SPI_METRIC_REGKEY, SPI_MESSAGEFONT_VALNAME, (ncm).lfMessageFont);
1475 /* get text metric height value for the specified logfont */
1476 static int get_tmheight( LOGFONTA *plf, int flag)
1478 TEXTMETRICA tm;
1479 HFONT hfont = CreateFontIndirectA( plf);
1480 hfont = SelectObject( hdc, hfont);
1481 GetTextMetricsA( hdc, &tm);
1482 hfont = SelectObject( hdc, hfont);
1483 return tm.tmHeight + (flag ? tm.tmExternalLeading : 0);
1486 static void test_GetSystemMetrics( void);
1487 static UINT smcxsmsize = 999999999;
1489 static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */
1491 BOOL rc;
1492 INT expect;
1493 NONCLIENTMETRICSA Ncmorig;
1494 NONCLIENTMETRICSA Ncmnew;
1495 NONCLIENTMETRICSA Ncmcur;
1496 NONCLIENTMETRICSA Ncmstart;
1498 Ncmorig.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1499 Ncmnew.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1500 Ncmcur.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1501 Ncmstart.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1503 trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n");
1504 change_counter = 0;
1505 SetLastError(0xdeadbeef);
1506 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmorig, FALSE );
1507 if (!test_error_msg(rc,"SPI_{GET,SET}NONCLIENTMETRICS"))
1508 return;
1509 Ncmstart = Ncmorig;
1510 smcxsmsize = Ncmstart.iSmCaptionWidth;
1511 /* SPI_GETNONCLIENTMETRICS returns some "cooked" values. For instance if
1512 the caption font height is higher than the CaptionHeight field,
1513 the latter is adjusted accordingly. To be able to restore these setting
1514 accurately be restore the raw values. */
1515 Ncmorig.iCaptionWidth = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, real_dpi);
1516 Ncmorig.iCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, dpi);
1517 Ncmorig.iSmCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, dpi);
1518 Ncmorig.iMenuHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, dpi);
1519 /* test registry entries */
1520 TEST_NONCLIENTMETRICS_REG( Ncmorig)
1521 Ncmorig.lfCaptionFont.lfHeight = MulDiv( Ncmorig.lfCaptionFont.lfHeight, real_dpi, dpi );
1523 /* make small changes */
1524 Ncmnew = Ncmstart;
1525 Ncmnew.iBorderWidth += 1;
1526 Ncmnew.iScrollWidth += 1;
1527 Ncmnew.iScrollHeight -= 1;
1528 Ncmnew.iCaptionWidth -= 2;
1529 Ncmnew.iCaptionHeight += 2;
1530 Ncmnew.lfCaptionFont.lfHeight +=1;
1531 Ncmnew.lfCaptionFont.lfWidth +=2;
1532 Ncmnew.lfCaptionFont.lfWeight +=1;
1533 Ncmnew.iSmCaptionWidth += 1;
1534 Ncmnew.iSmCaptionHeight += 2;
1535 Ncmnew.lfSmCaptionFont.lfHeight +=3;
1536 Ncmnew.lfSmCaptionFont.lfWidth -=1;
1537 Ncmnew.lfSmCaptionFont.lfWeight +=3;
1538 Ncmnew.iMenuWidth += 1;
1539 Ncmnew.iMenuHeight += 2;
1540 Ncmnew.lfMenuFont.lfHeight +=1;
1541 Ncmnew.lfMenuFont.lfWidth +=1;
1542 Ncmnew.lfMenuFont.lfWeight +=2;
1543 Ncmnew.lfStatusFont.lfHeight -=1;
1544 Ncmnew.lfStatusFont.lfWidth -=1;
1545 Ncmnew.lfStatusFont.lfWeight +=3;
1546 Ncmnew.lfMessageFont.lfHeight -=2;
1547 Ncmnew.lfMessageFont.lfWidth -=1;
1548 Ncmnew.lfMessageFont.lfWeight +=4;
1550 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1551 SPIF_SENDCHANGE);
1552 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return;
1553 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1554 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1555 /* get them back */
1556 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmcur, FALSE );
1557 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1558 /* test registry entries */
1559 TEST_NONCLIENTMETRICS_REG( Ncmcur)
1560 /* test the system metrics with these settings */
1561 test_GetSystemMetrics();
1562 /* now for something invalid: increase the {menu|caption|smcaption} fonts
1563 by a large amount will increase the {menu|caption|smcaption} height*/
1564 Ncmnew = Ncmstart;
1565 Ncmnew.lfMenuFont.lfHeight -= 8;
1566 Ncmnew.lfCaptionFont.lfHeight =-4;
1567 Ncmnew.lfSmCaptionFont.lfHeight -=10;
1568 /* also show that a few values are lo limited */
1569 Ncmnew.iCaptionWidth = 0;
1570 Ncmnew.iCaptionHeight = 0;
1571 Ncmnew.iScrollHeight = 0;
1572 Ncmnew.iScrollWidth = 0;
1574 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1575 SPIF_SENDCHANGE);
1576 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1577 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1578 /* raw values are in registry */
1579 TEST_NONCLIENTMETRICS_REG( Ncmnew)
1580 /* get them back */
1581 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmcur, FALSE );
1582 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1583 /* cooked values are returned */
1584 expect = max( Ncmnew.iMenuHeight, 2 + get_tmheight( &Ncmnew.lfMenuFont, 1));
1585 ok( Ncmcur.iMenuHeight == expect,
1586 "MenuHeight: %d expected %d\n", Ncmcur.iMenuHeight, expect);
1587 expect = max( Ncmnew.iCaptionHeight, 2 + get_tmheight(&Ncmnew.lfCaptionFont, 0));
1588 ok( Ncmcur.iCaptionHeight == expect,
1589 "CaptionHeight: %d expected %d\n", Ncmcur.iCaptionHeight, expect);
1590 expect = max( Ncmnew.iSmCaptionHeight, 2 + get_tmheight( &Ncmnew.lfSmCaptionFont, 0));
1591 ok( Ncmcur.iSmCaptionHeight == expect,
1592 "SmCaptionHeight: %d expected %d\n", Ncmcur.iSmCaptionHeight, expect);
1594 /* iCaptionWidth depends on a version, could be 8, 12 (Vista, Win7), 13 */
1595 ok( (Ncmcur.iCaptionWidth >= 8 && Ncmcur.iCaptionWidth <= 13) ||
1596 Ncmcur.iCaptionWidth == Ncmstart.iCaptionWidth, /* with windows XP theme, the value never changes */
1597 "CaptionWidth: %d expected from [8, 13] or %d\n", Ncmcur.iCaptionWidth, Ncmstart.iCaptionWidth);
1598 ok( Ncmcur.iScrollWidth == 8,
1599 "ScrollWidth: %d expected 8\n", Ncmcur.iScrollWidth);
1600 ok( Ncmcur.iScrollHeight == 8,
1601 "ScrollHeight: %d expected 8\n", Ncmcur.iScrollHeight);
1602 /* test the system metrics with these settings */
1603 test_GetSystemMetrics();
1604 /* restore */
1605 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA),
1606 &Ncmorig, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
1607 test_change_message( SPI_SETNONCLIENTMETRICS, 0 );
1608 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1609 /* test the system metrics with these settings */
1610 test_GetSystemMetrics();
1613 static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */
1615 BOOL rc;
1616 INT regval;
1617 MINIMIZEDMETRICS lpMm_orig;
1618 MINIMIZEDMETRICS lpMm_new;
1619 MINIMIZEDMETRICS lpMm_cur;
1621 lpMm_orig.cbSize = sizeof(MINIMIZEDMETRICS);
1622 lpMm_new.cbSize = sizeof(MINIMIZEDMETRICS);
1623 lpMm_cur.cbSize = sizeof(MINIMIZEDMETRICS);
1625 trace("testing SPI_{GET,SET}MINIMIZEDMETRICS\n");
1626 SetLastError(0xdeadbeef);
1627 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
1628 if (!test_error_msg(rc,"SPI_{GET,SET}MINIMIZEDMETRICS"))
1629 return;
1630 /* Test registry. Note that it is perfectly valid for some fields to
1631 * not be set.
1633 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1634 ok( regval == -1 || regval == lpMm_orig.iWidth, "wrong value in registry %d, expected %d\n",
1635 regval, lpMm_orig.iWidth);
1636 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1637 ok( regval == -1 || regval == lpMm_orig.iHorzGap, "wrong value in registry %d, expected %d\n",
1638 regval, lpMm_orig.iHorzGap);
1639 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1640 ok( regval == -1 || regval == lpMm_orig.iVertGap, "wrong value in registry %d, expected %d\n",
1641 regval, lpMm_orig.iVertGap);
1642 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1643 ok( regval == -1 || regval == lpMm_orig.iArrange, "wrong value in registry %d, expected %d\n",
1644 regval, lpMm_orig.iArrange);
1645 /* set some new values */
1646 lpMm_cur.iWidth = 180;
1647 lpMm_cur.iHorzGap = 1;
1648 lpMm_cur.iVertGap = 1;
1649 lpMm_cur.iArrange = 5;
1650 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1651 &lpMm_cur, SPIF_UPDATEINIFILE );
1652 if (!test_error_msg(rc,"SPI_SETMINIMIZEDMETRICS")) return;
1653 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1654 /* read them back */
1655 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1656 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1657 /* and compare */
1658 eq( lpMm_new.iWidth, lpMm_cur.iWidth, "iWidth", "%d" );
1659 eq( lpMm_new.iHorzGap, lpMm_cur.iHorzGap, "iHorzGap", "%d" );
1660 eq( lpMm_new.iVertGap, lpMm_cur.iVertGap, "iVertGap", "%d" );
1661 eq( lpMm_new.iArrange, lpMm_cur.iArrange, "iArrange", "%d" );
1662 /* test registry */
1663 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1664 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1665 regval, lpMm_new.iWidth);
1666 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1667 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1668 regval, lpMm_new.iHorzGap);
1669 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1670 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1671 regval, lpMm_new.iVertGap);
1672 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1673 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1674 regval, lpMm_new.iArrange);
1675 /* test some system metrics */
1676 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1677 lpMm_new.iWidth, "iWidth", "%d" );
1678 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1679 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1680 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1681 lpMm_new.iVertGap, "iVertGap", "%d" );
1682 eq( GetSystemMetrics( SM_ARRANGE ),
1683 lpMm_new.iArrange, "iArrange", "%d" );
1684 /* now some really invalid settings */
1685 lpMm_cur.iWidth = -1;
1686 lpMm_cur.iHorzGap = -1;
1687 lpMm_cur.iVertGap = -1;
1688 lpMm_cur.iArrange = - 1;
1689 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1690 &lpMm_cur, SPIF_UPDATEINIFILE );
1691 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1692 /* read back */
1693 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1694 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1695 /* the width and H/V gaps have minimum 0, arrange is and'd with 0xf */
1696 eq( lpMm_new.iWidth, 0, "iWidth", "%d" );
1697 eq( lpMm_new.iHorzGap, 0, "iHorzGap", "%d" );
1698 eq( lpMm_new.iVertGap, 0, "iVertGap", "%d" );
1699 eq( lpMm_new.iArrange, 0xf & lpMm_cur.iArrange, "iArrange", "%d" );
1700 /* test registry */
1701 if (0)
1703 /* FIXME: cannot understand the results of this (11, 11, 11, 0) */
1704 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINWIDTH_VALNAME, dpi);
1705 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1706 regval, lpMm_new.iWidth);
1707 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINHORZGAP_VALNAME, dpi);
1708 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1709 regval, lpMm_new.iHorzGap);
1710 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINVERTGAP_VALNAME, dpi);
1711 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1712 regval, lpMm_new.iVertGap);
1713 regval = metricfromreg( SPI_MINIMIZEDMETRICS_REGKEY, SPI_MINARRANGE_VALNAME, dpi);
1714 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1715 regval, lpMm_new.iArrange);
1717 /* test some system metrics */
1718 eq( GetSystemMetrics( SM_CXMINIMIZED ) - 6,
1719 lpMm_new.iWidth, "iWidth", "%d" );
1720 eq( GetSystemMetrics( SM_CXMINSPACING ) - GetSystemMetrics( SM_CXMINIMIZED ),
1721 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1722 eq( GetSystemMetrics( SM_CYMINSPACING ) - GetSystemMetrics( SM_CYMINIMIZED ),
1723 lpMm_new.iVertGap, "iVertGap", "%d" );
1724 eq( GetSystemMetrics( SM_ARRANGE ),
1725 lpMm_new.iArrange, "iArrange", "%d" );
1726 /* restore */
1727 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1728 &lpMm_orig, SPIF_UPDATEINIFILE );
1729 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1730 /* check that */
1731 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1732 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1733 eq( lpMm_new.iWidth, lpMm_orig.iWidth, "iWidth", "%d" );
1734 eq( lpMm_new.iHorzGap, lpMm_orig.iHorzGap, "iHorzGap", "%d" );
1735 eq( lpMm_new.iVertGap, lpMm_orig.iVertGap, "iVertGap", "%d" );
1736 eq( lpMm_new.iArrange, lpMm_orig.iArrange, "iArrange", "%d" );
1739 static void test_SPI_SETICONMETRICS( void ) /* 46 */
1741 BOOL rc, wrap;
1742 INT spacing;
1743 ICONMETRICSA im_orig;
1744 ICONMETRICSA im_new;
1745 ICONMETRICSA im_cur;
1746 INT regval;
1748 im_orig.cbSize = sizeof(ICONMETRICSA);
1749 im_new.cbSize = sizeof(ICONMETRICSA);
1750 im_cur.cbSize = sizeof(ICONMETRICSA);
1752 trace("testing SPI_{GET,SET}ICONMETRICS\n");
1753 SetLastError(0xdeadbeef);
1754 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_orig, FALSE );
1755 if (!test_error_msg(rc,"SPI_{GET,SET}ICONMETRICS"))
1756 return;
1757 /* check some registry values */
1758 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1759 ok( regval==im_orig.iHorzSpacing || broken(regval == -1), /* nt4 */
1760 "wrong value in registry %d, expected %d\n", regval, im_orig.iHorzSpacing);
1761 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1762 ok( regval==im_orig.iVertSpacing || broken(regval == -1), /* nt4 */
1763 "wrong value in registry %d, expected %d\n", regval, im_orig.iVertSpacing);
1764 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1765 if( regval != im_orig.iTitleWrap)
1766 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1767 ok( regval==im_orig.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_orig.iTitleWrap);
1769 /* change everything without creating something invalid ( Win9x would ignore
1770 * an invalid font for instance) */
1771 im_cur = im_orig;
1772 im_cur.iHorzSpacing += 10;
1773 im_cur.iVertSpacing += 6;
1774 im_cur.iTitleWrap = !im_cur.iTitleWrap;
1775 im_cur.lfFont.lfHeight += 1;
1776 im_cur.lfFont.lfWidth += 2;
1777 im_cur.lfFont.lfEscapement = 1;
1778 im_cur.lfFont.lfWeight = im_cur.lfFont.lfWeight > 100 ? 1 : 314;
1779 im_cur.lfFont.lfItalic = !im_cur.lfFont.lfItalic;
1780 im_cur.lfFont.lfStrikeOut = !im_cur.lfFont.lfStrikeOut;
1781 im_cur.lfFont.lfUnderline = !im_cur.lfFont.lfUnderline;
1782 im_cur.lfFont.lfCharSet = im_cur.lfFont.lfCharSet ? 0 : 1;
1783 im_cur.lfFont.lfOutPrecision = im_cur.lfFont.lfOutPrecision == OUT_DEFAULT_PRECIS ?
1784 OUT_TT_PRECIS : OUT_DEFAULT_PRECIS;
1785 im_cur.lfFont.lfClipPrecision ^= CLIP_LH_ANGLES;
1786 im_cur.lfFont.lfPitchAndFamily = im_cur.lfFont.lfPitchAndFamily ? 0 : 1;
1787 im_cur.lfFont.lfQuality = im_cur.lfFont.lfQuality == DEFAULT_QUALITY ?
1788 DRAFT_QUALITY : DEFAULT_QUALITY;
1789 if( strcmp( im_cur.lfFont.lfFaceName, "MS Serif"))
1790 strcpy( im_cur.lfFont.lfFaceName, "MS Serif");
1791 else
1792 strcpy( im_cur.lfFont.lfFaceName, "MS Sans Serif");
1794 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_cur, SPIF_UPDATEINIFILE );
1795 if (!test_error_msg(rc,"SPI_SETICONMETRICS")) return;
1796 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1798 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1799 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1800 /* test GET <-> SETICONMETRICS */
1801 eq( im_new.iHorzSpacing, im_cur.iHorzSpacing, "iHorzSpacing", "%d" );
1802 eq( im_new.iVertSpacing, im_cur.iVertSpacing, "iVertSpacing", "%d" );
1803 eq( im_new.iTitleWrap, im_cur.iTitleWrap, "iTitleWrap", "%d" );
1804 eq( im_new.lfFont.lfHeight, im_cur.lfFont.lfHeight, "lfHeight", "%d" );
1805 eq( im_new.lfFont.lfWidth, im_cur.lfFont.lfWidth, "lfWidth", "%d" );
1806 eq( im_new.lfFont.lfEscapement, im_cur.lfFont.lfEscapement, "lfEscapement", "%d" );
1807 eq( im_new.lfFont.lfWeight, im_cur.lfFont.lfWeight, "lfWeight", "%d" );
1808 eq( im_new.lfFont.lfItalic, im_cur.lfFont.lfItalic, "lfItalic", "%d" );
1809 eq( im_new.lfFont.lfStrikeOut, im_cur.lfFont.lfStrikeOut, "lfStrikeOut", "%d" );
1810 eq( im_new.lfFont.lfUnderline, im_cur.lfFont.lfUnderline, "lfUnderline", "%d" );
1811 eq( im_new.lfFont.lfCharSet, im_cur.lfFont.lfCharSet, "lfCharSet", "%d" );
1812 eq( im_new.lfFont.lfOutPrecision, im_cur.lfFont.lfOutPrecision, "lfOutPrecision", "%d" );
1813 eq( im_new.lfFont.lfClipPrecision, im_cur.lfFont.lfClipPrecision, "lfClipPrecision", "%d" );
1814 eq( im_new.lfFont.lfPitchAndFamily, im_cur.lfFont.lfPitchAndFamily, "lfPitchAndFamily", "%d" );
1815 eq( im_new.lfFont.lfQuality, im_cur.lfFont.lfQuality, "lfQuality", "%d" );
1816 ok( !strcmp( im_new.lfFont.lfFaceName, im_cur.lfFont.lfFaceName),
1817 "wrong facename \"%s\", should be \"%s\"\n", im_new.lfFont.lfFaceName,
1818 im_cur.lfFont.lfFaceName);
1819 /* test some system metrics */
1820 eq( GetSystemMetrics( SM_CXICONSPACING ),
1821 im_new.iHorzSpacing, "iHorzSpacing", "%d" );
1822 eq( GetSystemMetrics( SM_CYICONSPACING ),
1823 im_new.iVertSpacing, "iVertSpacing", "%d" );
1824 /* check some registry values */
1825 regval = metricfromreg( SPI_ICONHORIZONTALSPACING_REGKEY, SPI_ICONHORIZONTALSPACING_VALNAME, dpi);
1826 ok( regval==im_cur.iHorzSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iHorzSpacing);
1827 regval = metricfromreg( SPI_ICONVERTICALSPACING_REGKEY, SPI_ICONVERTICALSPACING_VALNAME, dpi);
1828 ok( regval==im_cur.iVertSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iVertSpacing);
1829 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY2, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1830 if( regval != im_cur.iTitleWrap)
1831 regval = metricfromreg( SPI_SETICONTITLEWRAP_REGKEY1, SPI_SETICONTITLEWRAP_VALNAME, dpi);
1832 ok( regval==im_cur.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_cur.iTitleWrap);
1833 /* test some values from other SPI_GETxxx calls */
1834 rc = SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
1835 ok( rc && spacing == im_cur.iHorzSpacing,
1836 "SystemParametersInfoA( SPI_ICONHORIZONTALSPACING...) failed or returns wrong value %d instead of %d\n",
1837 spacing, im_cur.iHorzSpacing);
1838 rc = SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1839 ok( rc && spacing == im_cur.iVertSpacing,
1840 "SystemParametersInfoA( SPI_ICONVERTICALSPACING...) failed or returns wrong value %d instead of %d\n",
1841 spacing, im_cur.iVertSpacing);
1842 rc = SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &wrap, 0 );
1843 ok( rc && wrap == im_cur.iTitleWrap,
1844 "SystemParametersInfoA( SPI_GETICONTITLEWRAP...) failed or returns wrong value %d instead of %d\n",
1845 wrap, im_cur.iTitleWrap);
1846 /* restore old values */
1847 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_orig,SPIF_UPDATEINIFILE );
1848 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1850 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1851 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1853 eq( im_new.iHorzSpacing, im_orig.iHorzSpacing, "iHorzSpacing", "%d" );
1854 eq( im_new.iVertSpacing, im_orig.iVertSpacing, "iVertSpacing", "%d" );
1855 eq( im_new.iTitleWrap, im_orig.iTitleWrap, "iTitleWrap", "%d" );
1858 static void test_SPI_SETWORKAREA( void ) /* 47 */
1860 BOOL rc;
1861 RECT old_area;
1862 RECT area;
1863 RECT curr_val;
1865 trace("testing SPI_{GET,SET}WORKAREA\n");
1866 SetLastError(0xdeadbeef);
1867 rc=SystemParametersInfoA(SPI_GETWORKAREA, 0, &old_area, 0);
1868 if (!test_error_msg(rc,"SPI_{GET,SET}WORKAREA"))
1869 return;
1871 /* Modify the work area only minimally as this causes the icons that
1872 * fall outside it to be moved around thus requiring the user to
1873 * reposition them manually one by one.
1874 * Changing the work area by just one pixel should make this occurrence
1875 * reasonably unlikely.
1877 SetRect(&curr_val, old_area.left, old_area.top, old_area.right - 1, old_area.bottom - 1);
1878 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &curr_val,
1879 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1880 if (!test_error_msg(rc,"SPI_SETWORKAREA")) return;
1881 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1882 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1883 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1884 if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */
1885 test_change_message( SPI_SETWORKAREA, 0);
1886 eq( area.left, curr_val.left, "left", "%d" );
1887 eq( area.top, curr_val.top, "top", "%d" );
1888 /* size may be rounded */
1889 ok( area.right >= curr_val.right - 16 && area.right < curr_val.right + 16,
1890 "right: got %d instead of %d\n", area.right, curr_val.right );
1891 ok( area.bottom >= curr_val.bottom - 16 && area.bottom < curr_val.bottom + 16,
1892 "bottom: got %d instead of %d\n", area.bottom, curr_val.bottom );
1893 curr_val = area;
1894 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &old_area,
1895 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1896 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1897 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1898 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
1899 if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */
1900 test_change_message( SPI_SETWORKAREA, 0 );
1901 eq( area.left, old_area.left, "left", "%d" );
1902 eq( area.top, old_area.top, "top", "%d" );
1903 /* size may be rounded */
1904 ok( area.right >= old_area.right - 16 && area.right < old_area.right + 16,
1905 "right: got %d instead of %d\n", area.right, old_area.right );
1906 ok( area.bottom >= old_area.bottom - 16 && area.bottom < old_area.bottom + 16,
1907 "bottom: got %d instead of %d\n", area.bottom, old_area.bottom );
1910 static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */
1912 BOOL rc;
1913 BOOL old_b;
1914 const UINT vals[]={TRUE,FALSE};
1915 unsigned int i;
1917 trace("testing SPI_{GET,SET}SHOWSOUNDS\n");
1918 SetLastError(0xdeadbeef);
1919 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &old_b, 0 );
1920 /* SPI_{GET,SET}SHOWSOUNDS is completely broken on Win9x */
1921 if (!test_error_msg(rc,"SPI_{GET,SET}SHOWSOUNDS"))
1922 return;
1924 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1926 UINT v;
1928 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, vals[i], 0,
1929 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1930 if (!test_error_msg(rc,"SPI_SETSHOWSOUNDS")) return;
1931 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1932 test_change_message( SPI_SETSHOWSOUNDS, 1 );
1933 test_reg_key( SPI_SETSHOWSOUNDS_REGKEY,
1934 SPI_SETSHOWSOUNDS_VALNAME,
1935 vals[i] ? "1" : "0" );
1937 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &v, 0 );
1938 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1939 eq( v, vals[i], "SPI_GETSHOWSOUNDS", "%d" );
1940 eq( GetSystemMetrics( SM_SHOWSOUNDS ), (int)vals[i],
1941 "SM_SHOWSOUNDS", "%d" );
1944 rc=SystemParametersInfoA( SPI_SETSHOWSOUNDS, old_b, 0, SPIF_UPDATEINIFILE );
1945 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1948 static void test_SPI_SETKEYBOARDPREF( void ) /* 69 */
1950 BOOL rc;
1951 BOOL old_b;
1952 const UINT vals[]={TRUE,FALSE};
1953 unsigned int i;
1955 trace("testing SPI_{GET,SET}KEYBOARDPREF\n");
1956 SetLastError(0xdeadbeef);
1957 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &old_b, 0 );
1958 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDPREF"))
1959 return;
1961 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1963 BOOL v;
1965 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, vals[i], 0,
1966 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
1967 if (!test_error_msg(rc,"SPI_SETKEYBOARDPREF")) return;
1968 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1969 test_change_message( SPI_SETKEYBOARDPREF, 1 );
1970 test_reg_key_ex2( SPI_SETKEYBOARDPREF_REGKEY, SPI_SETKEYBOARDPREF_REGKEY_LEGACY,
1971 SPI_SETKEYBOARDPREF_VALNAME, SPI_SETKEYBOARDPREF_VALNAME_LEGACY,
1972 vals[i] ? "1" : "0" );
1974 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &v, 0 );
1975 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
1976 eq( v, (BOOL)vals[i], "SPI_GETKEYBOARDPREF", "%d" );
1979 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, old_b, 0, SPIF_UPDATEINIFILE );
1980 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
1983 static void test_SPI_SETSCREENREADER( void ) /* 71 */
1985 BOOL rc;
1986 BOOL old_b;
1987 const UINT vals[]={TRUE,FALSE};
1988 unsigned int i;
1990 trace("testing SPI_{GET,SET}SCREENREADER\n");
1991 SetLastError(0xdeadbeef);
1992 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &old_b, 0 );
1993 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENREADER"))
1994 return;
1996 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
1998 BOOL v;
2000 rc=SystemParametersInfoA( SPI_SETSCREENREADER, vals[i], 0,
2001 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2002 if (!test_error_msg(rc,"SPI_SETSCREENREADER")) return;
2003 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2004 test_change_message( SPI_SETSCREENREADER, 1 );
2005 test_reg_key_ex2_optional( SPI_SETSCREENREADER_REGKEY, SPI_SETSCREENREADER_REGKEY_LEGACY,
2006 SPI_SETSCREENREADER_VALNAME, SPI_SETSCREENREADER_VALNAME_LEGACY,
2007 vals[i] ? "1" : "0" );
2009 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &v, 0 );
2010 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2011 eq( v, (BOOL)vals[i], "SPI_GETSCREENREADER", "%d" );
2014 rc=SystemParametersInfoA( SPI_SETSCREENREADER, old_b, 0, SPIF_UPDATEINIFILE );
2015 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2018 static void test_SPI_SETFONTSMOOTHING( void ) /* 75 */
2020 BOOL rc;
2021 BOOL old_b;
2022 DWORD old_type, old_contrast, old_orient;
2023 const UINT vals[]={0xffffffff,0,1,2};
2024 unsigned int i;
2026 trace("testing SPI_{GET,SET}FONTSMOOTHING\n");
2027 if( iswin9x) return; /* 95/98/ME don't seem to implement this fully */
2028 SetLastError(0xdeadbeef);
2029 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &old_b, 0 );
2030 if (!test_error_msg(rc,"SPI_{GET,SET}FONTSMOOTHING"))
2031 return;
2032 SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE, 0, &old_type, 0 );
2033 SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST, 0, &old_contrast, 0 );
2034 SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION, 0, &old_orient, 0 );
2036 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2038 UINT v;
2040 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, vals[i], 0,
2041 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2042 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHING")) return;
2043 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2044 test_change_message( SPI_SETFONTSMOOTHING, 0 );
2045 test_reg_key( SPI_SETFONTSMOOTHING_REGKEY,
2046 SPI_SETFONTSMOOTHING_VALNAME,
2047 vals[i] ? "2" : "0" );
2049 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE, 0, UlongToPtr(vals[i]),
2050 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2051 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGTYPE")) return;
2052 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2053 test_change_message( SPI_SETFONTSMOOTHINGTYPE, 0 );
2054 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY,
2055 SPI_SETFONTSMOOTHINGTYPE_VALNAME, &vals[i] );
2057 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST, 0, UlongToPtr(vals[i]),
2058 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2059 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGCONTRAST")) return;
2060 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2061 test_change_message( SPI_SETFONTSMOOTHINGCONTRAST, 0 );
2062 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY,
2063 SPI_SETFONTSMOOTHINGCONTRAST_VALNAME, &vals[i] );
2065 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION, 0, UlongToPtr(vals[i]),
2066 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2067 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGORIENTATION")) return;
2068 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2069 test_change_message( SPI_SETFONTSMOOTHINGORIENTATION, 0 );
2070 test_reg_key_dword( SPI_SETFONTSMOOTHING_REGKEY,
2071 SPI_SETFONTSMOOTHINGORIENTATION_VALNAME, &vals[i] );
2073 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &v, 0 );
2074 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2075 eq( v, vals[i] ? 1 : 0, "SPI_GETFONTSMOOTHING", "%d" );
2077 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE, 0, &v, 0 );
2078 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2079 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2081 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST, 0, &v, 0 );
2082 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2083 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2085 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION, 0, &v, 0 );
2086 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2087 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2090 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, old_b, 0, SPIF_UPDATEINIFILE );
2091 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2092 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE, old_type, 0, SPIF_UPDATEINIFILE );
2093 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2094 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST, old_contrast, 0, SPIF_UPDATEINIFILE );
2095 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2096 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION, old_orient, 0, SPIF_UPDATEINIFILE );
2097 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2100 static void test_SPI_SETLOWPOWERACTIVE( void ) /* 85 */
2102 BOOL rc;
2103 BOOL old_b;
2104 const UINT vals[]={TRUE,FALSE};
2105 unsigned int i;
2107 trace("testing SPI_{GET,SET}LOWPOWERACTIVE\n");
2108 SetLastError(0xdeadbeef);
2109 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &old_b, 0 );
2110 if (!test_error_msg(rc,"SPI_{GET,SET}LOWPOWERACTIVE"))
2111 return;
2113 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2115 UINT v;
2117 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, vals[i], 0,
2118 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2119 if (!test_error_msg(rc,"SPI_SETLOWPOWERACTIVE")) return;
2120 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2121 test_change_message( SPI_SETLOWPOWERACTIVE, 1 );
2122 test_reg_key_optional( SPI_SETLOWPOWERACTIVE_REGKEY,
2123 SPI_SETLOWPOWERACTIVE_VALNAME,
2124 vals[i] ? "1" : "0" );
2126 /* SPI_SETLOWPOWERACTIVE is not persistent in win2k3 and above */
2127 v = 0xdeadbeef;
2128 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &v, 0 );
2129 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2130 ok(v == vals[i] ||
2131 broken(v == (0xdead0000 | vals[i])) || /* win98 only sets the low word */
2132 v == 0, /* win2k3 */
2133 "SPI_GETLOWPOWERACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
2136 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
2137 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2140 static void test_SPI_SETPOWEROFFACTIVE( void ) /* 86 */
2142 BOOL rc;
2143 BOOL old_b;
2144 const UINT vals[]={TRUE,FALSE};
2145 unsigned int i;
2147 trace("testing SPI_{GET,SET}POWEROFFACTIVE\n");
2148 SetLastError(0xdeadbeef);
2149 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &old_b, 0 );
2150 if (!test_error_msg(rc,"SPI_{GET,SET}POWEROFFACTIVE"))
2151 return;
2153 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2155 UINT v;
2157 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, vals[i], 0,
2158 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2159 if (!test_error_msg(rc,"SPI_SETPOWEROFFACTIVE")) return;
2160 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2161 test_change_message( SPI_SETPOWEROFFACTIVE, 1 );
2162 test_reg_key_optional( SPI_SETPOWEROFFACTIVE_REGKEY,
2163 SPI_SETPOWEROFFACTIVE_VALNAME,
2164 vals[i] ? "1" : "0" );
2166 /* SPI_SETPOWEROFFACTIVE is not persistent in win2k3 and above */
2167 v = 0xdeadbeef;
2168 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &v, 0 );
2169 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2170 ok(v == vals[i] ||
2171 broken(v == (0xdead0000 | vals[i])) || /* win98 only sets the low word */
2172 v == 0, /* win2k3 */
2173 "SPI_GETPOWEROFFACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
2176 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
2177 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2180 static void test_SPI_SETSNAPTODEFBUTTON( void ) /* 95 */
2182 BOOL rc;
2183 BOOL old_b;
2184 const UINT vals[]={TRUE,FALSE};
2185 unsigned int i;
2187 trace("testing SPI_{GET,SET}SNAPTODEFBUTTON\n");
2188 SetLastError(0xdeadbeef);
2189 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &old_b, 0 );
2190 if (!test_error_msg(rc,"SPI_GETSNAPTODEFBUTTON"))
2191 return;
2193 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2195 UINT v;
2197 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, vals[i], 0,
2198 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2199 if (!test_error_msg(rc,"SPI_SETSNAPTODEFBUTTON")) return;
2200 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2201 test_change_message( SPI_SETSNAPTODEFBUTTON, 0 );
2202 test_reg_key_optional( SPI_SETSNAPTODEFBUTTON_REGKEY,
2203 SPI_SETSNAPTODEFBUTTON_VALNAME,
2204 vals[i] ? "1" : "0" );
2206 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &v, 0 );
2207 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2208 eq( v, vals[i], "SPI_GETSNAPTODEFBUTTON", "%d" );
2211 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, old_b, 0, SPIF_UPDATEINIFILE );
2212 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2215 static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */
2217 BOOL rc;
2218 UINT old_width;
2219 const UINT vals[]={0,32767};
2220 unsigned int i;
2222 trace("testing SPI_{GET,SET}MOUSEHOVERWIDTH\n");
2223 SetLastError(0xdeadbeef);
2224 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &old_width, 0 );
2225 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2226 * what MSDN states (Verified on Win98SE)
2228 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERWIDTH"))
2229 return;
2231 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2233 UINT v;
2234 char buf[10];
2236 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, vals[i], 0,
2237 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2238 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERWIDTH")) return;
2239 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2240 test_change_message( SPI_SETMOUSEHOVERWIDTH, 0 );
2241 sprintf( buf, "%d", vals[i] );
2242 test_reg_key( SPI_SETMOUSEHOVERWIDTH_REGKEY,
2243 SPI_SETMOUSEHOVERWIDTH_VALNAME, buf );
2245 SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &v, 0 );
2246 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2247 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERWIDTH", "%d" );
2250 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, old_width, 0,
2251 SPIF_UPDATEINIFILE );
2252 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2255 static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */
2257 BOOL rc;
2258 UINT old_height;
2259 const UINT vals[]={0,32767};
2260 unsigned int i;
2262 trace("testing SPI_{GET,SET}MOUSEHOVERHEIGHT\n");
2263 SetLastError(0xdeadbeef);
2264 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &old_height, 0 );
2265 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2266 * what MSDN states (Verified on Win98SE)
2268 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERHEIGHT"))
2269 return;
2271 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2273 UINT v;
2274 char buf[10];
2276 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, vals[i], 0,
2277 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2278 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERHEIGHT")) return;
2279 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2280 test_change_message( SPI_SETMOUSEHOVERHEIGHT, 0 );
2281 sprintf( buf, "%d", vals[i] );
2282 test_reg_key( SPI_SETMOUSEHOVERHEIGHT_REGKEY,
2283 SPI_SETMOUSEHOVERHEIGHT_VALNAME, buf );
2285 SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &v, 0 );
2286 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2287 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERHEIGHT", "%d" );
2290 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, old_height, 0,
2291 SPIF_UPDATEINIFILE );
2292 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2295 static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */
2297 BOOL rc;
2298 UINT old_time;
2300 /* Windows XP accepts 10 as the minimum hover time. Any value below will be
2301 * defaulted to a value of 10 automatically.
2303 const UINT vals[]={10,32767};
2304 unsigned int i;
2306 trace("testing SPI_{GET,SET}MOUSEHOVERTIME\n");
2307 SetLastError(0xdeadbeef);
2308 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &old_time, 0 );
2309 /* SPI_{GET,SET}MOUSEHOVERWIDTH does not seem to be supported on Win9x despite
2310 * what MSDN states (Verified on Win98SE)
2312 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERTIME"))
2313 return;
2315 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2317 UINT v;
2318 char buf[10];
2320 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, vals[i], 0,
2321 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2322 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERTIME")) return;
2323 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2324 test_change_message( SPI_SETMOUSEHOVERTIME, 0 );
2325 sprintf( buf, "%d", vals[i] );
2326 test_reg_key( SPI_SETMOUSEHOVERTIME_REGKEY,
2327 SPI_SETMOUSEHOVERTIME_VALNAME, buf );
2329 SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &v, 0 );
2330 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2331 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERTIME", "%d" );
2334 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, old_time, 0,
2335 SPIF_UPDATEINIFILE );
2336 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2339 static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */
2341 BOOL rc;
2342 UINT old_lines;
2343 const UINT vals[]={0,32767};
2344 unsigned int i;
2346 trace("testing SPI_{GET,SET}WHEELSCROLLLINES\n");
2347 SetLastError(0xdeadbeef);
2348 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &old_lines, 0 );
2350 /* SPI_{GET,SET}WHEELSCROLLLINES not supported on Windows 95 */
2351 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLLINES"))
2352 return;
2354 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2356 UINT v;
2357 char buf[10];
2359 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, vals[i], 0,
2360 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2361 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLLINES")) return;
2362 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2363 test_change_message( SPI_SETWHEELSCROLLLINES, 0 );
2364 sprintf( buf, "%d", vals[i] );
2365 test_reg_key( SPI_SETMOUSESCROLLLINES_REGKEY,
2366 SPI_SETMOUSESCROLLLINES_VALNAME, buf );
2368 SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &v, 0 );
2369 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2370 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLLINES", "%d" );
2373 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLLINES, old_lines, 0,
2374 SPIF_UPDATEINIFILE );
2375 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2378 static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */
2380 BOOL rc;
2381 UINT old_delay;
2382 const UINT vals[]={0,32767};
2383 unsigned int i;
2385 trace("testing SPI_{GET,SET}MENUSHOWDELAY\n");
2386 SetLastError(0xdeadbeef);
2387 rc=SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &old_delay, 0 );
2389 /* SPI_{GET,SET}MENUSHOWDELAY not supported on Windows 95 */
2390 if (!test_error_msg(rc,"SPI_{GET,SET}MENUSHOWDELAY"))
2391 return;
2393 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2395 UINT v;
2396 char buf[10];
2398 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, vals[i], 0,
2399 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2400 if (!test_error_msg(rc,"SPI_SETMENUSHOWDELAY")) return;
2401 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2402 test_change_message( SPI_SETMENUSHOWDELAY, 0 );
2403 sprintf( buf, "%d", vals[i] );
2404 test_reg_key( SPI_SETMENUSHOWDELAY_REGKEY,
2405 SPI_SETMENUSHOWDELAY_VALNAME, buf );
2407 SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &v, 0 );
2408 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2409 eq( v, vals[i], "SPI_{GET,SET}MENUSHOWDELAY", "%d" );
2412 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, old_delay, 0,
2413 SPIF_UPDATEINIFILE );
2414 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2417 static void test_SPI_SETWHEELSCROLLCHARS( void ) /* 108 */
2419 BOOL rc;
2420 UINT old_chars;
2421 const UINT vals[]={32767,0};
2422 unsigned int i;
2424 trace("testing SPI_{GET,SET}WHEELSCROLLCHARS\n");
2425 SetLastError(0xdeadbeef);
2426 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS, 0, &old_chars, 0 );
2428 /* SPI_{GET,SET}WHEELSCROLLCHARS not supported on Windows 95 */
2429 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLCHARS"))
2430 return;
2432 for (i=0;i<sizeof(vals)/sizeof(*vals);i++)
2434 UINT v;
2435 char buf[10];
2437 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, vals[i], 0,
2438 SPIF_UPDATEINIFILE | SPIF_SENDCHANGE );
2439 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLCHARS")) return;
2440 test_change_message( SPI_SETWHEELSCROLLCHARS, 0 );
2441 sprintf( buf, "%d", vals[i] );
2442 test_reg_key( SPI_SETMOUSESCROLLCHARS_REGKEY,
2443 SPI_SETMOUSESCROLLCHARS_VALNAME, buf );
2445 SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS, 0, &v, 0 );
2446 ok(rc, "%d: rc=%d err=%d\n", i, rc, GetLastError());
2447 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLCHARS", "%d" );
2450 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, old_chars, 0,
2451 SPIF_UPDATEINIFILE );
2452 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2455 static void test_SPI_SETWALLPAPER( void ) /* 115 */
2457 BOOL rc;
2458 char oldval[260];
2459 char newval[260];
2461 trace("testing SPI_{GET,SET}DESKWALLPAPER\n");
2462 SetLastError(0xdeadbeef);
2463 rc=SystemParametersInfoA(SPI_GETDESKWALLPAPER, 260, oldval, 0);
2464 /* SPI_{GET,SET}DESKWALLPAPER is completely broken on Win9x and
2465 * unimplemented on NT4
2467 if (!test_error_msg(rc,"SPI_{GET,SET}DESKWALLPAPER"))
2468 return;
2470 strcpy(newval, "");
2471 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, newval, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
2472 if (!test_error_msg(rc,"SPI_SETDESKWALLPAPER")) return;
2473 ok(rc, "SystemParametersInfoA: rc=%d err=%d\n", rc, GetLastError());
2474 test_change_message(SPI_SETDESKWALLPAPER, 0);
2476 rc=SystemParametersInfoA(SPI_SETDESKWALLPAPER, 0, oldval, SPIF_UPDATEINIFILE);
2477 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%d\n", rc, GetLastError());
2479 test_reg_key(SPI_SETDESKWALLPAPER_REGKEY, SPI_SETDESKWALLPAPER_VALNAME, oldval);
2482 static void test_WM_DISPLAYCHANGE(void)
2484 DEVMODEA mode, startmode;
2485 int start_bpp, last_set_bpp = 0;
2486 int test_bpps[] = {8, 16, 24, 32}, i;
2487 LONG change_ret;
2488 DWORD wait_ret;
2490 if (!pChangeDisplaySettingsExA)
2492 win_skip("ChangeDisplaySettingsExA is not available\n");
2493 return;
2496 displaychange_test_active = TRUE;
2498 memset(&startmode, 0, sizeof(startmode));
2499 startmode.dmSize = sizeof(startmode);
2500 EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &startmode);
2501 start_bpp = startmode.dmBitsPerPel;
2503 displaychange_sem = CreateSemaphoreW(NULL, 0, 1, NULL);
2505 for(i = 0; i < sizeof(test_bpps)/sizeof(test_bpps[0]); i++) {
2506 last_bpp = -1;
2508 memset(&mode, 0, sizeof(mode));
2509 mode.dmSize = sizeof(mode);
2510 mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
2511 mode.dmBitsPerPel = test_bpps[i];
2512 mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
2513 mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
2515 change_counter = 0; /* This sends a SETTINGSCHANGE message as well in which we aren't interested */
2516 displaychange_ok = TRUE;
2517 change_ret = pChangeDisplaySettingsExA(NULL, &mode, NULL, 0, NULL);
2518 /* Wait quite long for the message, screen setting changes can take some time */
2519 if(change_ret == DISP_CHANGE_SUCCESSFUL) {
2520 wait_ret = WaitForSingleObject(displaychange_sem, 10000);
2521 /* we may not get a notification if nothing changed */
2522 if (wait_ret == WAIT_TIMEOUT && !last_set_bpp && start_bpp == test_bpps[i])
2523 continue;
2524 ok(wait_ret == WAIT_OBJECT_0, "Waiting for the WM_DISPLAYCHANGE message timed out\n");
2526 displaychange_ok = FALSE;
2528 if(change_ret != DISP_CHANGE_SUCCESSFUL) {
2529 skip("Setting depth %d failed(ret = %d)\n", test_bpps[i], change_ret);
2530 ok(last_bpp == -1, "WM_DISPLAYCHANGE was sent with wParam %d despite mode change failure\n", last_bpp);
2531 continue;
2534 todo_wine_if(start_bpp != test_bpps[i]) {
2535 ok(last_bpp == test_bpps[i], "Set bpp %d, but WM_DISPLAYCHANGE reported bpp %d\n", test_bpps[i], last_bpp);
2537 last_set_bpp = test_bpps[i];
2540 if(start_bpp != last_set_bpp && last_set_bpp != 0) {
2541 memset(&mode, 0, sizeof(mode));
2542 mode.dmSize = sizeof(mode);
2543 mode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
2544 mode.dmBitsPerPel = start_bpp;
2545 mode.dmPelsWidth = GetSystemMetrics(SM_CXSCREEN);
2546 mode.dmPelsHeight = GetSystemMetrics(SM_CYSCREEN);
2548 displaychange_ok = TRUE;
2549 change_ret = pChangeDisplaySettingsExA(NULL, &mode, NULL, 0, NULL);
2550 WaitForSingleObject(displaychange_sem, 10000);
2551 displaychange_ok = FALSE;
2552 CloseHandle(displaychange_sem);
2553 displaychange_sem = 0;
2556 displaychange_test_active = FALSE;
2560 * Registry entries for the system parameters.
2561 * Names are created by 'SET' flags names.
2562 * We assume that corresponding 'GET' entries use the same registry keys.
2564 static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam )
2566 test_SPI_SETBEEP(); /* 1 */
2567 test_SPI_SETMOUSE(); /* 4 */
2568 test_SPI_SETBORDER(); /* 6 */
2569 test_SPI_SETKEYBOARDSPEED(); /* 10 */
2570 test_SPI_ICONHORIZONTALSPACING(); /* 13 */
2571 test_SPI_SETSCREENSAVETIMEOUT(); /* 14 */
2572 test_SPI_SETSCREENSAVEACTIVE(); /* 17 */
2573 test_SPI_SETGRIDGRANULARITY(); /* 19 */
2574 test_SPI_SETKEYBOARDDELAY(); /* 23 */
2575 test_SPI_ICONVERTICALSPACING(); /* 24 */
2576 test_SPI_SETICONTITLEWRAP(); /* 26 */
2577 test_SPI_SETMENUDROPALIGNMENT(); /* 28 */
2578 test_SPI_SETDOUBLECLKWIDTH(); /* 29 */
2579 test_SPI_SETDOUBLECLKHEIGHT(); /* 30 */
2580 test_SPI_SETDOUBLECLICKTIME(); /* 32 */
2581 test_SPI_SETMOUSEBUTTONSWAP(); /* 33 */
2582 test_SPI_SETFASTTASKSWITCH(); /* 36 */
2583 test_SPI_SETDRAGFULLWINDOWS(); /* 37 */
2584 /* test_WM_DISPLAYCHANGE seems to be somewhat buggy on
2585 * some versions of Windows (Vista, Win2k8, Win7B) in that
2586 * not all metrics are properly restored. Problems are
2587 * SM_CXMAXTRACK, SM_CYMAXTRACK
2588 * Fortunately setting the Non-Client metrics like in
2589 * test_SPI_SETNONCLIENTMETRICS will correct this. That is why
2590 * we do the DISPLAY change now... */
2591 test_WM_DISPLAYCHANGE();
2592 test_SPI_SETNONCLIENTMETRICS(); /* 42 */
2593 test_SPI_SETMINIMIZEDMETRICS(); /* 44 */
2594 test_SPI_SETICONMETRICS(); /* 46 */
2595 test_SPI_SETWORKAREA(); /* 47 */
2596 test_SPI_SETSHOWSOUNDS(); /* 57 */
2597 test_SPI_SETKEYBOARDPREF(); /* 69 */
2598 test_SPI_SETSCREENREADER(); /* 71 */
2599 test_SPI_SETFONTSMOOTHING(); /* 75 */
2600 test_SPI_SETLOWPOWERACTIVE(); /* 85 */
2601 test_SPI_SETPOWEROFFACTIVE(); /* 86 */
2602 test_SPI_SETSNAPTODEFBUTTON(); /* 95 */
2603 test_SPI_SETMOUSEHOVERWIDTH(); /* 99 */
2604 test_SPI_SETMOUSEHOVERHEIGHT(); /* 101 */
2605 test_SPI_SETMOUSEHOVERTIME(); /* 103 */
2606 test_SPI_SETWHEELSCROLLLINES(); /* 105 */
2607 test_SPI_SETMENUSHOWDELAY(); /* 107 */
2608 test_SPI_SETWHEELSCROLLCHARS(); /* 108 */
2609 test_SPI_SETWALLPAPER(); /* 115 */
2612 SendMessageA( ghTestWnd, WM_DESTROY, 0, 0 );
2613 return 0;
2616 /* test calculation of GetSystemMetrics values (mostly) from non client metrics,
2617 * icon metrics and minimized metrics.
2620 /* copied from wine's GdiGetCharDimensions, which is not available on most
2621 * windows versions */
2622 static LONG _GdiGetCharDimensions(HDC hdc, LPTEXTMETRICA lptm, LONG *height)
2624 SIZE sz;
2625 static const CHAR alphabet[] = {
2626 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
2627 'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
2628 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0};
2630 if(lptm && !GetTextMetricsA(hdc, lptm)) return 0;
2632 if(!GetTextExtentPointA(hdc, alphabet, 52, &sz)) return 0;
2634 if (height) *height = sz.cy;
2635 return (sz.cx / 26 + 1) / 2;
2638 /* get text metrics and/or "average" char width of the specified logfont
2639 * for the specified dc */
2640 static void get_text_metr_size( HDC hdc, LOGFONTA *plf, TEXTMETRICA * ptm, UINT *psz)
2642 HFONT hfont, hfontsav;
2643 TEXTMETRICA tm;
2644 if( !ptm) ptm = &tm;
2645 hfont = CreateFontIndirectA( plf);
2646 if( !hfont || ( hfontsav = SelectObject( hdc, hfont)) == NULL ) {
2647 ptm->tmHeight = -1;
2648 if( psz) *psz = 10;
2649 if( hfont) DeleteObject( hfont);
2650 return;
2652 GetTextMetricsA( hdc, ptm);
2653 if( psz)
2654 if( !(*psz = _GdiGetCharDimensions( hdc, ptm, NULL)))
2655 *psz = 10;
2656 SelectObject( hdc, hfontsav);
2657 DeleteObject( hfont);
2660 static int gsm_error_ctr;
2662 #define ok_gsm( i, e)\
2664 int exp = (e);\
2665 int act = GetSystemMetrics( (i));\
2666 if( exp != act) gsm_error_ctr++;\
2667 ok( !( exp != act),"GetSystemMetrics(%s): expected %d actual %d\n", #i, exp,act);\
2669 #define ok_gsm_2( i, e1, e2)\
2671 int exp1 = (e1);\
2672 int exp2 = (e2);\
2673 int act = GetSystemMetrics( (i));\
2674 if( exp1 != act && exp2 != act) gsm_error_ctr++;\
2675 ok( !( exp1 != act && exp2 != act), "GetSystemMetrics(%s): expected %d or %d actual %d\n", #i, exp1, exp2, act);\
2677 #define ok_gsm_3( i, e1, e2, e3)\
2679 int exp1 = (e1);\
2680 int exp2 = (e2);\
2681 int exp3 = (e3);\
2682 int act = GetSystemMetrics( (i));\
2683 if( exp1 != act && exp2 != act && exp3 != act) gsm_error_ctr++;\
2684 ok( !( exp1 != act && exp2 != act && exp3 != act),"GetSystemMetrics(%s): expected %d or %d or %d actual %d\n", #i, exp1, exp2, exp3, act);\
2687 static INT CALLBACK enum_all_fonts_proc(const LOGFONTA *elf, const TEXTMETRICA *ntm, DWORD type, LPARAM lparam)
2689 return lstrcmpiA(elf->lfFaceName, (const char *)lparam);
2692 static BOOL is_font_enumerated(const char *name)
2694 HDC hdc = CreateCompatibleDC(0);
2695 BOOL ret = FALSE;
2697 if (!EnumFontFamiliesA(hdc, NULL, enum_all_fonts_proc, (LPARAM)name))
2698 ret = TRUE;
2700 DeleteDC(hdc);
2701 return ret;
2704 static int get_cursor_size( int size )
2706 /* only certain sizes are allowed for cursors */
2707 if (size >= 64) return 64;
2708 if (size >= 48) return 48;
2709 return 32;
2712 static void test_GetSystemMetrics( void)
2714 TEXTMETRICA tmMenuFont;
2715 UINT IconSpacing, IconVerticalSpacing;
2716 BOOL rc;
2718 HDC hdc = CreateICA( "Display", 0, 0, 0);
2719 UINT avcwCaption;
2720 INT CaptionWidthfromreg, smicon, broken_val;
2721 MINIMIZEDMETRICS minim;
2722 NONCLIENTMETRICSA ncm;
2723 SIZE screen;
2725 assert(sizeof(ncm) == 344);
2727 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
2728 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2729 ok(rc, "SystemParametersInfoA failed\n");
2731 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth) - 1;
2732 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2733 ok(!rc, "SystemParametersInfoA should fail\n");
2735 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth) + 1;
2736 SetLastError(0xdeadbeef);
2737 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2738 ok(!rc, "SystemParametersInfoA should fail\n");
2740 ncm.cbSize = sizeof(ncm); /* Vista added padding */
2741 SetLastError(0xdeadbeef);
2742 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2743 ok(rc || broken(!rc) /* before Vista */, "SystemParametersInfoA failed\n");
2745 minim.cbSize = sizeof( minim);
2746 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
2747 SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, 0, &minim, 0);
2748 rc = SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2749 if( !rc) {
2750 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
2751 return;
2754 ok(is_font_enumerated(ncm.lfCaptionFont.lfFaceName), "font %s should be enumerated\n", ncm.lfCaptionFont.lfFaceName);
2755 ok(is_font_enumerated(ncm.lfSmCaptionFont.lfFaceName), "font %s should be enumerated\n", ncm.lfSmCaptionFont.lfFaceName);
2756 ok(is_font_enumerated(ncm.lfMenuFont.lfFaceName), "font %s should be enumerated\n", ncm.lfMenuFont.lfFaceName);
2757 ok(is_font_enumerated(ncm.lfStatusFont.lfFaceName), "font %s should be enumerated\n", ncm.lfStatusFont.lfFaceName);
2758 ok(is_font_enumerated(ncm.lfMessageFont.lfFaceName), "font %s should be enumerated\n", ncm.lfMessageFont.lfFaceName);
2760 /* CaptionWidth from the registry may have different value of iCaptionWidth
2761 * from the non client metrics (observed on WinXP) */
2762 CaptionWidthfromreg = metricfromreg(
2763 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
2764 get_text_metr_size( hdc, &ncm.lfMenuFont, &tmMenuFont, NULL);
2765 get_text_metr_size( hdc, &ncm.lfCaptionFont, NULL, &avcwCaption);
2766 /* FIXME: use icon metric */
2767 if( !SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &IconVerticalSpacing, 0))
2768 IconVerticalSpacing = 0;
2769 if( !SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &IconSpacing, 0 ))
2770 IconSpacing = 0;
2771 /* reset error counters */
2772 gsm_error_ctr = 0;
2774 /* the tests: */
2776 /* SM_CXSCREEN, cannot test these two */
2777 /* SM_CYSCREEN */
2778 ok_gsm( SM_CXVSCROLL, ncm.iScrollWidth);
2779 ok_gsm( SM_CYHSCROLL, ncm.iScrollWidth);
2780 ok_gsm( SM_CYCAPTION, ncm.iCaptionHeight+1);
2781 ok_gsm( SM_CXBORDER, 1);
2782 ok_gsm( SM_CYBORDER, 1);
2783 ok_gsm( SM_CXDLGFRAME, 3);
2784 ok_gsm( SM_CYDLGFRAME, 3);
2785 ok_gsm( SM_CYVTHUMB, ncm.iScrollHeight);
2786 ok_gsm( SM_CXHTHUMB, ncm.iScrollHeight);
2787 /* These don't depend on the Shell Icon Size registry value */
2788 ok_gsm( SM_CXICON, MulDiv( 32, dpi, USER_DEFAULT_SCREEN_DPI ) );
2789 ok_gsm( SM_CYICON, MulDiv( 32, dpi, USER_DEFAULT_SCREEN_DPI ) );
2790 ok_gsm( SM_CXCURSOR, get_cursor_size( MulDiv( 32, dpi, USER_DEFAULT_SCREEN_DPI )));
2791 ok_gsm( SM_CYCURSOR, get_cursor_size( MulDiv( 32, dpi, USER_DEFAULT_SCREEN_DPI )));
2792 ok_gsm( SM_CYMENU, ncm.iMenuHeight + 1);
2793 ok_gsm( SM_CXFULLSCREEN,
2794 GetSystemMetrics( SM_CXMAXIMIZED) - 2 * GetSystemMetrics( SM_CXFRAME));
2795 ok_gsm( SM_CYFULLSCREEN,
2796 GetSystemMetrics( SM_CYMAXIMIZED) - GetSystemMetrics( SM_CYMIN));
2797 /* SM_CYKANJIWINDOW */
2798 /* SM_MOUSEPRESENT */
2799 ok_gsm( SM_CYVSCROLL, ncm.iScrollHeight);
2800 ok_gsm( SM_CXHSCROLL, ncm.iScrollHeight);
2801 /* SM_DEBUG */
2802 /* SM_SWAPBUTTON */
2803 /* SM_RESERVED1 */
2804 /* SM_RESERVED2 */
2805 /* SM_RESERVED3 */
2806 /* SM_RESERVED4 */
2807 ok_gsm( SM_CXMIN, 3 * max( CaptionWidthfromreg >= 0 ? CaptionWidthfromreg : ncm.iCaptionWidth, 8) +
2808 GetSystemMetrics( SM_CYSIZE) + 4 + 4 * avcwCaption + 2 * GetSystemMetrics( SM_CXFRAME));
2809 ok_gsm( SM_CYMIN, GetSystemMetrics( SM_CYCAPTION) +
2810 2 * GetSystemMetrics( SM_CYFRAME));
2811 ok_gsm_2( SM_CXSIZE,
2812 ncm.iCaptionWidth, /* classic/standard windows style */
2813 GetSystemMetrics( SM_CYCAPTION) - 1 /* WinXP style */
2815 ok_gsm( SM_CYSIZE, ncm.iCaptionHeight);
2816 ok_gsm( SM_CXFRAME, ncm.iBorderWidth + 3);
2817 ok_gsm( SM_CYFRAME, ncm.iBorderWidth + 3);
2818 ok_gsm( SM_CXMINTRACK, GetSystemMetrics( SM_CXMIN));
2819 ok_gsm( SM_CYMINTRACK, GetSystemMetrics( SM_CYMIN));
2820 /* SM_CXDOUBLECLK */
2821 /* SM_CYDOUBLECLK */
2822 if( IconSpacing) ok_gsm( SM_CXICONSPACING, IconSpacing);
2823 if( IconVerticalSpacing) ok_gsm( SM_CYICONSPACING, IconVerticalSpacing);
2824 /* SM_MENUDROPALIGNMENT */
2825 /* SM_PENWINDOWS */
2826 /* SM_DBCSENABLED */
2827 /* SM_CMOUSEBUTTONS */
2828 /* SM_SECURE */
2829 ok_gsm( SM_CXEDGE, 2);
2830 ok_gsm( SM_CYEDGE, 2);
2831 /* sign-extension for iHorzGap/iVertGap is broken on Win9x */
2832 ok_gsm( SM_CXMINSPACING, GetSystemMetrics( SM_CXMINIMIZED) + (short)minim.iHorzGap );
2833 ok_gsm( SM_CYMINSPACING, GetSystemMetrics( SM_CYMINIMIZED) + (short)minim.iVertGap );
2835 smicon = MulDiv( 16, dpi, USER_DEFAULT_SCREEN_DPI );
2836 if (!pIsProcessDPIAware || pIsProcessDPIAware())
2837 smicon = max( min( smicon, CaptionWidthfromreg - 2), 4 ) & ~1;
2838 todo_wine_if( real_dpi == dpi && smicon != (MulDiv( 16, dpi, USER_DEFAULT_SCREEN_DPI) & ~1) )
2840 broken_val = (min( ncm.iCaptionHeight, CaptionWidthfromreg ) - 2) & ~1;
2841 broken_val = min( broken_val, 20 );
2843 if (smicon == 4)
2845 ok_gsm_2( SM_CXSMICON, smicon, 6 );
2846 ok_gsm_2( SM_CYSMICON, smicon, 6 );
2848 else if (smicon < broken_val)
2850 ok_gsm_2( SM_CXSMICON, smicon, broken_val );
2851 ok_gsm_2( SM_CYSMICON, smicon, broken_val );
2853 else
2855 ok_gsm( SM_CXSMICON, smicon );
2856 ok_gsm( SM_CYSMICON, smicon );
2860 ok_gsm( SM_CYSMCAPTION, ncm.iSmCaptionHeight + 1);
2861 ok_gsm_3( SM_CXSMSIZE,
2862 ncm.iSmCaptionWidth, /* classic/standard windows style */
2863 GetSystemMetrics( SM_CYSMCAPTION) - 1, /* WinXP style */
2864 smcxsmsize /* winXP seems to cache this value: setnonclientmetric
2865 does not change it */
2867 ok_gsm( SM_CYSMSIZE, GetSystemMetrics( SM_CYSMCAPTION) - 1);
2868 ok_gsm( SM_CXMENUSIZE, ncm.iMenuWidth);
2869 ok_gsm( SM_CYMENUSIZE, ncm.iMenuHeight);
2870 /* SM_ARRANGE */
2871 ok_gsm( SM_CXMINIMIZED, minim.iWidth + 6);
2872 ok_gsm( SM_CYMINIMIZED, GetSystemMetrics( SM_CYCAPTION) + 5);
2873 screen.cx = GetSystemMetrics( SM_CXVIRTUALSCREEN );
2874 screen.cy = GetSystemMetrics( SM_CYVIRTUALSCREEN );
2875 if (!screen.cx || !screen.cy) /* not supported on NT4 */
2877 screen.cx = GetSystemMetrics( SM_CXSCREEN );
2878 screen.cy = GetSystemMetrics( SM_CYSCREEN );
2880 ok_gsm_3( SM_CXMAXTRACK, screen.cx + 4 + 2 * GetSystemMetrics(SM_CXFRAME),
2881 screen.cx - 4 + 2 * GetSystemMetrics(SM_CXFRAME), /* Vista */
2882 screen.cx + 2 * GetSystemMetrics(SM_CXFRAME)); /* Win8 */
2883 ok_gsm_3( SM_CYMAXTRACK, screen.cy + 4 + 2 * GetSystemMetrics(SM_CYFRAME),
2884 screen.cy - 4 + 2 * GetSystemMetrics(SM_CYFRAME), /* Vista */
2885 screen.cy + 2 * GetSystemMetrics(SM_CYFRAME)); /* Win8 */
2886 /* the next two cannot really be tested as they depend on (application)
2887 * toolbars */
2888 /* SM_CXMAXIMIZED */
2889 /* SM_CYMAXIMIZED */
2890 /* SM_NETWORK */
2891 /* */
2892 /* */
2893 /* */
2894 /* SM_CLEANBOOT */
2895 /* SM_CXDRAG */
2896 /* SM_CYDRAG */
2897 /* SM_SHOWSOUNDS */
2898 ok_gsm( SM_CXMENUCHECK,
2899 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2900 ok_gsm( SM_CYMENUCHECK,
2901 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2902 /* SM_SLOWMACHINE */
2903 /* SM_MIDEASTENABLED */
2904 /* SM_MOUSEWHEELPRESENT */
2905 /* SM_XVIRTUALSCREEN */
2906 /* SM_YVIRTUALSCREEN */
2907 /* SM_CXVIRTUALSCREEN */
2908 /* SM_CYVIRTUALSCREEN */
2909 /* SM_CMONITORS */
2910 /* SM_SAMEDISPLAYFORMAT */
2911 /* SM_IMMENABLED */
2912 /* SM_CXFOCUSBORDER */
2913 /* SM_CYFOCUSBORDER */
2914 /* SM_TABLETPC */
2915 /* SM_MEDIACENTER */
2916 /* SM_CMETRICS */
2917 /* end of tests */
2918 if( gsm_error_ctr ) { /* if any errors where found */
2919 trace( "BorderWidth %d CaptionWidth %d CaptionHeight %d IconSpacing %d IconVerticalSpacing %d\n",
2920 ncm.iBorderWidth, ncm.iCaptionWidth, ncm.iCaptionHeight, IconSpacing, IconVerticalSpacing);
2921 trace( "MenuHeight %d MenuWidth %d ScrollHeight %d ScrollWidth %d SmCaptionHeight %d SmCaptionWidth %d\n",
2922 ncm.iMenuHeight, ncm.iMenuWidth, ncm.iScrollHeight, ncm.iScrollWidth, ncm.iSmCaptionHeight, ncm.iSmCaptionWidth);
2923 trace( "Captionfontchar width %d MenuFont %d,%d CaptionWidth from registry: %d screen %d,%d\n",
2924 avcwCaption, tmMenuFont.tmHeight, tmMenuFont.tmExternalLeading, CaptionWidthfromreg, screen.cx, screen.cy);
2927 DeleteDC(hdc);
2930 static void test_EnumDisplaySettings(void)
2932 DEVMODEA devmode;
2933 DWORD val;
2934 HDC hdc;
2935 DWORD num;
2937 memset(&devmode, 0, sizeof(devmode));
2938 /* Win95 doesn't handle ENUM_CURRENT_SETTINGS correctly */
2939 EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devmode);
2941 hdc = GetDC(0);
2942 val = GetDeviceCaps(hdc, BITSPIXEL);
2943 ok(devmode.dmBitsPerPel == val ||
2944 broken(devmode.dmDeviceName[0] == 0), /* Win95 */
2945 "GetDeviceCaps(BITSPIXEL) returned %d, EnumDisplaySettings returned %d\n",
2946 val, devmode.dmBitsPerPel);
2948 val = GetDeviceCaps(hdc, NUMCOLORS);
2949 if(devmode.dmBitsPerPel <= 8) {
2950 ok(val == 256, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode.dmBitsPerPel, val);
2951 } else {
2952 ok(val == -1, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode.dmBitsPerPel, val);
2955 ReleaseDC(0, hdc);
2957 num = 1;
2958 while (1) {
2959 SetLastError (0xdeadbeef);
2960 if (!EnumDisplaySettingsA(NULL, num, &devmode)) {
2961 DWORD le = GetLastError();
2962 ok(le == ERROR_NO_MORE_FILES ||
2963 le == ERROR_MOD_NOT_FOUND /* Win8 */ ||
2964 le == 0xdeadbeef, /* XP, 2003 */
2965 "Expected ERROR_NO_MORE_FILES, ERROR_MOD_NOT_FOUND or 0xdeadbeef, got %d for %d\n", le, num);
2966 break;
2968 num++;
2972 static void test_GetSysColorBrush(void)
2974 HBRUSH hbr;
2976 SetLastError(0xdeadbeef);
2977 hbr = GetSysColorBrush(-1);
2978 ok(hbr == NULL, "Expected NULL brush\n");
2979 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %x\n", GetLastError());
2980 /* greater than max index */
2981 hbr = GetSysColorBrush(COLOR_MENUBAR);
2982 if (hbr)
2984 SetLastError(0xdeadbeef);
2985 hbr = GetSysColorBrush(COLOR_MENUBAR + 1);
2986 ok(hbr == NULL, "Expected NULL brush\n");
2987 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %x\n", GetLastError());
2989 else
2990 win_skip("COLOR_MENUBAR unsupported\n");
2993 static void test_dpi_aware(void)
2995 BOOL ret;
2997 if (!pIsProcessDPIAware)
2999 win_skip("IsProcessDPIAware not available\n");
3000 return;
3003 if (pSetProcessDpiAwarenessContext)
3005 DPI_AWARENESS awareness;
3006 DPI_AWARENESS_CONTEXT context;
3008 context = pGetThreadDpiAwarenessContext();
3009 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3010 todo_wine
3011 ok( awareness == DPI_AWARENESS_UNAWARE, "wrong awareness %u\n", awareness );
3012 SetLastError( 0xdeadbeef );
3013 ret = pSetProcessDpiAwarenessContext( NULL );
3014 ok( !ret, "got %d\n", ret );
3015 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3016 SetLastError( 0xdeadbeef );
3017 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)-5 );
3018 ok( !ret, "got %d\n", ret );
3019 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3020 ret = pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
3021 ok( ret, "got %d\n", ret );
3022 SetLastError( 0xdeadbeef );
3023 ret = pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
3024 ok( !ret, "got %d\n", ret );
3025 ok( GetLastError() == ERROR_ACCESS_DENIED, "wrong error %u\n", GetLastError() );
3026 SetLastError( 0xdeadbeef );
3027 ret = pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
3028 ok( !ret, "got %d\n", ret );
3029 ok( GetLastError() == ERROR_ACCESS_DENIED, "wrong error %u\n", GetLastError() );
3030 ret = pIsProcessDPIAware();
3031 ok(ret, "got %d\n", ret);
3032 context = pGetThreadDpiAwarenessContext();
3033 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3034 ok( awareness == DPI_AWARENESS_SYSTEM_AWARE, "wrong awareness %u\n", awareness );
3035 SetLastError( 0xdeadbeef );
3036 context = pSetThreadDpiAwarenessContext( 0 );
3037 ok( !context, "got %p\n", context );
3038 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3039 SetLastError( 0xdeadbeef );
3040 context = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)-5 );
3041 ok( !context, "got %p\n", context );
3042 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %u\n", GetLastError() );
3043 context = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
3044 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3045 ok( awareness == DPI_AWARENESS_SYSTEM_AWARE, "wrong awareness %u\n", awareness );
3046 context = pGetThreadDpiAwarenessContext();
3047 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3048 ok( awareness == DPI_AWARENESS_UNAWARE, "wrong awareness %u\n", awareness );
3049 context = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
3050 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3051 ok( awareness == DPI_AWARENESS_UNAWARE, "wrong awareness %u\n", awareness );
3052 context = pGetThreadDpiAwarenessContext();
3053 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3054 ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
3055 context = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
3056 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3057 ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
3059 else win_skip( "SetProcessDPIAware not supported\n" );
3061 ret = pSetProcessDPIAware();
3062 ok(ret, "got %d\n", ret);
3064 ret = pIsProcessDPIAware();
3065 ok(ret, "got %d\n", ret);
3067 dpi = real_dpi;
3068 test_GetSystemMetrics();
3071 static void test_window_dpi(void)
3073 DPI_AWARENESS_CONTEXT context, orig;
3074 DPI_AWARENESS awareness;
3075 HWND hwnd;
3077 if (!pGetWindowDpiAwarenessContext)
3079 win_skip( "GetWindowDpiAwarenessContext not supported\n" );
3080 return;
3082 orig = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
3083 hwnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
3084 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
3085 ok( hwnd != 0, "failed to create window\n" );
3086 context = GetWindowDpiAwarenessContext( hwnd );
3087 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3088 ok( awareness == DPI_AWARENESS_UNAWARE, "wrong awareness %u\n", awareness );
3089 DestroyWindow( hwnd );
3091 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
3092 hwnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
3093 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
3094 ok( hwnd != 0, "failed to create window\n" );
3095 context = GetWindowDpiAwarenessContext( hwnd );
3096 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3097 ok( awareness == DPI_AWARENESS_SYSTEM_AWARE, "wrong awareness %u\n", awareness );
3098 DestroyWindow( hwnd );
3100 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
3101 hwnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
3102 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
3103 ok( hwnd != 0, "failed to create window\n" );
3104 context = GetWindowDpiAwarenessContext( hwnd );
3105 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3106 ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
3107 DestroyWindow( hwnd );
3109 SetLastError( 0xdeadbeef );
3110 context = GetWindowDpiAwarenessContext( (HWND)0xdeadbeef );
3111 ok( !context, "got %p\n", context );
3112 ok( GetLastError() == ERROR_INVALID_WINDOW_HANDLE, "wrong error %u\n", GetLastError() );
3114 SetLastError( 0xdeadbeef );
3115 context = GetWindowDpiAwarenessContext( GetDesktopWindow() );
3116 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3117 ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
3119 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
3120 SetLastError( 0xdeadbeef );
3121 context = GetWindowDpiAwarenessContext( GetDesktopWindow() );
3122 awareness = pGetAwarenessFromDpiAwarenessContext( context );
3123 ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
3125 pSetThreadDpiAwarenessContext( orig );
3128 START_TEST(sysparams)
3130 int argc;
3131 char** argv;
3132 WNDCLASSA wc;
3133 MSG msg;
3134 HANDLE hThread;
3135 DWORD dwThreadId;
3136 HANDLE hInstance, hdll;
3138 hdll = GetModuleHandleA("user32.dll");
3139 pChangeDisplaySettingsExA = (void*)GetProcAddress(hdll, "ChangeDisplaySettingsExA");
3140 pIsProcessDPIAware = (void*)GetProcAddress(hdll, "IsProcessDPIAware");
3141 pSetProcessDPIAware = (void*)GetProcAddress(hdll, "SetProcessDPIAware");
3142 pSetProcessDpiAwarenessContext = (void*)GetProcAddress(hdll, "SetProcessDpiAwarenessContext");
3143 pGetThreadDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetThreadDpiAwarenessContext");
3144 pSetThreadDpiAwarenessContext = (void*)GetProcAddress(hdll, "SetThreadDpiAwarenessContext");
3145 pGetWindowDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetWindowDpiAwarenessContext");
3146 pGetAwarenessFromDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetAwarenessFromDpiAwarenessContext");
3148 hInstance = GetModuleHandleA( NULL );
3149 hdc = GetDC(0);
3150 dpi = GetDeviceCaps( hdc, LOGPIXELSY);
3151 real_dpi = get_real_dpi();
3152 trace("dpi %d real_dpi %d\n", dpi, real_dpi);
3153 iswin9x = GetVersion() & 0x80000000;
3155 /* This test requires interactivity, if we don't have it, give up */
3156 if (!SystemParametersInfoA( SPI_SETBEEP, TRUE, 0, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE ) &&
3157 GetLastError()==ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION) return;
3159 argc = winetest_get_mainargs(&argv);
3160 strict=(argc >= 3 && strcmp(argv[2],"strict")==0);
3161 trace("strict=%d\n",strict);
3163 trace("testing GetSystemMetrics with your current desktop settings\n");
3164 test_GetSystemMetrics( );
3165 trace("testing EnumDisplaySettings vs GetDeviceCaps\n");
3166 test_EnumDisplaySettings( );
3167 test_GetSysColorBrush( );
3169 change_counter = 0;
3170 change_last_param = 0;
3172 wc.lpszClassName = "SysParamsTestClass";
3173 wc.lpfnWndProc = SysParamsTestWndProc;
3174 wc.style = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
3175 wc.hInstance = hInstance;
3176 wc.hIcon = LoadIconA( 0, (LPCSTR)IDI_APPLICATION );
3177 wc.hCursor = LoadCursorA( 0, (LPCSTR)IDC_ARROW );
3178 wc.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
3179 wc.lpszMenuName = 0;
3180 wc.cbClsExtra = 0;
3181 wc.cbWndExtra = 0;
3182 RegisterClassA( &wc );
3184 ghTestWnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
3185 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, NULL );
3187 hThread = CreateThread( NULL, 0, SysParamsThreadFunc, 0, 0, &dwThreadId );
3188 assert( hThread );
3189 CloseHandle( hThread );
3191 while( GetMessageA( &msg, 0, 0, 0 )) {
3192 TranslateMessage( &msg );
3193 DispatchMessageA( &msg );
3195 ReleaseDC( 0, hdc);
3197 test_dpi_aware();
3198 test_window_dpi();