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 */
29 #include "wine/test.h"
37 #ifndef SPI_GETDESKWALLPAPER
38 # define SPI_GETDESKWALLPAPER 0x0073
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
);
51 static int dpi
, real_dpi
;
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
,
168 static int change_counter
;
169 static int change_setworkarea_param
, change_iconverticalspacing_param
;
170 static int change_last_param
;
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
)
178 DWORD type
, data
, size
= sizeof(data
);
181 if (RegOpenKeyA(base
, key_name
, &key
) == ERROR_SUCCESS
)
183 if (RegQueryValueExA(key
, value_name
, NULL
, &type
, (void *)&data
, &size
) == ERROR_SUCCESS
&&
194 static DWORD
get_real_dpi(void)
198 if (get_reg_dword(HKEY_CURRENT_USER
, "Control Panel\\Desktop", "LogPixels", &dpi
))
200 if (get_reg_dword(HKEY_CURRENT_CONFIG
, "Software\\Fonts", "LogPixels", &dpi
))
202 return USER_DEFAULT_SCREEN_DPI
;
205 static LRESULT CALLBACK
SysParamsTestWndProc( HWND hWnd
, UINT msg
, WPARAM wParam
,
210 case WM_DISPLAYCHANGE
:
211 ok(displaychange_ok
, "Unexpected WM_DISPLAYCHANGE message\n");
213 displaychange_ok
= FALSE
;
214 ReleaseSemaphore(displaychange_sem
, 1, 0);
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;
223 } else if( wParam
== SPI_ICONVERTICALSPACING
) {
224 change_iconverticalspacing_param
= 1;
226 } else if( displaychange_test_active
)
228 if( !change_last_param
){
229 change_last_param
= wParam
;
232 ok(0,"too many changes counter=%d last change=%d\n",
233 change_counter
,change_last_param
);
235 change_last_param
= wParam
;
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;
245 change_last_param
= wParam
;
249 PostQuitMessage( 0 );
254 return( DefWindowProcA( hWnd
, msg
, wParam
, lParam
) );
261 Performs testing for system parameters messages
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)
270 ok( 1 == change_counter
,
271 "Missed a message: change_counter=%d\n", change_counter
);
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();
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
);
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
);
303 ok(rc
!=0,"SystemParametersInfoA: rc=%d err=%d\n",rc
,last_error
);
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
];
323 valueLen
=sizeof(value
);
324 RegOpenKeyA( HKEY_CURRENT_USER
, subKey1
, &hKey
);
325 rc
=RegQueryValueExA( hKey
, valName1
, NULL
, &type
, (LPBYTE
)value
, &valueLen
);
327 if (rc
==ERROR_SUCCESS
)
329 ok( type
== exp_type
, "wrong type %u/%u\n", type
, exp_type
);
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
);
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
);
347 ok(0,"Missing registry entry: subKey=%s, valName=%s\n",
353 valueLen
=sizeof(value
);
354 RegOpenKeyA( HKEY_CURRENT_USER
, subKey1
, &hKey
);
355 rc
=RegQueryValueExA( hKey
, valName2
, NULL
, &type
, (LPBYTE
)value
, &valueLen
);
357 if (rc
==ERROR_SUCCESS
)
359 ok( type
== exp_type
, "wrong type %u/%u\n", type
, exp_type
);
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
);
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
);
377 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
381 if (subKey2
&& !strict
)
384 valueLen
=sizeof(value
);
385 RegOpenKeyA( HKEY_CURRENT_USER
, subKey2
, &hKey
);
386 rc
=RegQueryValueExA( hKey
, valName1
, NULL
, &type
, (LPBYTE
)value
, &valueLen
);
388 if (rc
==ERROR_SUCCESS
)
390 ok( type
== exp_type
, "wrong type %u/%u\n", type
, exp_type
);
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
);
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
);
408 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
414 valueLen
=sizeof(value
);
415 RegOpenKeyA( HKEY_CURRENT_USER
, subKey2
, &hKey
);
416 rc
=RegQueryValueExA( hKey
, valName2
, NULL
, &type
, (LPBYTE
)value
, &valueLen
);
418 if (rc
==ERROR_SUCCESS
)
420 ok( type
== exp_type
, "wrong type %u/%u\n", type
, exp_type
);
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
);
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
);
438 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
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
)
471 RegOpenKeyA( HKEY_CURRENT_USER
, keyname
, &hkey
);
473 ret
=RegQueryValueExA( hkey
, valname
, NULL
, &type
, (LPBYTE
)buf
, &size
);
475 if( ret
!= ERROR_SUCCESS
) return -1;
478 value
= ( -value
* dpi
+ 720) / 1440;
494 BYTE lfClipPrecision
;
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
)
505 DWORD ret
, size
, type
;
507 RegOpenKeyA( HKEY_CURRENT_USER
, keyname
, &hkey
);
509 ret
=RegQueryValueExA( hkey
, valname
, NULL
, &type
, (LPBYTE
)&lfw
, &size
);
511 ok( ret
== ERROR_SUCCESS
, "Key \"%s\" value \"%s\" not found\n", keyname
, valname
);
512 if( ret
!= ERROR_SUCCESS
)
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
;
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
);
553 static void test_SPI_SETBEEP( void ) /* 2 */
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"))
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
,
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 );
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
,
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
)
626 static int aw_turn
= 0;
627 static BOOL w_implemented
= TRUE
;
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
]);
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
]);
682 /* FIXME: this always fails for me - AJ */
683 for (i
= 0; i
< nchange
; i
++)
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 );
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" );
696 static void test_SPI_SETMOUSE( void ) /* 4 */
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"))
723 if (!run_spi_setmouse_test( curr_val
, req_change
, proj_change1
, nchange
)) return;
725 /* acceleration change */
727 run_spi_setmouse_test( curr_val
, req_change
, proj_change2
, nchange
);
729 /* acceleration change */
731 run_spi_setmouse_test( curr_val
, req_change
, proj_change3
, nchange
);
733 /* acceleration change */
735 run_spi_setmouse_test( curr_val
, req_change
, proj_change4
, nchange
);
737 /* threshold change */
740 run_spi_setmouse_test( curr_val
, req_change
, proj_change5
, nchange
);
742 /* threshold change */
746 run_spi_setmouse_test( curr_val
, req_change
, proj_change6
, nchange
);
748 /* threshold change */
750 run_spi_setmouse_test( curr_val
, req_change
, proj_change7
, nchange
);
752 /* threshold change */
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
)
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());
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
|
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" );
808 static void test_SPI_SETBORDER( void ) /* 6 */
812 NONCLIENTMETRICSA ncmsave
;
816 ncmsave
.cbSize
= FIELD_OFFSET(NONCLIENTMETRICSA
, iPaddedBorderWidth
);
817 rc
=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS
, 0, &ncmsave
, 0);
819 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
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
833 if (FindWindowA( NULL
, "Cygwin/XFree86" ))
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"))
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",
849 /* This will restore sane values if the test hang previous run. */
850 if ( old_border
== 7 || old_border
== 20 )
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
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 */
876 const UINT vals
[]={0,20,31};
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"))
885 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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
)
911 INT spacing
, regval
, min_val
= MulDiv( 32, dpi
, USER_DEFAULT_SCREEN_DPI
);
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" );
942 static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */
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"))
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 */
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 */
965 const UINT vals
[]={0,32767};
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"))
974 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
1002 const UINT vals
[]={TRUE
,FALSE
};
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"))
1011 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
1039 static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */
1043 const UINT vals
[]={0,3};
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"))
1052 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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
)
1080 INT spacing
, regval
, min_val
= MulDiv( 32, dpi
, USER_DEFAULT_SCREEN_DPI
);
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" );
1111 static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */
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"))
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);
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 */
1136 const UINT vals
[]={TRUE
,FALSE
};
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
1144 if (FindWindowA( NULL
, "Cygwin/XFree86" ))
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"))
1153 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
1189 const UINT vals
[]={TRUE
,FALSE
};
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"))
1198 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
1228 const UINT vals
[]={0,10000};
1231 trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
1232 old_width
= GetSystemMetrics( SM_CXDOUBLECLK
);
1234 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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"))
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 */
1262 const UINT vals
[]={0,10000};
1265 trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
1266 old_height
= GetSystemMetrics( SM_CYDOUBLECLK
);
1268 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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"))
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 */
1300 trace("testing SPI_{GET,SET}DOUBLECLICKTIME\n");
1301 old_time
= GetDoubleClickTime();
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"))
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" );
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
;
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" );
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 */
1352 const UINT vals
[]={TRUE
,FALSE
};
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 */
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"))
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 */
1402 const UINT vals
[]={TRUE
,FALSE
};
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"))
1413 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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) \
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) \
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) \
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
)
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 */
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");
1505 SetLastError(0xdeadbeef);
1506 rc
=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS
, sizeof(NONCLIENTMETRICSA
), &Ncmorig
, FALSE
);
1507 if (!test_error_msg(rc
,"SPI_{GET,SET}NONCLIENTMETRICS"))
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 */
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
|
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 );
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*/
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
|
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
)
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();
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 */
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"))
1630 /* Test registry. Note that it is perfectly valid for some fields to
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());
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" );
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());
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" );
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" );
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());
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 */
1743 ICONMETRICSA im_orig
;
1744 ICONMETRICSA im_new
;
1745 ICONMETRICSA im_cur
;
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"))
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) */
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");
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 */
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"))
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
);
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 */
1914 const UINT vals
[]={TRUE
,FALSE
};
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"))
1924 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
1952 const UINT vals
[]={TRUE
,FALSE
};
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"))
1961 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
1987 const UINT vals
[]={TRUE
,FALSE
};
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"))
1996 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
2022 DWORD old_type
, old_contrast
, old_orient
;
2023 const UINT vals
[]={0xffffffff,0,1,2};
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"))
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
++)
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 */
2104 const UINT vals
[]={TRUE
,FALSE
};
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"))
2113 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
2128 rc
=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE
, 0, &v
, 0 );
2129 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
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 */
2144 const UINT vals
[]={TRUE
,FALSE
};
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"))
2153 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
2168 rc
=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE
, 0, &v
, 0 );
2169 ok(rc
, "%d: rc=%d err=%d\n", i
, rc
, GetLastError());
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 */
2184 const UINT vals
[]={TRUE
,FALSE
};
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"))
2193 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
2219 const UINT vals
[]={0,32767};
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"))
2231 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
2259 const UINT vals
[]={0,32767};
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"))
2271 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
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};
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"))
2315 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
2343 const UINT vals
[]={0,32767};
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"))
2354 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
2382 const UINT vals
[]={0,32767};
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"))
2393 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
2421 const UINT vals
[]={32767,0};
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"))
2432 for (i
=0;i
<sizeof(vals
)/sizeof(*vals
);i
++)
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 */
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"))
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
;
2490 if (!pChangeDisplaySettingsExA
)
2492 win_skip("ChangeDisplaySettingsExA is not available\n");
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
++) {
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
])
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
);
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 );
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
)
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
;
2644 if( !ptm
) ptm
= &tm
;
2645 hfont
= CreateFontIndirectA( plf
);
2646 if( !hfont
|| ( hfontsav
= SelectObject( hdc
, hfont
)) == NULL
) {
2649 if( hfont
) DeleteObject( hfont
);
2652 GetTextMetricsA( hdc
, ptm
);
2654 if( !(*psz
= _GdiGetCharDimensions( hdc
, ptm
, NULL
)))
2656 SelectObject( hdc
, hfontsav
);
2657 DeleteObject( hfont
);
2660 static int gsm_error_ctr
;
2662 #define ok_gsm( i, 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)\
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)\
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);
2697 if (!EnumFontFamiliesA(hdc
, NULL
, enum_all_fonts_proc
, (LPARAM
)name
))
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;
2712 static void test_GetSystemMetrics( void)
2714 TEXTMETRICA tmMenuFont
;
2715 UINT IconSpacing
, IconVerticalSpacing
;
2718 HDC hdc
= CreateICA( "Display", 0, 0, 0);
2720 INT CaptionWidthfromreg
, smicon
, broken_val
;
2721 MINIMIZEDMETRICS minim
;
2722 NONCLIENTMETRICSA ncm
;
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);
2750 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
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 ))
2771 /* reset error counters */
2776 /* SM_CXSCREEN, cannot test these two */
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
);
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 */
2826 /* SM_DBCSENABLED */
2827 /* SM_CMOUSEBUTTONS */
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 );
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
);
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
);
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)
2888 /* SM_CXMAXIMIZED */
2889 /* SM_CYMAXIMIZED */
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 */
2910 /* SM_SAMEDISPLAYFORMAT */
2912 /* SM_CXFOCUSBORDER */
2913 /* SM_CYFOCUSBORDER */
2915 /* SM_MEDIACENTER */
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
);
2930 static void test_EnumDisplaySettings(void)
2937 memset(&devmode
, 0, sizeof(devmode
));
2938 /* Win95 doesn't handle ENUM_CURRENT_SETTINGS correctly */
2939 EnumDisplaySettingsA(NULL
, ENUM_CURRENT_SETTINGS
, &devmode
);
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
);
2952 ok(val
== -1, "Screen bpp is %d, NUMCOLORS returned %d\n", devmode
.dmBitsPerPel
, val
);
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
);
2972 static void test_GetSysColorBrush(void)
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
);
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());
2990 win_skip("COLOR_MENUBAR unsupported\n");
2993 static void test_dpi_aware(void)
2997 if (!pIsProcessDPIAware
)
2999 win_skip("IsProcessDPIAware not available\n");
3003 if (pSetProcessDpiAwarenessContext
)
3005 DPI_AWARENESS awareness
;
3006 DPI_AWARENESS_CONTEXT context
;
3008 context
= pGetThreadDpiAwarenessContext();
3009 awareness
= pGetAwarenessFromDpiAwarenessContext( context
);
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
);
3068 test_GetSystemMetrics();
3071 static void test_window_dpi(void)
3073 DPI_AWARENESS_CONTEXT context
, orig
;
3074 DPI_AWARENESS awareness
;
3077 if (!pGetWindowDpiAwarenessContext
)
3079 win_skip( "GetWindowDpiAwarenessContext not supported\n" );
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
= pGetWindowDpiAwarenessContext( 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
= pGetWindowDpiAwarenessContext( 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
= pGetWindowDpiAwarenessContext( 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
= pGetWindowDpiAwarenessContext( (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
= pGetWindowDpiAwarenessContext( 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
= pGetWindowDpiAwarenessContext( 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
)
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
);
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( );
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;
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
);
3189 CloseHandle( hThread
);
3191 while( GetMessageA( &msg
, 0, 0, 0 )) {
3192 TranslateMessage( &msg
);
3193 DispatchMessageA( &msg
);