ReactOS 0.4.16-dev-2491-g3dc6630
sysparams.c
Go to the documentation of this file.
1/* Unit test suite for functions SystemParametersInfo and GetSystemMetrics.
2 *
3 * Copyright 2002 Andriy Palamarchuk
4 *
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.
9 *
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.
14 *
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
18 */
19
20#include <assert.h>
21#include <stdlib.h>
22#include <stdarg.h>
23#include <stdio.h>
24
25#include "wine/test.h"
26#include "windef.h"
27#include "winbase.h"
28#include "wingdi.h"
29#include "winreg.h"
30#include "winuser.h"
31#include "winnls.h"
32
33static BOOL (WINAPI *pIsProcessDPIAware)(void);
34static BOOL (WINAPI *pSetProcessDPIAware)(void);
35static BOOL (WINAPI *pSetProcessDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
36static BOOL (WINAPI *pGetProcessDpiAwarenessInternal)(HANDLE,DPI_AWARENESS*);
37static BOOL (WINAPI *pSetProcessDpiAwarenessInternal)(DPI_AWARENESS);
38static UINT (WINAPI *pGetDpiForSystem)(void);
39static UINT (WINAPI *pGetDpiForWindow)(HWND);
40static BOOL (WINAPI *pGetDpiForMonitorInternal)(HMONITOR,UINT,UINT*,UINT*);
41static DPI_AWARENESS_CONTEXT (WINAPI *pGetThreadDpiAwarenessContext)(void);
42static DPI_AWARENESS_CONTEXT (WINAPI *pSetThreadDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
43static DPI_AWARENESS_CONTEXT (WINAPI *pGetWindowDpiAwarenessContext)(HWND);
44static DPI_AWARENESS (WINAPI *pGetAwarenessFromDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
45static BOOL (WINAPI *pIsValidDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
46static INT (WINAPI *pGetSystemMetricsForDpi)(INT,UINT);
47static BOOL (WINAPI *pSystemParametersInfoForDpi)(UINT,UINT,void*,UINT,UINT);
48static BOOL (WINAPI *pAdjustWindowRectExForDpi)(LPRECT,DWORD,BOOL,DWORD,UINT);
49static BOOL (WINAPI *pLogicalToPhysicalPointForPerMonitorDPI)(HWND,POINT*);
50static BOOL (WINAPI *pPhysicalToLogicalPointForPerMonitorDPI)(HWND,POINT*);
51static LONG (WINAPI *pGetAutoRotationState)(PAR_STATE);
52static BOOL (WINAPI *pAreDpiAwarenessContextsEqual)(DPI_AWARENESS_CONTEXT,DPI_AWARENESS_CONTEXT);
53static LONG (WINAPI *pGetDpiFromDpiAwarenessContext)(DPI_AWARENESS_CONTEXT);
54
55static BOOL strict;
56static int dpi, real_dpi;
57
58#define eq(received, expected, label, type) \
59 ok((received) == (expected), "%s: got " type " instead of " type "\n", (label),(received),(expected))
60
61
62#define SPI_SETBEEP_REGKEY "Control Panel\\Sound"
63#define SPI_SETBEEP_VALNAME "Beep"
64#define SPI_SETMOUSE_REGKEY "Control Panel\\Mouse"
65#define SPI_SETMOUSE_VALNAME1 "MouseThreshold1"
66#define SPI_SETMOUSE_VALNAME2 "MouseThreshold2"
67#define SPI_SETMOUSE_VALNAME3 "MouseSpeed"
68#define SPI_SETBORDER_REGKEY "Control Panel\\Desktop\\WindowMetrics"
69#define SPI_SETBORDER_REGKEY2 "Control Panel\\Desktop"
70#define SPI_SETBORDER_VALNAME "BorderWidth"
71#define SPI_METRIC_REGKEY "Control Panel\\Desktop\\WindowMetrics"
72#define SPI_SCROLLWIDTH_VALNAME "ScrollWidth"
73#define SPI_SCROLLHEIGHT_VALNAME "ScrollHeight"
74#define SPI_CAPTIONWIDTH_VALNAME "CaptionWidth"
75#define SPI_CAPTIONHEIGHT_VALNAME "CaptionHeight"
76#define SPI_CAPTIONFONT_VALNAME "CaptionFont"
77#define SPI_SMCAPTIONWIDTH_VALNAME "SmCaptionWidth"
78#define SPI_SMCAPTIONHEIGHT_VALNAME "SmCaptionHeight"
79#define SPI_SMCAPTIONFONT_VALNAME "SmCaptionFont"
80#define SPI_MENUWIDTH_VALNAME "MenuWidth"
81#define SPI_MENUHEIGHT_VALNAME "MenuHeight"
82#define SPI_MENUFONT_VALNAME "MenuFont"
83#define SPI_STATUSFONT_VALNAME "StatusFont"
84#define SPI_MESSAGEFONT_VALNAME "MessageFont"
85
86#define SPI_SETKEYBOARDSPEED_REGKEY "Control Panel\\Keyboard"
87#define SPI_SETKEYBOARDSPEED_VALNAME "KeyboardSpeed"
88#define SPI_ICONHORIZONTALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
89#define SPI_ICONHORIZONTALSPACING_REGKEY2 "Control Panel\\Desktop"
90#define SPI_ICONHORIZONTALSPACING_VALNAME "IconSpacing"
91#define SPI_ICONVERTICALSPACING_REGKEY "Control Panel\\Desktop\\WindowMetrics"
92#define SPI_ICONVERTICALSPACING_REGKEY2 "Control Panel\\Desktop"
93#define SPI_ICONVERTICALSPACING_VALNAME "IconVerticalSpacing"
94#define SPI_MINIMIZEDMETRICS_REGKEY "Control Panel\\Desktop\\WindowMetrics"
95#define SPI_MINWIDTH_VALNAME "MinWidth"
96#define SPI_MINHORZGAP_VALNAME "MinHorzGap"
97#define SPI_MINVERTGAP_VALNAME "MinVertGap"
98#define SPI_MINARRANGE_VALNAME "MinArrange"
99#define SPI_SETSCREENSAVETIMEOUT_REGKEY "Control Panel\\Desktop"
100#define SPI_SETSCREENSAVETIMEOUT_VALNAME "ScreenSaveTimeOut"
101#define SPI_SETSCREENSAVEACTIVE_REGKEY "Control Panel\\Desktop"
102#define SPI_SETSCREENSAVEACTIVE_VALNAME "ScreenSaveActive"
103#define SPI_SETGRIDGRANULARITY_REGKEY "Control Panel\\Desktop"
104#define SPI_SETGRIDGRANULARITY_VALNAME "GridGranularity"
105#define SPI_SETKEYBOARDDELAY_REGKEY "Control Panel\\Keyboard"
106#define SPI_SETKEYBOARDDELAY_VALNAME "KeyboardDelay"
107#define SPI_SETICONTITLEWRAP_REGKEY1 "Control Panel\\Desktop\\WindowMetrics"
108#define SPI_SETICONTITLEWRAP_REGKEY2 "Control Panel\\Desktop"
109#define SPI_SETICONTITLEWRAP_VALNAME "IconTitleWrap"
110#define SPI_SETMENUDROPALIGNMENT_REGKEY1 "Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows"
111#define SPI_SETMENUDROPALIGNMENT_REGKEY2 "Control Panel\\Desktop"
112#define SPI_SETMENUDROPALIGNMENT_VALNAME "MenuDropAlignment"
113#define SPI_SETDOUBLECLKWIDTH_REGKEY1 "Control Panel\\Mouse"
114#define SPI_SETDOUBLECLKWIDTH_REGKEY2 "Control Panel\\Desktop"
115#define SPI_SETDOUBLECLKWIDTH_VALNAME "DoubleClickWidth"
116#define SPI_SETDOUBLECLKHEIGHT_REGKEY1 "Control Panel\\Mouse"
117#define SPI_SETDOUBLECLKHEIGHT_REGKEY2 "Control Panel\\Desktop"
118#define SPI_SETDOUBLECLKHEIGHT_VALNAME "DoubleClickHeight"
119#define SPI_SETDOUBLECLICKTIME_REGKEY "Control Panel\\Mouse"
120#define SPI_SETDOUBLECLICKTIME_VALNAME "DoubleClickSpeed"
121#define SPI_SETMOUSEBUTTONSWAP_REGKEY "Control Panel\\Mouse"
122#define SPI_SETMOUSEBUTTONSWAP_VALNAME "SwapMouseButtons"
123#define SPI_SETWORKAREA_REGKEY "Control Panel\\Desktop"
124#define SPI_SETWORKAREA_VALNAME "WINE_WorkArea"
125#define SPI_SETSHOWSOUNDS_REGKEY "Control Panel\\Accessibility\\ShowSounds"
126#define SPI_SETSHOWSOUNDS_VALNAME "On"
127#define SPI_SETKEYBOARDPREF_REGKEY "Control Panel\\Accessibility\\Keyboard Preference"
128#define SPI_SETKEYBOARDPREF_VALNAME "On"
129#define SPI_SETKEYBOARDPREF_REGKEY_LEGACY "Control Panel\\Accessibility"
130#define SPI_SETKEYBOARDPREF_VALNAME_LEGACY "Keyboard Preference"
131#define SPI_SETSCREENREADER_REGKEY "Control Panel\\Accessibility\\Blind Access"
132#define SPI_SETSCREENREADER_VALNAME "On"
133#define SPI_SETSCREENREADER_REGKEY_LEGACY "Control Panel\\Accessibility"
134#define SPI_SETSCREENREADER_VALNAME_LEGACY "Blind Access"
135#define SPI_SETFONTSMOOTHING_REGKEY "Control Panel\\Desktop"
136#define SPI_SETFONTSMOOTHING_VALNAME "FontSmoothing"
137#define SPI_SETFONTSMOOTHINGTYPE_VALNAME "FontSmoothingType"
138#define SPI_SETFONTSMOOTHINGCONTRAST_VALNAME "FontSmoothingGamma"
139#define SPI_SETFONTSMOOTHINGORIENTATION_VALNAME "FontSmoothingOrientation"
140#define SPI_SETLOWPOWERACTIVE_REGKEY "Control Panel\\Desktop"
141#define SPI_SETLOWPOWERACTIVE_VALNAME "LowPowerActive"
142#define SPI_SETPOWEROFFACTIVE_REGKEY "Control Panel\\Desktop"
143#define SPI_SETPOWEROFFACTIVE_VALNAME "PowerOffActive"
144#define SPI_SETDRAGFULLWINDOWS_REGKEY "Control Panel\\Desktop"
145#define SPI_SETDRAGFULLWINDOWS_VALNAME "DragFullWindows"
146#define SPI_SETSNAPTODEFBUTTON_REGKEY "Control Panel\\Mouse"
147#define SPI_SETSNAPTODEFBUTTON_VALNAME "SnapToDefaultButton"
148#define SPI_SETMOUSEHOVERWIDTH_REGKEY "Control Panel\\Mouse"
149#define SPI_SETMOUSEHOVERWIDTH_VALNAME "MouseHoverWidth"
150#define SPI_SETMOUSEHOVERHEIGHT_REGKEY "Control Panel\\Mouse"
151#define SPI_SETMOUSEHOVERHEIGHT_VALNAME "MouseHoverHeight"
152#define SPI_SETMOUSEHOVERTIME_REGKEY "Control Panel\\Mouse"
153#define SPI_SETMOUSEHOVERTIME_VALNAME "MouseHoverTime"
154#define SPI_SETMOUSESCROLLCHARS_REGKEY "Control Panel\\Desktop"
155#define SPI_SETMOUSESCROLLCHARS_VALNAME "WheelScrollChars"
156#define SPI_SETMOUSESCROLLLINES_REGKEY "Control Panel\\Desktop"
157#define SPI_SETMOUSESCROLLLINES_VALNAME "WheelScrollLines"
158#define SPI_SETMENUSHOWDELAY_REGKEY "Control Panel\\Desktop"
159#define SPI_SETMENUSHOWDELAY_VALNAME "MenuShowDelay"
160#define SPI_SETDESKWALLPAPER_REGKEY "Control Panel\\Desktop"
161#define SPI_SETDESKWALLPAPER_VALNAME "Wallpaper"
162
163/* volatile registry branch under CURRENT_USER_REGKEY for temporary values storage */
164#define WINE_CURRENT_USER_REGKEY "Wine"
165
167
168static DWORD WINAPI SysParamsThreadFunc( LPVOID lpParam );
170 LPARAM lParam );
171static int change_counter;
173static int last_bpp;
176
177#define run_in_process( a, b ) run_in_process_( __FILE__, __LINE__, a, b )
178static void run_in_process_( const char *file, int line, char **argv, const char *args )
179{
180 STARTUPINFOA startup = {.cb = sizeof(STARTUPINFOA)};
182 char cmdline[MAX_PATH * 2];
183 DWORD ret;
184
185 sprintf( cmdline, "%s %s %s", argv[0], argv[1], args );
187 ok_(file, line)( ret, "CreateProcessA failed, error %lu\n", GetLastError() );
188 if (!ret) return;
189
190 wait_child_process( info.hProcess );
191 CloseHandle( info.hThread );
192 CloseHandle( info.hProcess );
193}
194
195static BOOL get_reg_dword(HKEY base, const char *key_name, const char *value_name, DWORD *value)
196{
197 HKEY key;
198 DWORD type, data, size = sizeof(data);
199 BOOL ret = FALSE;
200
202 {
203 if (RegQueryValueExA(key, value_name, NULL, &type, (void *)&data, &size) == ERROR_SUCCESS &&
204 type == REG_DWORD)
205 {
206 *value = data;
207 ret = TRUE;
208 }
210 }
211 return ret;
212}
213
214static DWORD get_real_dpi(void)
215{
217 DWORD dpi;
218
219 if (pSetThreadDpiAwarenessContext)
220 {
221 ctx = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
222 ok( ctx == (DPI_AWARENESS_CONTEXT)0x80006010, "got %p\n", ctx );
223 dpi = pGetDpiForSystem();
224 ok( dpi, "GetDpiForSystem failed\n" );
225 /* restore process-wide DPI awareness context */
226 ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80006010 );
227 ok( ctx == (DPI_AWARENESS_CONTEXT)((UINT_PTR)0x11 | (dpi << 8)), "got %p\n", ctx );
228 return dpi;
229 }
230 if (get_reg_dword(HKEY_CURRENT_USER, "Control Panel\\Desktop", "LogPixels", &dpi))
231 return dpi;
232 if (get_reg_dword(HKEY_CURRENT_CONFIG, "Software\\Fonts", "LogPixels", &dpi))
233 return dpi;
235}
236
238 LPARAM lParam )
239{
240 switch (msg) {
241
242 case WM_DISPLAYCHANGE:
243 ok(displaychange_ok, "Unexpected WM_DISPLAYCHANGE message\n");
247 break;
248
249 case WM_SETTINGCHANGE:
250 if (wParam == SPI_SETHANDEDNESS) break; /* ignore */
252 if (displaychange_test_active) break;
254 else if (change_last_param != wParam)
255 {
256 switch (wParam)
257 {
258 /* ignore these messages when caused by other actions */
260 case SPI_SETWORKAREA:
261#ifdef __REACTOS__
262 case SPI_SETBORDER: /* WS03 */
263 case SPI_SETNONCLIENTMETRICS: /* WS03 */
264#endif
265 break;
266 default:
267 ok( 0, "too many changes counter=%d last change=%Iu\n", change_counter, wParam );
268 break;
269 }
270 }
271 break;
272
273 case WM_DESTROY:
274 PostQuitMessage( 0 );
275 break;
276
277 /* drop through */
278 default:
279 return( DefWindowProcA( hWnd, msg, wParam, lParam ) );
280 }
281
282 return 0;
283}
284
285/*
286Performs testing for system parameters messages
287params:
288 - system parameter id
289 - supposed value of the registry key
290*/
291static void test_change_message( int action, int optional )
292{
294 if (change_counter==0 && optional==1)
295 return;
296 ok( change_counter >= 1, "Missed a message: change_counter=%d\n", change_counter );
297 change_counter = 0;
298#ifdef __REACTOS__
299 ok( action == change_last_param || broken(action == SPI_SETBORDER) || broken(action == SPI_SETNONCLIENTMETRICS), "Wrong action got %d expected %d\n", change_last_param, action );
300#else
301 ok( action == change_last_param, "Wrong action got %d expected %d\n", change_last_param, action );
302#endif
304}
305
306static void flush_change_messages(void)
307{
308 change_counter = 0;
310 change_counter = 0;
311}
312
313static BOOL test_error_msg ( int rc, const char *name )
314{
316
317 if (rc==0)
318 {
320 {
321 skip("%s not supported on this platform\n", name);
322 }
324 {
325 skip("%s does not have privileges to run\n", name);
326 }
327 else
328 {
329 trace("%s failed for reason: %ld. Indicating test failure and skipping remainder of test\n",name,last_error);
330 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,last_error);
331 }
332 return FALSE;
333 }
334 else
335 {
336 ok(rc!=0,"SystemParametersInfoA: rc=%d err=%ld\n",rc,last_error);
337 return TRUE;
338 }
339}
340
341/*
342 * Tests the HKEY_CURRENT_USER subkey value.
343 * The value should contain string value.
344 */
345static void _test_reg_key( LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName1, LPCSTR valName2,
346 const void *exp_value, DWORD exp_type, BOOL optional )
347{
349 DWORD valueLen;
350 DWORD type;
351 HKEY hKey;
352 LONG rc;
353 int found=0;
354
355 *value='\0';
356 valueLen=sizeof(value);
357 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
358 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
359 RegCloseKey( hKey );
360 if (rc==ERROR_SUCCESS)
361 {
362 ok( type == exp_type, "wrong type %lu/%lu\n", type, exp_type );
363 switch (exp_type)
364 {
365 case REG_DWORD:
366 ok( *(DWORD *)value == *(DWORD *)exp_value,
367 "Wrong value in registry: %s %s %08lx/%08lx\n",
368 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
369 break;
370 case REG_SZ:
371 ok( !strcmp( exp_value, value ),
372 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
373 subKey1, valName1, value, (const char *)exp_value );
374 break;
375 }
376 found++;
377 }
378 else if (strict)
379 {
380 ok(0,"Missing registry entry: subKey=%s, valName=%s\n",
381 subKey1, valName1);
382 }
383 if (valName2)
384 {
385 *value='\0';
386 valueLen=sizeof(value);
387 RegOpenKeyA( HKEY_CURRENT_USER, subKey1, &hKey );
388 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
389 RegCloseKey( hKey );
390 if (rc==ERROR_SUCCESS)
391 {
392 ok( type == exp_type, "wrong type %lu/%lu\n", type, exp_type );
393 switch (exp_type)
394 {
395 case REG_DWORD:
396 ok( *(DWORD *)value == *(DWORD *)exp_value,
397 "Wrong value in registry: %s %s %08lx/%08lx\n",
398 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
399 break;
400 case REG_SZ:
401 ok( !strcmp( exp_value, value ),
402 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
403 subKey1, valName1, value, (const char *)exp_value );
404 break;
405 }
406 found++;
407 }
408 else if (strict)
409 {
410 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
411 subKey1, valName2 );
412 }
413 }
414 if (subKey2 && !strict)
415 {
416 *value='\0';
417 valueLen=sizeof(value);
418 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
419 rc=RegQueryValueExA( hKey, valName1, NULL, &type, (LPBYTE)value, &valueLen );
420 RegCloseKey( hKey );
421 if (rc==ERROR_SUCCESS)
422 {
423 ok( type == exp_type, "wrong type %lu/%lu\n", type, exp_type );
424 switch (exp_type)
425 {
426 case REG_DWORD:
427 ok( *(DWORD *)value == *(DWORD *)exp_value,
428 "Wrong value in registry: %s %s %08lx/%08lx\n",
429 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
430 break;
431 case REG_SZ:
432 ok( !strcmp( exp_value, value ),
433 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
434 subKey1, valName1, value, (const char *)exp_value );
435 break;
436 }
437 found++;
438 }
439 else if (strict)
440 {
441 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
442 subKey2, valName1 );
443 }
444 if (valName2)
445 {
446 *value='\0';
447 valueLen=sizeof(value);
448 RegOpenKeyA( HKEY_CURRENT_USER, subKey2, &hKey );
449 rc=RegQueryValueExA( hKey, valName2, NULL, &type, (LPBYTE)value, &valueLen );
450 RegCloseKey( hKey );
451 if (rc==ERROR_SUCCESS)
452 {
453 ok( type == exp_type, "wrong type %lu/%lu\n", type, exp_type );
454 switch (exp_type)
455 {
456 case REG_DWORD:
457 ok( *(DWORD *)value == *(DWORD *)exp_value,
458 "Wrong value in registry: %s %s %08lx/%08lx\n",
459 subKey1, valName1, *(DWORD *)value, *(DWORD *)exp_value );
460 break;
461 case REG_SZ:
462 ok( !strcmp( exp_value, value ),
463 "Wrong value in registry: %s %s '%s' instead of '%s'\n",
464 subKey1, valName1, value, (const char *)exp_value );
465 break;
466 }
467 found++;
468 }
469 else if (strict)
470 {
471 ok( 0,"Missing registry entry: subKey=%s, valName=%s\n",
472 subKey2, valName2 );
473 }
474 }
475 }
476 ok(found || optional,
477 "Missing registry values: %s or %s in keys: %s or %s\n",
478 valName1, (valName2?valName2:"<n/a>"), subKey1, (subKey2?subKey2:"<n/a>") );
479}
480
481#define test_reg_key( subKey, valName, testValue ) \
482 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, FALSE )
483#define test_reg_key_optional( subKey, valName, testValue ) \
484 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_SZ, TRUE )
485#define test_reg_key_ex( subKey1, subKey2, valName, testValue ) \
486 _test_reg_key( subKey1, subKey2, valName, NULL, testValue, REG_SZ, FALSE )
487#define test_reg_key_ex2( subKey1, subKey2, valName1, valName2, testValue ) \
488 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, FALSE )
489#define test_reg_key_ex2_optional( subKey1, subKey2, valName1, valName2, testValue ) \
490 _test_reg_key( subKey1, subKey2, valName1, valName2, testValue, REG_SZ, TRUE )
491#define test_reg_key_dword( subKey, valName, testValue ) \
492 _test_reg_key( subKey, NULL, valName, NULL, testValue, REG_DWORD, FALSE )
493
494/* get a metric from the registry. If the value is negative
495 * it is assumed to be in twips and converted to pixels */
496static UINT metricfromreg( const char *keyname, const char *valname, int dpi)
497{
498 HKEY hkey;
499 char buf[64];
500 DWORD ret;
501 DWORD size, type;
502 int value;
503
504 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
505 size = sizeof(buf);
506 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)buf, &size );
507 RegCloseKey( hkey );
508 if( ret != ERROR_SUCCESS) return -1;
509 value = atoi( buf);
510 if( value < 0)
511 value = ( -value * dpi + 720) / 1440;
512 return value;
513}
514
515typedef struct
516{
530 CHAR lfFaceName[LF_FACESIZE];
532
533/* get logfont from the registry */
534static int lffromreg( const char *keyname, const char *valname, LOGFONTA *plf)
535{
536 HKEY hkey;
537 LOGFONTW lfw;
538 DWORD ret, size, type;
539
540 RegOpenKeyA( HKEY_CURRENT_USER, keyname, &hkey );
541 size = sizeof( lfw);
542 ret=RegQueryValueExA( hkey, valname, NULL, &type, (LPBYTE)&lfw, &size );
543 RegCloseKey( hkey );
544 ok( ret == ERROR_SUCCESS, "Key \"%s\" value \"%s\" not found\n", keyname, valname);
545 if( ret != ERROR_SUCCESS)
546 return FALSE;
547 if( size <= sizeof( LOGFONT16)) {
548 LOGFONT16 *plf16 = (LOGFONT16*) &lfw;
549 plf->lfHeight = plf16->lfHeight;
550 plf->lfWidth = plf16->lfWidth;
551 plf->lfEscapement = plf16->lfEscapement;
552 plf->lfOrientation = plf16->lfOrientation;
553 plf->lfWeight = plf16->lfWeight;
554 plf->lfItalic = plf16->lfItalic;
555 plf->lfUnderline = plf16->lfUnderline;
556 plf->lfStrikeOut = plf16->lfStrikeOut;
557 plf->lfCharSet = plf16->lfCharSet;
558 plf->lfOutPrecision = plf16->lfOutPrecision;
559 plf->lfClipPrecision = plf16->lfClipPrecision;
560 plf->lfQuality = plf16->lfQuality;
562 memcpy( plf->lfFaceName, plf16->lfFaceName, LF_FACESIZE );
563 } else if( size <= sizeof( LOGFONTA)) {
564 plf = (LOGFONTA*) &lfw;
565 } else {
566 plf->lfHeight = lfw.lfHeight;
567 plf->lfWidth = lfw.lfWidth;
568 plf->lfEscapement = lfw.lfEscapement;
569 plf->lfOrientation = lfw.lfOrientation;
570 plf->lfWeight = lfw.lfWeight;
571 plf->lfItalic = lfw.lfItalic;
572 plf->lfUnderline = lfw.lfUnderline;
573 plf->lfStrikeOut = lfw.lfStrikeOut;
574 plf->lfCharSet = lfw.lfCharSet;
577 plf->lfQuality = lfw.lfQuality;
581
582 }
583 return TRUE;
584}
585
586static void test_SPI_SETBEEP( void ) /* 2 */
587{
588 BOOL rc;
589 BOOL old_b;
590 BOOL b;
591 BOOL curr_val;
592
593 trace("testing SPI_{GET,SET}BEEP\n");
594 SetLastError(0xdeadbeef);
595 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &old_b, 0 );
596 if (!test_error_msg(rc,"SPI_{GET,SET}BEEP"))
597 return;
598
599 curr_val = TRUE;
601 if (!test_error_msg(rc,"SPI_SETBEEP")) return;
602 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
606 curr_val ? "Yes" : "No" );
607 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
608 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
609 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
610 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
612 {
613 ok(rc, "SystemParametersInfoW: rc=%d err=%ld\n", rc, GetLastError());
614 eq( b, curr_val, "SystemParametersInfoW", "%d" );
615 }
616
617 /* is a message sent for the second change? */
619 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
621
622 curr_val = FALSE;
626 ok(rc, "SystemParametersInfo: rc=%d err=%ld\n", rc, GetLastError());
630 curr_val ? "Yes" : "No" );
631 rc=SystemParametersInfoA( SPI_GETBEEP, 0, &b, 0 );
632 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
633 eq( b, curr_val, "SPI_{GET,SET}BEEP", "%d" );
634 rc=SystemParametersInfoW( SPI_GETBEEP, 0, &b, 0 );
636 {
637 ok(rc, "SystemParametersInfoW: rc=%d err=%ld\n", rc, GetLastError());
638 eq( b, curr_val, "SystemParametersInfoW", "%d" );
639 }
640 ok( MessageBeep( MB_OK ), "Return value of MessageBeep when sound is disabled\n" );
641
643 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
644}
645
646static const char *setmouse_valuenames[3] = {
650};
651
652/*
653 * Runs check for one setting of spi_setmouse.
654 */
655static BOOL run_spi_setmouse_test( int curr_val[], POINT *req_change, POINT *proj_change, int nchange )
656{
657 BOOL rc;
658 INT mi[3];
659 static int aw_turn = 0;
660
661 char buf[20];
662 int i;
663
664 aw_turn++;
665 rc = FALSE;
666 SetLastError(0xdeadbeef);
667 if (aw_turn % 2) /* call unicode on odd (non even) calls */
669 else
671 if (!test_error_msg(rc,"SPI_SETMOUSE")) return FALSE;
672
673 ok(rc, "SystemParametersInfo: rc=%d err=%ld\n", rc, GetLastError());
675 for (i = 0; i < 3; i++)
676 {
677 sprintf( buf, "%d", curr_val[i] );
679 }
680
682 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
683 ok(mi[0] == curr_val[0], "expected X threshold %d, got %d\n", curr_val[0], mi[0]);
684 ok(mi[1] == curr_val[1], "expected Y threshold %d, got %d\n", curr_val[1], mi[1]);
685 ok(mi[2] == curr_val[2] || broken(mi[2] == 1) /* Win10 1709+ */,
686 "expected acceleration %d, got %d\n", curr_val[2], mi[2]);
687
689 ok(rc, "SystemParametersInfoW: rc=%d err=%ld\n", rc, GetLastError());
690 ok(mi[0] == curr_val[0], "expected X threshold %d, got %d\n", curr_val[0], mi[0]);
691 ok(mi[1] == curr_val[1], "expected Y threshold %d, got %d\n", curr_val[1], mi[1]);
692 ok(mi[2] == curr_val[2] || broken(mi[2] == 1) /* Win10 1709+ */,
693 "expected acceleration %d, got %d\n", curr_val[2], mi[2]);
694
695 if (0)
696 {
697 /* FIXME: this always fails for me - AJ */
698 for (i = 0; i < nchange; i++)
699 {
700 POINT mv;
702 mouse_event( MOUSEEVENTF_MOVE, req_change[i].x, req_change[i].y, 0, 0 );
703 GetCursorPos( &mv );
704 ok( proj_change[i].x == mv.x, "Projected dx and real dx comparison. May fail under high load.\n" );
705 ok( proj_change[i].y == mv.y, "Projected dy equals real dy. May fail under high load.\n" );
706 }
707 }
708 return TRUE;
709}
710
711static void test_SPI_SETMOUSE( void ) /* 4 */
712{
713 BOOL rc;
714 INT old_mi[3];
715
716 /* win nt default values - 6, 10, 1 */
717 INT curr_val[3] = {6, 10, 1};
718
719 /* requested and projected mouse movements */
720 POINT req_change[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
721 POINT proj_change1[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
722 POINT proj_change2[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {44, 20}, {400, 400} };
723 POINT proj_change3[] = { {6, 6}, {14, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
724 POINT proj_change4[] = { {6, 6}, { 7, 6}, { 8, 6}, {10, 10}, {11, 10}, {100, 100} };
725 POINT proj_change5[] = { {6, 6}, { 7, 6}, {16, 6}, {20, 20}, {22, 20}, {200, 200} };
726 POINT proj_change6[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
727 POINT proj_change7[] = { {6, 6}, {14, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
728 POINT proj_change8[] = { {6, 6}, {28, 6}, {32, 6}, {40, 40}, {44, 40}, {400, 400} };
729
730 int nchange = ARRAY_SIZE(req_change);
731
732 trace("testing SPI_{GET,SET}MOUSE\n");
733 SetLastError(0xdeadbeef);
734 rc=SystemParametersInfoA( SPI_GETMOUSE, 0, old_mi, 0 );
735 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSE"))
736 return;
737
738 if (!run_spi_setmouse_test( curr_val, req_change, proj_change1, nchange )) return;
739
740 /* acceleration change */
741 curr_val[2] = 2;
742 run_spi_setmouse_test( curr_val, req_change, proj_change2, nchange );
743
744 /* acceleration change */
745 curr_val[2] = 3;
746 run_spi_setmouse_test( curr_val, req_change, proj_change3, nchange );
747
748 /* acceleration change */
749 curr_val[2] = 0;
750 run_spi_setmouse_test( curr_val, req_change, proj_change4, nchange );
751
752 /* threshold change */
753 curr_val[2] = 1;
754 curr_val[0] = 7;
755 run_spi_setmouse_test( curr_val, req_change, proj_change5, nchange );
756
757 /* threshold change */
758 curr_val[2] = 2;
759 curr_val[0] = 6;
760 curr_val[1] = 6;
761 run_spi_setmouse_test( curr_val, req_change, proj_change6, nchange );
762
763 /* threshold change */
764 curr_val[1] = 7;
765 run_spi_setmouse_test( curr_val, req_change, proj_change7, nchange );
766
767 /* threshold change */
768 curr_val[1] = 5;
769 run_spi_setmouse_test( curr_val, req_change, proj_change8, nchange );
770
772 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
773}
774
775static BOOL test_setborder(UINT curr_val, int usesetborder, int dpi)
776{
777 BOOL rc;
778 UINT border, regval;
779 INT frame;
780 NONCLIENTMETRICSA ncm;
781
782 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
783 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
784 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
785 if( usesetborder) {
787 if (!test_error_msg(rc,"SPI_SETBORDER")) return FALSE;
788 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
790 } else { /* set non client metrics */
791 ncm.iBorderWidth = curr_val;
792 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncm, SPIF_UPDATEINIFILE|
794 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return FALSE;
795 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
796 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
797 }
798 if( curr_val) { /* skip if 0, some windows versions return 0 others 1 */
800 if( regval != curr_val)
802 ok( regval==curr_val, "wrong value in registry %d, expected %d\n", regval, curr_val);
803 }
804 /* minimum border width is 1 */
805 if (curr_val == 0) curr_val = 1;
806 /* should be the same as the non client metrics */
807 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
808 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
809 eq( (UINT)ncm.iBorderWidth, curr_val, "NonClientMetric.iBorderWidth", "%d");
810 /* and from SPI_GETBORDER */
812 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
813 eq( border, curr_val, "SPI_{GET,SET}BORDER", "%d");
814 /* test some SystemMetrics */
815 frame = curr_val + GetSystemMetrics( SM_CXDLGFRAME );
816 eq( frame, GetSystemMetrics( SM_CXFRAME ), "SM_CXFRAME", "%d" );
817 eq( frame, GetSystemMetrics( SM_CYFRAME ), "SM_CYFRAME", "%d" );
818 eq( frame, GetSystemMetrics( SM_CXSIZEFRAME ), "SM_CXSIZEFRAME", "%d" );
819 eq( frame, GetSystemMetrics( SM_CYSIZEFRAME ), "SM_CYSIZEFRAME", "%d" );
820 return TRUE;
821}
822
823static void test_SPI_SETBORDER( void ) /* 6 */
824{
825 BOOL rc;
826 UINT old_border;
827 NONCLIENTMETRICSA ncmsave;
828 INT CaptionWidth,
829 PaddedBorderWidth;
830
831 ncmsave.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
832 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncmsave, 0);
833 if( !rc) {
834 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
835 return;
836 }
837 /* CaptionWidth from the registry may have different value of iCaptionWidth
838 * from the non client metrics (observed on WinXP).
839 * Fix this so we can safely restore settings with the nonclientmetrics */
840 CaptionWidth = metricfromreg(
841 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
842 ncmsave.iCaptionWidth = CaptionWidth;
843
844 trace("testing SPI_{GET,SET}BORDER\n");
845
846 SetLastError(0xdeadbeef);
847 rc=SystemParametersInfoA( SPI_GETBORDER, 0, &old_border, 0 );
848 if (!test_error_msg(rc,"SPI_{GET,SET}BORDER"))
849 return;
850 /* FIXME: include new PaddedBorderWidth parameter */
851 PaddedBorderWidth = ncmsave.iBorderWidth - old_border;
852 if( PaddedBorderWidth){
853 win_skip( "Cannot reliably restore border width yet (PaddedBorderWidth = %d)\n",
854 PaddedBorderWidth);
855 return;
856 }
857 /* This will restore sane values if the test hang previous run. */
858 if ( old_border == 7 || old_border == 20 )
859 old_border = 1;
860
861 /* win2k3 fails if you set the same border twice, or if size is 0 */
862 if (!test_setborder(2, 1, dpi)) return;
863 test_setborder(1, 1, dpi);
864 test_setborder(3, 1, dpi);
865 if (!test_setborder(1, 0, dpi)) return;
866 test_setborder(0, 0, dpi);
867 test_setborder(3, 0, dpi);
868
869 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &ncmsave,
871 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
872 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
873}
874
875static void test_SPI_SETKEYBOARDSPEED( void ) /* 10 */
876{
877 BOOL rc;
878 UINT old_speed;
879 const UINT vals[]={0,20,31};
880 unsigned int i;
881
882 trace("testing SPI_{GET,SET}KEYBOARDSPEED\n");
883 SetLastError(0xdeadbeef);
884 rc=SystemParametersInfoA( SPI_GETKEYBOARDSPEED, 0, &old_speed, 0 );
885 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDSPEED"))
886 return;
887
888 for (i=0;i<ARRAY_SIZE(vals);i++)
889 {
890 UINT v;
891 char buf[10];
892
895 if (!test_error_msg(rc,"SPI_SETKEYBOARDSPEED")) return;
896 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
898 sprintf( buf, "%d", vals[i] );
900
902 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
903 eq( v, vals[i], "SPI_{GET,SET}KEYBOARDSPEED", "%d" );
904 }
905
907 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
908}
909
910/* test_SPI_ICONHORIZONTALSPACING helper */
912{
913 BOOL rc;
914 INT spacing, regval, min_val = MulDiv( 32, dpi, USER_DEFAULT_SCREEN_DPI );
915 ICONMETRICSA im;
916
919 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING")) return FALSE;
920 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
922 curr_val = max( curr_val, min_val );
923 /* The registry keys depend on the Windows version and the values too
924 * let's test (works on win95,ME,NT4,2k,XP)
925 */
927 if( regval != curr_val)
929 ok( curr_val == regval,
930 "wrong value in registry %d, expected %d\n", regval, curr_val);
931 /* compare with what SPI_ICONHORIZONTALSPACING returns */
933 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
934 eq( spacing, curr_val, "ICONHORIZONTALSPACING", "%d");
935 /* and with a system metrics */
936 eq( GetSystemMetrics( SM_CXICONSPACING ), curr_val, "SM_CXICONSPACING", "%d" );
937 /* and with what SPI_GETICONMETRICS returns */
938 im.cbSize = sizeof(ICONMETRICSA);
939 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
940 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
941 eq( im.iHorzSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
942 return TRUE;
943}
944
945static void test_SPI_ICONHORIZONTALSPACING( void ) /* 13 */
946{
947 BOOL rc;
948 INT old_spacing;
949
950 trace("testing SPI_ICONHORIZONTALSPACING\n");
951 SetLastError(0xdeadbeef);
952 /* default value: 75 */
953 rc=SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &old_spacing, 0 );
954 if (!test_error_msg(rc,"SPI_ICONHORIZONTALSPACING"))
955 return;
956 /* do not increase the value as it would upset the user's icon layout */
957 if (!dotest_spi_iconhorizontalspacing( old_spacing - 1)) return;
958 dotest_spi_iconhorizontalspacing( 10); /* minimum is 32 */
959 /* restore */
961 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
962}
963
964static void test_SPI_SETSCREENSAVETIMEOUT( void ) /* 14 */
965{
966 BOOL rc;
967 UINT old_timeout;
968 const UINT vals[]={0,32767};
969 unsigned int i;
970
971 trace("testing SPI_{GET,SET}SCREENSAVETIMEOUT\n");
972 SetLastError(0xdeadbeef);
973 rc=SystemParametersInfoA( SPI_GETSCREENSAVETIMEOUT, 0, &old_timeout, 0 );
974 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVETIMEOUT"))
975 return;
976
977 for (i=0;i<ARRAY_SIZE(vals);i++)
978 {
979 UINT v;
980 char buf[10];
981
984 if (!test_error_msg(rc,"SPI_SETSCREENSAVETIMEOUT")) return;
985 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
987 sprintf( buf, "%d", vals[i] );
990
992 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
993 eq( v, vals[i], "SPI_{GET,SET}SCREENSAVETIMEOUT", "%d" );
994 }
995
998 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
999}
1000
1001static void test_SPI_SETSCREENSAVEACTIVE( void ) /* 17 */
1002{
1003 BOOL rc;
1004 BOOL old_b;
1005 const UINT vals[]={TRUE,FALSE};
1006 unsigned int i;
1007
1008 trace("testing SPI_{GET,SET}SCREENSAVEACTIVE\n");
1009 SetLastError(0xdeadbeef);
1011 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENSAVEACTIVE"))
1012 return;
1013
1014 for (i=0;i<ARRAY_SIZE(vals);i++)
1015 {
1016 UINT v;
1017
1020 if (!test_error_msg(rc,"SPI_SETSCREENSAVEACTIVE")) return;
1021 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1025 vals[i] ? "1" : "0" );
1026
1028 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1029 ok(v == vals[i] || broken(! v) /* Win 7 */,
1030 "SPI_{GET,SET}SCREENSAVEACTIVE: got %d instead of %d\n", v, vals[i]);
1031 }
1032
1034 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1035}
1036
1037static void test_SPI_SETGRIDGRANULARITY( void ) /* 19 */
1038{
1039 /* ??? */;
1040}
1041
1042static void test_SPI_SETKEYBOARDDELAY( void ) /* 23 */
1043{
1044 BOOL rc;
1045 UINT old_delay;
1046 const UINT vals[]={0,3};
1047 unsigned int i;
1048
1049 trace("testing SPI_{GET,SET}KEYBOARDDELAY\n");
1050 SetLastError(0xdeadbeef);
1051 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &old_delay, 0 );
1052 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDDELAY"))
1053 return;
1054
1055 for (i=0;i<ARRAY_SIZE(vals);i++)
1056 {
1057 UINT delay;
1058 char buf[10];
1059
1062 if (!test_error_msg(rc,"SPI_SETKEYBOARDDELAY")) return;
1063 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1065 sprintf( buf, "%d", vals[i] );
1068
1069 rc=SystemParametersInfoA( SPI_GETKEYBOARDDELAY, 0, &delay, 0 );
1070 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1071 eq( delay, vals[i], "SPI_{GET,SET}KEYBOARDDELAY", "%d" );
1072 }
1073
1075 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1076}
1077
1078
1079/* test_SPI_ICONVERTICALSPACING helper */
1081{
1082 BOOL rc;
1083 INT spacing, regval, min_val = MulDiv( 32, dpi, USER_DEFAULT_SCREEN_DPI );
1084 ICONMETRICSA im;
1085
1088 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING")) return FALSE;
1089 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1091 curr_val = max( curr_val, min_val );
1092 /* The registry keys depend on the Windows version and the values too
1093 * let's test (works on win95,ME,NT4,2k,XP)
1094 */
1096 if( regval != curr_val)
1098 ok( curr_val == regval,
1099 "wrong value in registry %d, expected %d\n", regval, curr_val);
1100 /* compare with what SPI_ICONVERTICALSPACING returns */
1101 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1102 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1103 eq( spacing, curr_val, "ICONVERTICALSPACING", "%d" );
1104 /* and with a system metrics */
1105 eq( GetSystemMetrics( SM_CYICONSPACING ), curr_val, "SM_CYICONSPACING", "%d" );
1106 /* and with what SPI_GETICONMETRICS returns */
1107 im.cbSize = sizeof(ICONMETRICSA);
1108 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1109 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1110 eq( im.iVertSpacing, curr_val, "SPI_GETICONMETRICS", "%d" );
1111 return TRUE;
1112}
1113
1114static void test_SPI_ICONVERTICALSPACING( void ) /* 24 */
1115{
1116 BOOL rc;
1117 INT old_spacing;
1118
1119 trace("testing SPI_ICONVERTICALSPACING\n");
1120 SetLastError(0xdeadbeef);
1121 /* default value: 75 */
1122 rc=SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &old_spacing, 0 );
1123 if (!test_error_msg(rc,"SPI_ICONVERTICALSPACING"))
1124 return;
1125 /* do not increase the value as it would upset the user's icon layout */
1126 if (!dotest_spi_iconverticalspacing( old_spacing - 1)) return;
1127 /* same tests with a value less than the minimum 32 */
1129 /* restore */
1132 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1133}
1134
1135static void test_SPI_SETICONTITLEWRAP( void ) /* 26 */
1136{
1137 BOOL rc;
1138 BOOL old_b;
1139 const UINT vals[]={TRUE,FALSE};
1140 unsigned int i;
1141 ICONMETRICSA im;
1142
1143 trace("testing SPI_{GET,SET}ICONTITLEWRAP\n");
1144 SetLastError(0xdeadbeef);
1145 rc=SystemParametersInfoA( SPI_GETICONTITLEWRAP, 0, &old_b, 0 );
1146 if (!test_error_msg(rc,"SPI_{GET,SET}ICONTITLEWRAP"))
1147 return;
1148
1149 for (i=0;i<ARRAY_SIZE(vals);i++)
1150 {
1151 UINT v;
1152 UINT regval;
1153
1156 if (!test_error_msg(rc,"SPI_SETICONTITLEWRAP")) return;
1157 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1161 if( regval != vals[i])
1164 ok( regval == vals[i], "wrong value in registry %d, expected %d\n", regval, vals[i] );
1165
1167 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1168 eq( v, vals[i], "SPI_{GET,SET}ICONTITLEWRAP", "%d" );
1169 /* and test with what SPI_GETICONMETRICS returns */
1170 im.cbSize = sizeof(ICONMETRICSA);
1171 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im, FALSE );
1172 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1173 eq( im.iTitleWrap, (BOOL)vals[i], "SPI_GETICONMETRICS", "%d" );
1174 }
1175
1177 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1178}
1179
1180static void test_SPI_SETMENUDROPALIGNMENT( void ) /* 28 */
1181{
1182 BOOL rc;
1183 BOOL old_b;
1184 const UINT vals[]={TRUE,FALSE};
1185 unsigned int i;
1186
1187 trace("testing SPI_{GET,SET}MENUDROPALIGNMENT\n");
1188 SetLastError(0xdeadbeef);
1190 if (!test_error_msg(rc,"SPI_{GET,SET}MENUDROPALIGNMENT"))
1191 return;
1192
1193 for (i=0;i<ARRAY_SIZE(vals);i++)
1194 {
1195 UINT v;
1196
1199 if (!test_error_msg(rc,"SPI_SETMENUDROPALIGNMENT")) return;
1200 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1205 vals[i] ? "1" : "0" );
1206
1208 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1209 eq( v, vals[i], "SPI_{GET,SET}MENUDROPALIGNMENT", "%d" );
1210 eq( GetSystemMetrics( SM_MENUDROPALIGNMENT ), (int)vals[i],
1211 "SM_MENUDROPALIGNMENT", "%d" );
1212 }
1213
1216 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1218}
1219
1220static void test_SPI_SETDOUBLECLKWIDTH( void ) /* 29 */
1221{
1222 BOOL rc;
1223 INT old_width;
1224 const UINT vals[]={0,10000};
1225 unsigned int i;
1226
1227 trace("testing SPI_{GET,SET}DOUBLECLKWIDTH\n");
1228 old_width = GetSystemMetrics( SM_CXDOUBLECLK );
1229
1230 for (i=0;i<ARRAY_SIZE(vals);i++)
1231 {
1232 char buf[10];
1233
1234 SetLastError(0xdeadbeef);
1237 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKWIDTH"))
1238 return;
1239
1241 sprintf( buf, "%d", vals[i] );
1245 eq( GetSystemMetrics( SM_CXDOUBLECLK ), (int)vals[i],
1246 "SM_CXDOUBLECLK", "%d" );
1247 }
1248
1251 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1252}
1253
1254static void test_SPI_SETDOUBLECLKHEIGHT( void ) /* 30 */
1255{
1256 BOOL rc;
1257 INT old_height;
1258 const UINT vals[]={0,10000};
1259 unsigned int i;
1260
1261 trace("testing SPI_{GET,SET}DOUBLECLKHEIGHT\n");
1262 old_height = GetSystemMetrics( SM_CYDOUBLECLK );
1263
1264 for (i=0;i<ARRAY_SIZE(vals);i++)
1265 {
1266 char buf[10];
1267
1268 SetLastError(0xdeadbeef);
1271 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLKHEIGHT"))
1272 return;
1273
1275 sprintf( buf, "%d", vals[i] );
1279 eq( GetSystemMetrics( SM_CYDOUBLECLK ), (int)vals[i],
1280 "SM_CYDOUBLECLK", "%d" );
1281 }
1282
1285 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1287}
1288
1289static void test_SPI_SETDOUBLECLICKTIME( void ) /* 32 */
1290{
1291 BOOL rc;
1292 UINT curr_val;
1293 UINT saved_val;
1294 UINT old_time;
1295 char buf[10];
1296
1297 trace("testing SPI_{GET,SET}DOUBLECLICKTIME\n");
1298 old_time = GetDoubleClickTime();
1299
1300 curr_val = 0;
1301 SetLastError(0xdeadbeef);
1304 if (!test_error_msg(rc,"SPI_{GET,SET}DOUBLECLICKTIME"))
1305 return;
1306
1308 sprintf( buf, "%d", curr_val );
1311 curr_val = 500; /* used value for 0 */
1312 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1313
1314 curr_val = 1000;
1317 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1319 sprintf( buf, "%d", curr_val );
1322 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1323
1324 saved_val = curr_val;
1325
1326 curr_val = 0;
1327 SetDoubleClickTime( curr_val );
1328 sprintf( buf, "%d", saved_val );
1331 curr_val = 500; /* used value for 0 */
1332 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1333
1334 curr_val = 1000;
1335 SetDoubleClickTime( curr_val );
1336 sprintf( buf, "%d", saved_val );
1339 eq( GetDoubleClickTime(), curr_val, "GetDoubleClickTime", "%d" );
1340
1342 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1344}
1345
1346static void test_SPI_SETMOUSEBUTTONSWAP( void ) /* 33 */
1347{
1348 BOOL rc;
1349 BOOL vals[2];
1350 unsigned int i;
1351
1352 trace("testing SPI_{GET,SET}MOUSEBUTTONSWAP\n");
1353 vals[1] = GetSystemMetrics( SM_SWAPBUTTON );
1354 vals[0] = !vals[1];
1355
1356 for (i=0;i<ARRAY_SIZE(vals);i++)
1357 {
1358 SetLastError(0xdeadbeef);
1361 if (!test_error_msg(rc,"SPI_SETMOUSEBUTTONSWAP")) break;
1362
1366 vals[i] ? "1" : "0" );
1367 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i],
1368 "SM_SWAPBUTTON", "%d" );
1369 rc=SwapMouseButton((BOOL)vals[i^1]);
1370 eq( GetSystemMetrics( SM_SWAPBUTTON ), (int)vals[i^1],
1371 "SwapMouseButton", "%d" );
1372 ok( rc==(BOOL)vals[i], "SwapMouseButton does not return previous state (really %d)\n", rc );
1374 }
1375
1378 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1380}
1381
1382static void test_SPI_SETFASTTASKSWITCH( void ) /* 36 */
1383{
1384 BOOL rc;
1385 BOOL v;
1386
1387 trace("testing SPI_GETFASTTASKSWITCH\n");
1388 SetLastError(0xdeadbeef);
1390 if (!test_error_msg(rc,"SPI_{GET,SET}FASTTASKSWITCH"))
1391 return;
1392
1393 /* there is not a single Windows platform on which SPI_GETFASTTASKSWITCH
1394 * works. That sure simplifies testing!
1395 */
1396}
1397
1398static void test_SPI_SETDRAGFULLWINDOWS( void ) /* 37 */
1399{
1400 BOOL rc;
1401 BOOL old_b;
1402 const UINT vals[]={TRUE,FALSE};
1403 unsigned int i;
1404
1405 trace("testing SPI_{GET,SET}DRAGFULLWINDOWS\n");
1406 SetLastError(0xdeadbeef);
1407 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &old_b, 0 );
1408
1409 /* SPI_{GET,SET}DRAGFULLWINDOWS is not implemented on Win95 */
1410 if (!test_error_msg(rc,"SPI_{GET,SET}DRAGFULLWINDOWS"))
1411 return;
1412
1413 for (i=0;i<ARRAY_SIZE(vals);i++)
1414 {
1415 UINT v;
1416
1417 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, vals[i], 0,
1419 if (!test_error_msg(rc,"SPI_SETDRAGFULLWINDOWS")) return;
1420 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1421 test_change_message( SPI_SETDRAGFULLWINDOWS, 0 );
1424 vals[i] ? "1" : "0" );
1425
1426 rc=SystemParametersInfoA( SPI_GETDRAGFULLWINDOWS, 0, &v, 0 );
1427 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1428 eq( v, vals[i], "SPI_{GET,SET}DRAGFULLWINDOWS", "%d" );
1429 }
1430
1431 rc=SystemParametersInfoA( SPI_SETDRAGFULLWINDOWS, old_b, 0, SPIF_UPDATEINIFILE );
1432 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1434}
1435
1436#define test_reg_metric( KEY, VAL, val) do { \
1437 INT regval;\
1438 regval = metricfromreg( KEY, VAL, dpi);\
1439 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1440} while(0)
1441
1442#define test_reg_metric2( KEY1, KEY2, VAL, val) do { \
1443 INT regval;\
1444 regval = metricfromreg( KEY1, VAL, dpi);\
1445 if( regval != val) regval = metricfromreg( KEY2, VAL, dpi);\
1446 ok( regval==val, "wrong value \"%s\" in registry %d, expected %d\n", VAL, regval, val);\
1447} while(0)
1448
1449#define test_reg_font( KEY, VAL, LF) do { \
1450 LOGFONTA lfreg;\
1451 lffromreg( KEY, VAL, &lfreg);\
1452 ok( (lfreg.lfHeight < 0 ? (LF).lfHeight == MulDiv( lfreg.lfHeight, dpi, real_dpi ) : \
1453 MulDiv( -(LF).lfHeight , 72, dpi) == lfreg.lfHeight )&&\
1454 (LF).lfWidth == lfreg.lfWidth &&\
1455 (LF).lfWeight == lfreg.lfWeight &&\
1456 !strcmp( (LF).lfFaceName, lfreg.lfFaceName)\
1457 , "wrong value \"%s\" in registry %ld, %ld\n", VAL, (LF).lfHeight, lfreg.lfHeight);\
1458} while(0)
1459
1460#define TEST_NONCLIENTMETRICS_REG( ncm) do { \
1461/*FIXME: test_reg_metric2( SPI_SETBORDER_REGKEY2, SPI_SETBORDER_REGKEY, SPI_SETBORDER_VALNAME, (ncm).iBorderWidth);*/\
1462test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLWIDTH_VALNAME, (ncm).iScrollWidth);\
1463test_reg_metric( SPI_METRIC_REGKEY, SPI_SCROLLHEIGHT_VALNAME, (ncm).iScrollHeight);\
1464/*FIXME: test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONWIDTH_VALNAME, (ncm).iCaptionWidth);*/\
1465test_reg_metric( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, (ncm).iCaptionHeight);\
1466test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONWIDTH_VALNAME, (ncm).iSmCaptionWidth);\
1467test_reg_metric( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, (ncm).iSmCaptionHeight);\
1468test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUWIDTH_VALNAME, (ncm).iMenuWidth);\
1469test_reg_metric( SPI_METRIC_REGKEY, SPI_MENUHEIGHT_VALNAME, (ncm).iMenuHeight);\
1470test_reg_font( SPI_METRIC_REGKEY, SPI_MENUFONT_VALNAME, (ncm).lfMenuFont);\
1471test_reg_font( SPI_METRIC_REGKEY, SPI_CAPTIONFONT_VALNAME, (ncm).lfCaptionFont);\
1472test_reg_font( SPI_METRIC_REGKEY, SPI_SMCAPTIONFONT_VALNAME, (ncm).lfSmCaptionFont);\
1473test_reg_font( SPI_METRIC_REGKEY, SPI_STATUSFONT_VALNAME, (ncm).lfStatusFont);\
1474test_reg_font( SPI_METRIC_REGKEY, SPI_MESSAGEFONT_VALNAME, (ncm).lfMessageFont); } while(0)
1475
1476/* get text metric height value for the specified logfont */
1477static int get_tmheight( LOGFONTA *plf, int flag)
1478{
1480 HDC hdc = GetDC(0);
1485 ReleaseDC( 0, hdc );
1486 return tm.tmHeight + (flag ? tm.tmExternalLeading : 0);
1487}
1488
1489static int get_tmheightW( LOGFONTW *plf, int flag)
1490{
1492 HDC hdc = GetDC(0);
1497 ReleaseDC( 0, hdc );
1498 return tm.tmHeight + (flag ? tm.tmExternalLeading : 0);
1499}
1500
1501static void test_GetSystemMetrics( void);
1502static UINT smcxsmsize = 999999999;
1503
1504static void test_SPI_SETNONCLIENTMETRICS( void ) /* 44 */
1505{
1506 BOOL rc;
1507 INT expect;
1508 NONCLIENTMETRICSA Ncmorig;
1509 NONCLIENTMETRICSA Ncmnew;
1510 NONCLIENTMETRICSA Ncmcur;
1511 NONCLIENTMETRICSA Ncmstart;
1512
1513 Ncmorig.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1514 Ncmnew.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1515 Ncmcur.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1516 Ncmstart.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
1517
1518 trace("testing SPI_{GET,SET}NONCLIENTMETRICS\n");
1519 change_counter = 0;
1520 SetLastError(0xdeadbeef);
1521 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmorig, FALSE );
1522 if (!test_error_msg(rc,"SPI_{GET,SET}NONCLIENTMETRICS"))
1523 return;
1524 Ncmstart = Ncmorig;
1525 smcxsmsize = Ncmstart.iSmCaptionWidth;
1526 /* SPI_GETNONCLIENTMETRICS returns some "cooked" values. For instance if
1527 the caption font height is higher than the CaptionHeight field,
1528 the latter is adjusted accordingly. To be able to restore these setting
1529 accurately we restore the raw values. */
1531 Ncmorig.iCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_CAPTIONHEIGHT_VALNAME, dpi);
1532 Ncmorig.iSmCaptionHeight = metricfromreg( SPI_METRIC_REGKEY, SPI_SMCAPTIONHEIGHT_VALNAME, dpi);
1534 /* test registry entries */
1535 TEST_NONCLIENTMETRICS_REG( Ncmorig);
1536
1537 /* make small changes */
1538 Ncmnew = Ncmstart;
1539 Ncmnew.iBorderWidth += 1;
1540 Ncmnew.iScrollWidth += 1;
1541 Ncmnew.iScrollHeight -= 1;
1542 Ncmnew.iCaptionWidth -= 2;
1543 Ncmnew.iCaptionHeight += 2;
1544 Ncmnew.lfCaptionFont.lfHeight +=1;
1545 Ncmnew.lfCaptionFont.lfWidth +=2;
1546 Ncmnew.lfCaptionFont.lfWeight +=1;
1547 Ncmnew.iSmCaptionWidth += 1;
1548 Ncmnew.iSmCaptionHeight += 2;
1549 Ncmnew.lfSmCaptionFont.lfHeight +=3;
1550 Ncmnew.lfSmCaptionFont.lfWidth -=1;
1551 Ncmnew.lfSmCaptionFont.lfWeight +=3;
1552 Ncmnew.iMenuWidth += 1;
1553 Ncmnew.iMenuHeight += 2;
1554 Ncmnew.lfMenuFont.lfHeight +=1;
1555 Ncmnew.lfMenuFont.lfWidth +=1;
1556 Ncmnew.lfMenuFont.lfWeight +=2;
1557 Ncmnew.lfStatusFont.lfHeight -=1;
1558 Ncmnew.lfStatusFont.lfWidth -=1;
1559 Ncmnew.lfStatusFont.lfWeight +=3;
1560 Ncmnew.lfMessageFont.lfHeight -=2;
1561 Ncmnew.lfMessageFont.lfWidth -=1;
1562 Ncmnew.lfMessageFont.lfWeight +=4;
1563
1564 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1566 if (!test_error_msg(rc,"SPI_SETNONCLIENTMETRICS")) return;
1567 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1568 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1569 /* get them back */
1570 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmcur, FALSE );
1571 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1572 /* test registry entries */
1573 TEST_NONCLIENTMETRICS_REG( Ncmcur );
1574 /* test the system metrics with these settings */
1576 /* now for something invalid: increase the {menu|caption|smcaption} fonts
1577 by a large amount will increase the {menu|caption|smcaption} height*/
1578 Ncmnew = Ncmstart;
1579 Ncmnew.lfMenuFont.lfHeight -= 8;
1580 Ncmnew.lfCaptionFont.lfHeight =-4;
1581 Ncmnew.lfSmCaptionFont.lfHeight -=10;
1582 /* also show that a few values are lo limited */
1583 Ncmnew.iCaptionWidth = 0;
1584 Ncmnew.iCaptionHeight = 0;
1585 Ncmnew.iScrollHeight = 0;
1586 Ncmnew.iScrollWidth = 0;
1587
1588 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, 0, &Ncmnew, SPIF_UPDATEINIFILE|
1590 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1591 test_change_message( SPI_SETNONCLIENTMETRICS, 1 );
1592 /* raw values are in registry */
1593 TEST_NONCLIENTMETRICS_REG( Ncmnew );
1594 /* get them back */
1595 rc=SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA), &Ncmcur, FALSE );
1596 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1597 /* cooked values are returned */
1598 expect = max( Ncmnew.iMenuHeight, 2 + get_tmheight( &Ncmnew.lfMenuFont, 1));
1599 ok( Ncmcur.iMenuHeight == expect,
1600 "MenuHeight: %d expected %d\n", Ncmcur.iMenuHeight, expect);
1601 expect = max( Ncmnew.iCaptionHeight, 2 + get_tmheight(&Ncmnew.lfCaptionFont, 0));
1602 ok( Ncmcur.iCaptionHeight == expect,
1603 "CaptionHeight: %d expected %d\n", Ncmcur.iCaptionHeight, expect);
1604 expect = max( Ncmnew.iSmCaptionHeight, 2 + get_tmheight( &Ncmnew.lfSmCaptionFont, 0));
1605 ok( Ncmcur.iSmCaptionHeight == expect,
1606 "SmCaptionHeight: %d expected %d\n", Ncmcur.iSmCaptionHeight, expect);
1607
1608 /* iCaptionWidth depends on a version, could be 8, 12 (Vista, Win7), 13 */
1609 ok( (Ncmcur.iCaptionWidth >= 8 && Ncmcur.iCaptionWidth <= 13) ||
1610 Ncmcur.iCaptionWidth == Ncmstart.iCaptionWidth, /* with windows XP theme, the value never changes */
1611 "CaptionWidth: %d expected from [8, 13] or %d\n", Ncmcur.iCaptionWidth, Ncmstart.iCaptionWidth);
1612 ok( Ncmcur.iScrollWidth == 8,
1613 "ScrollWidth: %d expected 8\n", Ncmcur.iScrollWidth);
1614 ok( Ncmcur.iScrollHeight == 8,
1615 "ScrollHeight: %d expected 8\n", Ncmcur.iScrollHeight);
1616 /* test the system metrics with these settings */
1618 /* restore */
1619 rc=SystemParametersInfoA( SPI_SETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICSA),
1621 test_change_message( SPI_SETNONCLIENTMETRICS, 0 );
1622 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1624 /* test the system metrics with these settings */
1626}
1627
1628static void test_SPI_SETMINIMIZEDMETRICS( void ) /* 44 */
1629{
1630 BOOL rc;
1631 INT regval;
1632 MINIMIZEDMETRICS lpMm_orig;
1633 MINIMIZEDMETRICS lpMm_new;
1634 MINIMIZEDMETRICS lpMm_cur;
1635
1636 lpMm_orig.cbSize = sizeof(MINIMIZEDMETRICS);
1637 lpMm_new.cbSize = sizeof(MINIMIZEDMETRICS);
1638 lpMm_cur.cbSize = sizeof(MINIMIZEDMETRICS);
1639
1640 trace("testing SPI_{GET,SET}MINIMIZEDMETRICS\n");
1641 SetLastError(0xdeadbeef);
1642 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_orig, FALSE );
1643 if (!test_error_msg(rc,"SPI_{GET,SET}MINIMIZEDMETRICS"))
1644 return;
1645 /* Test registry. Note that it is perfectly valid for some fields to
1646 * not be set.
1647 */
1649 ok( regval == -1 || regval == lpMm_orig.iWidth, "wrong value in registry %d, expected %d\n",
1650 regval, lpMm_orig.iWidth);
1652 ok( regval == -1 || regval == lpMm_orig.iHorzGap, "wrong value in registry %d, expected %d\n",
1653 regval, lpMm_orig.iHorzGap);
1655 ok( regval == -1 || regval == lpMm_orig.iVertGap, "wrong value in registry %d, expected %d\n",
1656 regval, lpMm_orig.iVertGap);
1658 ok( regval == -1 || regval == lpMm_orig.iArrange, "wrong value in registry %d, expected %d\n",
1659 regval, lpMm_orig.iArrange);
1660 /* set some new values */
1661 lpMm_cur.iWidth = 180;
1662 lpMm_cur.iHorzGap = 1;
1663 lpMm_cur.iVertGap = 1;
1664 lpMm_cur.iArrange = 5;
1665 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1666 &lpMm_cur, SPIF_UPDATEINIFILE );
1667 if (!test_error_msg(rc,"SPI_SETMINIMIZEDMETRICS")) return;
1668 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1669 /* read them back */
1670 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1671 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1672 /* and compare */
1673 eq( lpMm_new.iWidth, lpMm_cur.iWidth, "iWidth", "%d" );
1674 eq( lpMm_new.iHorzGap, lpMm_cur.iHorzGap, "iHorzGap", "%d" );
1675 eq( lpMm_new.iVertGap, lpMm_cur.iVertGap, "iVertGap", "%d" );
1676 eq( lpMm_new.iArrange, lpMm_cur.iArrange, "iArrange", "%d" );
1677 /* test registry */
1679 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1680 regval, lpMm_new.iWidth);
1682 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1683 regval, lpMm_new.iHorzGap);
1685 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1686 regval, lpMm_new.iVertGap);
1688 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1689 regval, lpMm_new.iArrange);
1690 /* test some system metrics */
1692 lpMm_new.iWidth, "iWidth", "%d" );
1694 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1696 lpMm_new.iVertGap, "iVertGap", "%d" );
1698 lpMm_new.iArrange, "iArrange", "%d" );
1699 /* now some really invalid settings */
1700 lpMm_cur.iWidth = -1;
1701 lpMm_cur.iHorzGap = -1;
1702 lpMm_cur.iVertGap = -1;
1703 lpMm_cur.iArrange = - 1;
1704 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1705 &lpMm_cur, SPIF_UPDATEINIFILE );
1706 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1707 /* read back */
1708 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1709 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1710 /* the width and H/V gaps have minimum 0, arrange is and'd with 0xf */
1711 eq( lpMm_new.iWidth, 0, "iWidth", "%d" );
1712 eq( lpMm_new.iHorzGap, 0, "iHorzGap", "%d" );
1713 eq( lpMm_new.iVertGap, 0, "iVertGap", "%d" );
1714 eq( lpMm_new.iArrange, 0xf & lpMm_cur.iArrange, "iArrange", "%d" );
1715 /* test registry */
1716 if (0)
1717 {
1718 /* FIXME: cannot understand the results of this (11, 11, 11, 0) */
1720 ok( regval == lpMm_new.iWidth, "wrong value in registry %d, expected %d\n",
1721 regval, lpMm_new.iWidth);
1723 ok( regval == lpMm_new.iHorzGap, "wrong value in registry %d, expected %d\n",
1724 regval, lpMm_new.iHorzGap);
1726 ok( regval == lpMm_new.iVertGap, "wrong value in registry %d, expected %d\n",
1727 regval, lpMm_new.iVertGap);
1729 ok( regval == lpMm_new.iArrange, "wrong value in registry %d, expected %d\n",
1730 regval, lpMm_new.iArrange);
1731 }
1732 /* test some system metrics */
1734 lpMm_new.iWidth, "iWidth", "%d" );
1736 lpMm_new.iHorzGap, "iHorzGap", "%d" );
1738 lpMm_new.iVertGap, "iVertGap", "%d" );
1740 lpMm_new.iArrange, "iArrange", "%d" );
1741 /* restore */
1742 rc=SystemParametersInfoA( SPI_SETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS),
1743 &lpMm_orig, SPIF_UPDATEINIFILE );
1744 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1746 /* check that */
1747 rc=SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, sizeof(MINIMIZEDMETRICS), &lpMm_new, FALSE );
1748 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1749 eq( lpMm_new.iWidth, lpMm_orig.iWidth, "iWidth", "%d" );
1750 eq( lpMm_new.iHorzGap, lpMm_orig.iHorzGap, "iHorzGap", "%d" );
1751 eq( lpMm_new.iVertGap, lpMm_orig.iVertGap, "iVertGap", "%d" );
1752 eq( lpMm_new.iArrange, lpMm_orig.iArrange, "iArrange", "%d" );
1753}
1754
1755static void test_SPI_SETICONMETRICS( void ) /* 46 */
1756{
1757 BOOL rc, wrap;
1758 INT spacing;
1759 ICONMETRICSA im_orig;
1760 ICONMETRICSA im_new;
1761 ICONMETRICSA im_cur;
1762 INT regval;
1763
1764 im_orig.cbSize = sizeof(ICONMETRICSA);
1765 im_new.cbSize = sizeof(ICONMETRICSA);
1766 im_cur.cbSize = sizeof(ICONMETRICSA);
1767
1768 trace("testing SPI_{GET,SET}ICONMETRICS\n");
1769 SetLastError(0xdeadbeef);
1770 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_orig, FALSE );
1771 if (!test_error_msg(rc,"SPI_{GET,SET}ICONMETRICS"))
1772 return;
1773 /* check some registry values */
1775 ok( regval==im_orig.iHorzSpacing,
1776 "wrong value in registry %d, expected %d\n", regval, im_orig.iHorzSpacing);
1778 ok( regval==im_orig.iVertSpacing,
1779 "wrong value in registry %d, expected %d\n", regval, im_orig.iVertSpacing);
1781 if( regval != im_orig.iTitleWrap)
1783 ok( regval==im_orig.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_orig.iTitleWrap);
1784
1785 /* change everything without creating something invalid ( Win9x would ignore
1786 * an invalid font for instance) */
1787 im_cur = im_orig;
1788 im_cur.iHorzSpacing += 10;
1789 im_cur.iVertSpacing += 6;
1790 im_cur.iTitleWrap = !im_cur.iTitleWrap;
1791 im_cur.lfFont.lfHeight += 1;
1792 im_cur.lfFont.lfWidth += 2;
1793 im_cur.lfFont.lfEscapement = 1;
1794 im_cur.lfFont.lfWeight = im_cur.lfFont.lfWeight > 100 ? 1 : 314;
1795 im_cur.lfFont.lfItalic = !im_cur.lfFont.lfItalic;
1796 im_cur.lfFont.lfStrikeOut = !im_cur.lfFont.lfStrikeOut;
1797 im_cur.lfFont.lfUnderline = !im_cur.lfFont.lfUnderline;
1798 im_cur.lfFont.lfCharSet = im_cur.lfFont.lfCharSet ? 0 : 1;
1799 im_cur.lfFont.lfOutPrecision = im_cur.lfFont.lfOutPrecision == OUT_DEFAULT_PRECIS ?
1801 im_cur.lfFont.lfClipPrecision ^= CLIP_LH_ANGLES;
1802 im_cur.lfFont.lfPitchAndFamily = im_cur.lfFont.lfPitchAndFamily ? 0 : 1;
1803 im_cur.lfFont.lfQuality = im_cur.lfFont.lfQuality == DEFAULT_QUALITY ?
1805 if( strcmp( im_cur.lfFont.lfFaceName, "MS Serif"))
1806 strcpy( im_cur.lfFont.lfFaceName, "MS Serif");
1807 else
1808 strcpy( im_cur.lfFont.lfFaceName, "MS Sans Serif");
1809
1810 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_cur, SPIF_UPDATEINIFILE );
1811 if (!test_error_msg(rc,"SPI_SETICONMETRICS")) return;
1812 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1813
1814 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1815 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1816 /* test GET <-> SETICONMETRICS */
1817 eq( im_new.iHorzSpacing, im_cur.iHorzSpacing, "iHorzSpacing", "%d" );
1818 eq( im_new.iVertSpacing, im_cur.iVertSpacing, "iVertSpacing", "%d" );
1819 eq( im_new.iTitleWrap, im_cur.iTitleWrap, "iTitleWrap", "%d" );
1820 eq( im_new.lfFont.lfHeight, im_cur.lfFont.lfHeight, "lfHeight", "%ld" );
1821 eq( im_new.lfFont.lfWidth, im_cur.lfFont.lfWidth, "lfWidth", "%ld" );
1822 eq( im_new.lfFont.lfEscapement, im_cur.lfFont.lfEscapement, "lfEscapement", "%ld" );
1823 eq( im_new.lfFont.lfWeight, im_cur.lfFont.lfWeight, "lfWeight", "%ld" );
1824 eq( im_new.lfFont.lfItalic, im_cur.lfFont.lfItalic, "lfItalic", "%d" );
1825 eq( im_new.lfFont.lfStrikeOut, im_cur.lfFont.lfStrikeOut, "lfStrikeOut", "%d" );
1826 eq( im_new.lfFont.lfUnderline, im_cur.lfFont.lfUnderline, "lfUnderline", "%d" );
1827 eq( im_new.lfFont.lfCharSet, im_cur.lfFont.lfCharSet, "lfCharSet", "%d" );
1828 eq( im_new.lfFont.lfOutPrecision, im_cur.lfFont.lfOutPrecision, "lfOutPrecision", "%d" );
1829 eq( im_new.lfFont.lfClipPrecision, im_cur.lfFont.lfClipPrecision, "lfClipPrecision", "%d" );
1830 eq( im_new.lfFont.lfPitchAndFamily, im_cur.lfFont.lfPitchAndFamily, "lfPitchAndFamily", "%d" );
1831 eq( im_new.lfFont.lfQuality, im_cur.lfFont.lfQuality, "lfQuality", "%d" );
1832 ok( !strcmp( im_new.lfFont.lfFaceName, im_cur.lfFont.lfFaceName),
1833 "wrong facename \"%s\", should be \"%s\"\n", im_new.lfFont.lfFaceName,
1834 im_cur.lfFont.lfFaceName);
1835 /* test some system metrics */
1837 im_new.iHorzSpacing, "iHorzSpacing", "%d" );
1839 im_new.iVertSpacing, "iVertSpacing", "%d" );
1840 /* check some registry values */
1842 ok( regval==im_cur.iHorzSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iHorzSpacing);
1844 ok( regval==im_cur.iVertSpacing, "wrong value in registry %d, expected %d\n", regval, im_cur.iVertSpacing);
1846 if( regval != im_cur.iTitleWrap)
1848 ok( regval==im_cur.iTitleWrap, "wrong value in registry %d, expected %d\n", regval, im_cur.iTitleWrap);
1849 /* test some values from other SPI_GETxxx calls */
1850 rc = SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &spacing, 0 );
1851 ok( rc && spacing == im_cur.iHorzSpacing,
1852 "SystemParametersInfoA( SPI_ICONHORIZONTALSPACING...) failed or returns wrong value %d instead of %d\n",
1853 spacing, im_cur.iHorzSpacing);
1854 rc = SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &spacing, 0 );
1855 ok( rc && spacing == im_cur.iVertSpacing,
1856 "SystemParametersInfoA( SPI_ICONVERTICALSPACING...) failed or returns wrong value %d instead of %d\n",
1857 spacing, im_cur.iVertSpacing);
1859 ok( rc && wrap == im_cur.iTitleWrap,
1860 "SystemParametersInfoA( SPI_GETICONTITLEWRAP...) failed or returns wrong value %d instead of %d\n",
1861 wrap, im_cur.iTitleWrap);
1862 /* restore old values */
1863 rc=SystemParametersInfoA( SPI_SETICONMETRICS, sizeof(ICONMETRICSA), &im_orig,SPIF_UPDATEINIFILE );
1864 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1866
1867 rc=SystemParametersInfoA( SPI_GETICONMETRICS, sizeof(ICONMETRICSA), &im_new, FALSE );
1868 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1869
1870 eq( im_new.iHorzSpacing, im_orig.iHorzSpacing, "iHorzSpacing", "%d" );
1871 eq( im_new.iVertSpacing, im_orig.iVertSpacing, "iVertSpacing", "%d" );
1872 eq( im_new.iTitleWrap, im_orig.iTitleWrap, "iTitleWrap", "%d" );
1873}
1874
1875static void test_SPI_SETWORKAREA( void ) /* 47 */
1876{
1877 BOOL rc;
1878 RECT old_area;
1879 RECT area;
1880 RECT curr_val;
1881
1882 trace("testing SPI_{GET,SET}WORKAREA\n");
1883 SetLastError(0xdeadbeef);
1884 rc=SystemParametersInfoA(SPI_GETWORKAREA, 0, &old_area, 0);
1885 if (!test_error_msg(rc,"SPI_{GET,SET}WORKAREA"))
1886 return;
1887
1888 /* Modify the work area only minimally as this causes the icons that
1889 * fall outside it to be moved around thus requiring the user to
1890 * reposition them manually one by one.
1891 * Changing the work area by just one pixel should make this occurrence
1892 * reasonably unlikely.
1893 */
1894 SetRect(&curr_val, old_area.left, old_area.top, old_area.right - 1, old_area.bottom - 1);
1895 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &curr_val,
1897 if (!test_error_msg(rc,"SPI_SETWORKAREA")) return;
1898 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1899 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1900 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1901 if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */
1902 test_change_message( SPI_SETWORKAREA, 0);
1903 eq( area.left, curr_val.left, "left", "%ld" );
1904 eq( area.top, curr_val.top, "top", "%ld" );
1905 /* size may be rounded */
1906 ok( area.right >= curr_val.right - 16 && area.right < curr_val.right + 16,
1907 "right: got %ld instead of %ld\n", area.right, curr_val.right );
1908 ok( area.bottom >= curr_val.bottom - 16 && area.bottom < curr_val.bottom + 16,
1909 "bottom: got %ld instead of %ld\n", area.bottom, curr_val.bottom );
1910 curr_val = area;
1911 rc=SystemParametersInfoA( SPI_SETWORKAREA, 0, &old_area,
1913 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1914 rc=SystemParametersInfoA( SPI_GETWORKAREA, 0, &area, 0 );
1915 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
1916 if( !EqualRect( &area, &curr_val)) /* no message if rect has not changed */
1917 test_change_message( SPI_SETWORKAREA, 0 );
1918 eq( area.left, old_area.left, "left", "%ld" );
1919 eq( area.top, old_area.top, "top", "%ld" );
1920 /* size may be rounded */
1921 ok( area.right >= old_area.right - 16 && area.right < old_area.right + 16,
1922 "right: got %ld instead of %ld\n", area.right, old_area.right );
1923 ok( area.bottom >= old_area.bottom - 16 && area.bottom < old_area.bottom + 16,
1924 "bottom: got %ld instead of %ld\n", area.bottom, old_area.bottom );
1926}
1927
1928static void test_SPI_SETSHOWSOUNDS( void ) /* 57 */
1929{
1930 BOOL rc;
1931 BOOL old_b;
1932 const UINT vals[]={TRUE,FALSE};
1933 unsigned int i;
1934
1935 trace("testing SPI_{GET,SET}SHOWSOUNDS\n");
1936 SetLastError(0xdeadbeef);
1937 rc=SystemParametersInfoA( SPI_GETSHOWSOUNDS, 0, &old_b, 0 );
1938 if (!test_error_msg(rc,"SPI_{GET,SET}SHOWSOUNDS"))
1939 return;
1940
1941 for (i=0;i<ARRAY_SIZE(vals);i++)
1942 {
1943 UINT v;
1944
1947 if (!test_error_msg(rc,"SPI_SETSHOWSOUNDS")) return;
1948 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1952 vals[i] ? "1" : "0" );
1953
1955 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1956 eq( v, vals[i], "SPI_GETSHOWSOUNDS", "%d" );
1957 eq( GetSystemMetrics( SM_SHOWSOUNDS ), (int)vals[i],
1958 "SM_SHOWSOUNDS", "%d" );
1959 }
1960
1962 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
1964}
1965
1966static void test_SPI_SETKEYBOARDPREF( void ) /* 69 */
1967{
1968 BOOL rc;
1969 BOOL vals[2];
1970 unsigned int i;
1971
1972 trace("testing SPI_{GET,SET}KEYBOARDPREF\n");
1973 SetLastError(0xdeadbeef);
1974 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &vals[1], 0 );
1975 if (!test_error_msg(rc,"SPI_{GET,SET}KEYBOARDPREF"))
1976 return;
1977 vals[0] = !vals[1];
1978
1979 for (i=0;i<ARRAY_SIZE(vals);i++)
1980 {
1981 BOOL v;
1982
1983 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, vals[i], 0,
1985 if (!test_error_msg(rc,"SPI_SETKEYBOARDPREF")) break;
1986 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1987 test_change_message( SPI_SETKEYBOARDPREF, 1 );
1990 vals[i] ? "1" : "0" );
1991
1992 rc=SystemParametersInfoA( SPI_GETKEYBOARDPREF, 0, &v, 0 );
1993 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
1994 eq( v, (BOOL)vals[i], "SPI_GETKEYBOARDPREF", "%d" );
1995 }
1996
1997 rc=SystemParametersInfoA( SPI_SETKEYBOARDPREF, vals[1], 0, SPIF_UPDATEINIFILE );
1998 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2000}
2001
2002static void test_SPI_SETSCREENREADER( void ) /* 71 */
2003{
2004 BOOL rc;
2005 BOOL old_b;
2006 const UINT vals[]={TRUE,FALSE};
2007 unsigned int i;
2008
2009 trace("testing SPI_{GET,SET}SCREENREADER\n");
2010 SetLastError(0xdeadbeef);
2011 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &old_b, 0 );
2012 if (!test_error_msg(rc,"SPI_{GET,SET}SCREENREADER"))
2013 return;
2014
2015 for (i=0;i<ARRAY_SIZE(vals);i++)
2016 {
2017 BOOL v;
2018
2019 rc=SystemParametersInfoA( SPI_SETSCREENREADER, vals[i], 0,
2021 if (!test_error_msg(rc,"SPI_SETSCREENREADER")) return;
2022 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2023 test_change_message( SPI_SETSCREENREADER, 1 );
2026 vals[i] ? "1" : "0" );
2027
2028 rc=SystemParametersInfoA( SPI_GETSCREENREADER, 0, &v, 0 );
2029 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2030 eq( v, (BOOL)vals[i], "SPI_GETSCREENREADER", "%d" );
2031 }
2032
2033 rc=SystemParametersInfoA( SPI_SETSCREENREADER, old_b, 0, SPIF_UPDATEINIFILE );
2034 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2036}
2037
2038static void test_SPI_SETFONTSMOOTHING( void ) /* 75 */
2039{
2040 BOOL rc;
2041 BOOL old_b;
2042 DWORD old_type, old_contrast, old_orient;
2043 const UINT vals[]={0xffffffff,0,1,2};
2044 unsigned int i;
2045
2046 trace("testing SPI_{GET,SET}FONTSMOOTHING\n");
2047 SetLastError(0xdeadbeef);
2048 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &old_b, 0 );
2049 if (!test_error_msg(rc,"SPI_{GET,SET}FONTSMOOTHING"))
2050 return;
2051 SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE, 0, &old_type, 0 );
2052 SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST, 0, &old_contrast, 0 );
2053 SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION, 0, &old_orient, 0 );
2054
2055 for (i=0;i<ARRAY_SIZE(vals);i++)
2056 {
2057 UINT v;
2058
2059 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, vals[i], 0,
2061 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHING")) return;
2062 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2063 test_change_message( SPI_SETFONTSMOOTHING, 0 );
2066 vals[i] ? "2" : "0" );
2067
2068 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE, 0, UlongToPtr(vals[i]),
2070 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGTYPE")) return;
2071 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2072 test_change_message( SPI_SETFONTSMOOTHINGTYPE, 0 );
2075
2076 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST, 0, UlongToPtr(vals[i]),
2078 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGCONTRAST")) return;
2079 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2080 test_change_message( SPI_SETFONTSMOOTHINGCONTRAST, 0 );
2083
2084 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION, 0, UlongToPtr(vals[i]),
2086 if (!test_error_msg(rc,"SPI_SETFONTSMOOTHINGORIENTATION")) return;
2087 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2088 test_change_message( SPI_SETFONTSMOOTHINGORIENTATION, 0 );
2091
2092 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHING, 0, &v, 0 );
2093 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2094 eq( v, vals[i] ? 1 : 0, "SPI_GETFONTSMOOTHING", "%d" );
2095
2096 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGTYPE, 0, &v, 0 );
2097 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2098 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2099
2100 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGCONTRAST, 0, &v, 0 );
2101 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2102 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2103
2104 rc=SystemParametersInfoA( SPI_GETFONTSMOOTHINGORIENTATION, 0, &v, 0 );
2105 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2106 ok( v == vals[i], "wrong value %x/%x\n", v, vals[i] );
2107 }
2108
2109 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHING, old_b, 0, SPIF_UPDATEINIFILE );
2110 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2111 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGTYPE, old_type, 0, SPIF_UPDATEINIFILE );
2112 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2113 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGCONTRAST, old_contrast, 0, SPIF_UPDATEINIFILE );
2114 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2115 rc=SystemParametersInfoA( SPI_SETFONTSMOOTHINGORIENTATION, old_orient, 0, SPIF_UPDATEINIFILE );
2116 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2118}
2119
2120static void test_SPI_SETLOWPOWERACTIVE( void ) /* 85 */
2121{
2122 BOOL rc;
2123 BOOL old_b;
2124 const UINT vals[]={TRUE,FALSE};
2125 unsigned int i;
2126
2127 trace("testing SPI_{GET,SET}LOWPOWERACTIVE\n");
2128 SetLastError(0xdeadbeef);
2129 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &old_b, 0 );
2130 if (!test_error_msg(rc,"SPI_{GET,SET}LOWPOWERACTIVE"))
2131 return;
2132
2133 for (i=0;i<ARRAY_SIZE(vals);i++)
2134 {
2135 UINT v;
2136
2137 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, vals[i], 0,
2139 if (!test_error_msg(rc,"SPI_SETLOWPOWERACTIVE")) return;
2140 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2141 test_change_message( SPI_SETLOWPOWERACTIVE, 1 );
2144 vals[i] ? "1" : "0" );
2145
2146 /* SPI_SETLOWPOWERACTIVE is not persistent in win2k3 and above */
2147 v = 0xdeadbeef;
2148 rc=SystemParametersInfoA( SPI_GETLOWPOWERACTIVE, 0, &v, 0 );
2149 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2150 ok(v == vals[i] || v == 0, /* win2k3 */
2151 "SPI_GETLOWPOWERACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
2152 }
2153
2154 rc=SystemParametersInfoA( SPI_SETLOWPOWERACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
2155 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2157}
2158
2159static void test_SPI_SETPOWEROFFACTIVE( void ) /* 86 */
2160{
2161 BOOL rc;
2162 BOOL old_b;
2163 const UINT vals[]={TRUE,FALSE};
2164 unsigned int i;
2165
2166 trace("testing SPI_{GET,SET}POWEROFFACTIVE\n");
2167 SetLastError(0xdeadbeef);
2168 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &old_b, 0 );
2169 if (!test_error_msg(rc,"SPI_{GET,SET}POWEROFFACTIVE"))
2170 return;
2171
2172 for (i=0;i<ARRAY_SIZE(vals);i++)
2173 {
2174 UINT v;
2175
2176 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, vals[i], 0,
2178 if (!test_error_msg(rc,"SPI_SETPOWEROFFACTIVE")) return;
2179 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2180 test_change_message( SPI_SETPOWEROFFACTIVE, 1 );
2183 vals[i] ? "1" : "0" );
2184
2185 /* SPI_SETPOWEROFFACTIVE is not persistent in win2k3 and above */
2186 v = 0xdeadbeef;
2187 rc=SystemParametersInfoA( SPI_GETPOWEROFFACTIVE, 0, &v, 0 );
2188 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2189 ok(v == vals[i] || v == 0, /* win2k3 */
2190 "SPI_GETPOWEROFFACTIVE: got %d instead of 0 or %d\n", v, vals[i]);
2191 }
2192
2193 rc=SystemParametersInfoA( SPI_SETPOWEROFFACTIVE, old_b, 0, SPIF_UPDATEINIFILE );
2194 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2196}
2197
2198static void test_SPI_SETSNAPTODEFBUTTON( void ) /* 95 */
2199{
2200 BOOL rc;
2201 BOOL old_b;
2202 const UINT vals[]={TRUE,FALSE};
2203 unsigned int i;
2204
2205 trace("testing SPI_{GET,SET}SNAPTODEFBUTTON\n");
2206 SetLastError(0xdeadbeef);
2207 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &old_b, 0 );
2208 if (!test_error_msg(rc,"SPI_GETSNAPTODEFBUTTON"))
2209 return;
2210
2211 for (i=0;i<ARRAY_SIZE(vals);i++)
2212 {
2213 UINT v;
2214
2215 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, vals[i], 0,
2217 if (!test_error_msg(rc,"SPI_SETSNAPTODEFBUTTON")) return;
2218 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2219 test_change_message( SPI_SETSNAPTODEFBUTTON, 0 );
2222 vals[i] ? "1" : "0" );
2223
2224 rc=SystemParametersInfoA( SPI_GETSNAPTODEFBUTTON, 0, &v, 0 );
2225 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2226 eq( v, vals[i], "SPI_GETSNAPTODEFBUTTON", "%d" );
2227 }
2228
2229 rc=SystemParametersInfoA( SPI_SETSNAPTODEFBUTTON, old_b, 0, SPIF_UPDATEINIFILE );
2230 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2232}
2233
2234static void test_SPI_SETMOUSEHOVERWIDTH( void ) /* 99 */
2235{
2236 BOOL rc;
2237 UINT old_width;
2238 const UINT vals[]={0,32767};
2239 unsigned int i;
2240
2241 trace("testing SPI_{GET,SET}MOUSEHOVERWIDTH\n");
2242 SetLastError(0xdeadbeef);
2243 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &old_width, 0 );
2244 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERWIDTH"))
2245 return;
2246
2247 for (i=0;i<ARRAY_SIZE(vals);i++)
2248 {
2249 UINT v;
2250 char buf[10];
2251
2252 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, vals[i], 0,
2254 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERWIDTH")) return;
2255 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2256 test_change_message( SPI_SETMOUSEHOVERWIDTH, 0 );
2257 sprintf( buf, "%d", vals[i] );
2260
2261 SystemParametersInfoA( SPI_GETMOUSEHOVERWIDTH, 0, &v, 0 );
2262 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2263 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERWIDTH", "%d" );
2264 }
2265
2266 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERWIDTH, old_width, 0,
2268 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2270}
2271
2272static void test_SPI_SETMOUSEHOVERHEIGHT( void ) /* 101 */
2273{
2274 BOOL rc;
2275 UINT old_height;
2276 const UINT vals[]={0,32767};
2277 unsigned int i;
2278
2279 trace("testing SPI_{GET,SET}MOUSEHOVERHEIGHT\n");
2280 SetLastError(0xdeadbeef);
2281 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &old_height, 0 );
2282 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERHEIGHT"))
2283 return;
2284
2285 for (i=0;i<ARRAY_SIZE(vals);i++)
2286 {
2287 UINT v;
2288 char buf[10];
2289
2290 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, vals[i], 0,
2292 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERHEIGHT")) return;
2293 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2294 test_change_message( SPI_SETMOUSEHOVERHEIGHT, 0 );
2295 sprintf( buf, "%d", vals[i] );
2298
2299 SystemParametersInfoA( SPI_GETMOUSEHOVERHEIGHT, 0, &v, 0 );
2300 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2301 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERHEIGHT", "%d" );
2302 }
2303
2304 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERHEIGHT, old_height, 0,
2306 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2308}
2309
2310static void test_SPI_SETMOUSEHOVERTIME( void ) /* 103 */
2311{
2312 BOOL rc;
2313 UINT old_time;
2314
2315 /* Windows XP accepts 10 as the minimum hover time. Any value below will be
2316 * defaulted to a value of 10 automatically.
2317 */
2318 const UINT vals[]={10,32767};
2319 unsigned int i;
2320
2321 trace("testing SPI_{GET,SET}MOUSEHOVERTIME\n");
2322 SetLastError(0xdeadbeef);
2323 rc=SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &old_time, 0 );
2324 if (!test_error_msg(rc,"SPI_{GET,SET}MOUSEHOVERTIME"))
2325 return;
2326
2327 for (i=0;i<ARRAY_SIZE(vals);i++)
2328 {
2329 UINT v;
2330 char buf[10];
2331
2332 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, vals[i], 0,
2334 if (!test_error_msg(rc,"SPI_SETMOUSEHOVERTIME")) return;
2335 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2336 test_change_message( SPI_SETMOUSEHOVERTIME, 0 );
2337 sprintf( buf, "%d", vals[i] );
2340
2341 SystemParametersInfoA( SPI_GETMOUSEHOVERTIME, 0, &v, 0 );
2342 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2343 eq( v, vals[i], "SPI_{GET,SET}MOUSEHOVERTIME", "%d" );
2344 }
2345
2346 rc=SystemParametersInfoA( SPI_SETMOUSEHOVERTIME, old_time, 0,
2348 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2350}
2351
2352static void test_SPI_SETWHEELSCROLLLINES( void ) /* 105 */
2353{
2354 BOOL rc;
2355 UINT old_lines;
2356 const UINT vals[]={0,32767};
2357 unsigned int i;
2358
2359 trace("testing SPI_{GET,SET}WHEELSCROLLLINES\n");
2360 SetLastError(0xdeadbeef);
2361 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &old_lines, 0 );
2362
2363 /* SPI_{GET,SET}WHEELSCROLLLINES not supported on Windows 95 */
2364 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLLINES"))
2365 return;
2366
2367 for (i=0;i<ARRAY_SIZE(vals);i++)
2368 {
2369 UINT v;
2370 char buf[10];
2371
2374 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLLINES")) return;
2375 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2377 sprintf( buf, "%d", vals[i] );
2380
2381 SystemParametersInfoA( SPI_GETWHEELSCROLLLINES, 0, &v, 0 );
2382 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2383 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLLINES", "%d" );
2384 }
2385
2388 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2390}
2391
2392static void test_SPI_SETMENUSHOWDELAY( void ) /* 107 */
2393{
2394 BOOL rc;
2395 UINT old_delay;
2396 const UINT vals[]={0,32767};
2397 unsigned int i;
2398
2399 trace("testing SPI_{GET,SET}MENUSHOWDELAY\n");
2400 SetLastError(0xdeadbeef);
2401 rc=SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &old_delay, 0 );
2402
2403 /* SPI_{GET,SET}MENUSHOWDELAY not supported on Windows 95 */
2404 if (!test_error_msg(rc,"SPI_{GET,SET}MENUSHOWDELAY"))
2405 return;
2406
2407 for (i=0;i<ARRAY_SIZE(vals);i++)
2408 {
2409 UINT v;
2410 char buf[10];
2411
2412 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, vals[i], 0,
2414 if (!test_error_msg(rc,"SPI_SETMENUSHOWDELAY")) return;
2415 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2416 test_change_message( SPI_SETMENUSHOWDELAY, 0 );
2417 sprintf( buf, "%d", vals[i] );
2420
2421 SystemParametersInfoA( SPI_GETMENUSHOWDELAY, 0, &v, 0 );
2422 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2423 eq( v, vals[i], "SPI_{GET,SET}MENUSHOWDELAY", "%d" );
2424 }
2425
2426 rc=SystemParametersInfoA( SPI_SETMENUSHOWDELAY, old_delay, 0,
2428 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2430}
2431
2432static void test_SPI_SETWHEELSCROLLCHARS( void ) /* 108 */
2433{
2434 BOOL rc;
2435 UINT old_chars;
2436 const UINT vals[]={32767,0};
2437 unsigned int i;
2438
2439 trace("testing SPI_{GET,SET}WHEELSCROLLCHARS\n");
2440 SetLastError(0xdeadbeef);
2441 rc=SystemParametersInfoA( SPI_GETWHEELSCROLLCHARS, 0, &old_chars, 0 );
2442
2443 /* SPI_{GET,SET}WHEELSCROLLCHARS not supported on Windows 95 */
2444 if (!test_error_msg(rc,"SPI_{GET,SET}WHEELSCROLLCHARS"))
2445 return;
2446
2447 for (i=0;i<ARRAY_SIZE(vals);i++)
2448 {
2449 UINT v;
2450 char buf[10];
2451
2452 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, vals[i], 0,
2454 if (!test_error_msg(rc,"SPI_SETWHEELSCROLLCHARS")) return;
2455 test_change_message( SPI_SETWHEELSCROLLCHARS, 0 );
2456 sprintf( buf, "%d", vals[i] );
2459
2461 ok(rc, "%d: rc=%d err=%ld\n", i, rc, GetLastError());
2462 eq( v, vals[i], "SPI_{GET,SET}WHEELSCROLLCHARS", "%d" );
2463 }
2464
2465 rc=SystemParametersInfoA( SPI_SETWHEELSCROLLCHARS, old_chars, 0,
2467 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2469}
2470
2471static void test_SPI_SETWALLPAPER( void ) /* 115 */
2472{
2473 BOOL rc;
2474 char oldval[260];
2475 char newval[260];
2476
2477 trace("testing SPI_{GET,SET}DESKWALLPAPER\n");
2478 SetLastError(0xdeadbeef);
2479 rc=SystemParametersInfoA(SPI_GETDESKWALLPAPER, 260, oldval, 0);
2480 if (!test_error_msg(rc,"SPI_{GET,SET}DESKWALLPAPER"))
2481 return;
2482
2483 strcpy(newval, "");
2485 if (!test_error_msg(rc,"SPI_SETDESKWALLPAPER")) return;
2486 ok(rc, "SystemParametersInfoA: rc=%d err=%ld\n", rc, GetLastError());
2488
2490 ok(rc, "***warning*** failed to restore the original value: rc=%d err=%ld\n", rc, GetLastError());
2491
2494}
2495
2496static void test_WM_DISPLAYCHANGE(void)
2497{
2498 UINT test_bpps[] = {8, 16, 24}, default_bpp, i;
2500 DWORD res;
2501 BOOL ret;
2502
2505
2506 memset( &settings, 0, sizeof(DEVMODEW) );
2507 settings.dmSize = sizeof(DEVMODEW);
2509 ok( ret, "EnumDisplaySettingsW failed, error %#lx\n", GetLastError() );
2510
2511 ok( settings.dmFields & DM_BITSPERPEL, "got dmFields %#lx\n", settings.dmFields );
2512#ifdef __REACTOS__
2513 ok( settings.dmBitsPerPel == 32 || settings.dmBitsPerPel == 24 /* ROS testbot */, "got dmBitsPerPel %lu\n", settings.dmBitsPerPel );
2514#else
2515 ok( settings.dmBitsPerPel == 32, "got dmBitsPerPel %lu\n", settings.dmBitsPerPel );
2516#endif
2517 default_bpp = settings.dmBitsPerPel;
2518
2519 /* setting default mode most of the time doesn't send WM_DISPLAYCHANGE,
2520 * it only does the first time ChangeDisplaySettingsExW is called */
2521
2522 last_bpp = -1;
2523 change_counter = 0;
2526 ok( !res, "ChangeDisplaySettingsExW returned %ld\n", res );
2528 todo_wine
2529 ok( res == WAIT_TIMEOUT || broken( !res ), "WaitForSingleObject returned %#lx\n", res );
2530 todo_wine
2531 ok( last_bpp == -1 || broken( last_bpp == default_bpp ), "got WM_DISPLAYCHANGE bpp %d\n", last_bpp );
2533
2534 for (i = 0; i < ARRAY_SIZE(test_bpps); i++)
2535 {
2536 UINT bpp = test_bpps[i];
2537
2538 winetest_push_context( "bpp %u", bpp );
2539
2540 settings.dmBitsPerPel = bpp;
2541 settings.dmFields |= DM_BITSPERPEL;
2542
2543 last_bpp = -1;
2544 change_counter = 0;
2547 if (!res)
2548 {
2549 /* Wait quite long for the message, screen setting changes can take some time */
2551 ok( !res, "WaitForSingleObject returned %#lx\n", res );
2552 ok( last_bpp == bpp, "got WM_DISPLAYCHANGE bpp %d\n", last_bpp );
2553 }
2554 else
2555 {
2556 todo_wine
2557 win_skip( "ChangeDisplaySettingsExW returned %ld\n", res );
2559 "ChangeDisplaySettingsExW returned %ld\n", res );
2560 ok( last_bpp == -1, "got WM_DISPLAYCHANGE bpp %d\n", last_bpp );
2561 }
2563
2565 }
2566
2567 /* restoring default mode most of the time doesn't send WM_DISPLAYCHANGE */
2568
2569 settings.dmBitsPerPel = default_bpp;
2570 settings.dmFields |= DM_BITSPERPEL;
2571
2572 last_bpp = -1;
2573 change_counter = 0;
2576 ok( !res, "ChangeDisplaySettingsExW returned %ld\n", res );
2578 todo_wine
2579 ok( res == WAIT_TIMEOUT || broken( !res ), "WaitForSingleObject returned %#lx\n", res );
2580 todo_wine
2581 ok( last_bpp == -1 || broken( last_bpp == default_bpp ), "got WM_DISPLAYCHANGE bpp %d\n", last_bpp );
2583
2587}
2588
2589/*
2590 * Registry entries for the system parameters.
2591 * Names are created by 'SET' flags names.
2592 * We assume that corresponding 'GET' entries use the same registry keys.
2593 */
2595{
2596 test_SPI_SETBEEP(); /* 1 */
2597 test_SPI_SETMOUSE(); /* 4 */
2598 test_SPI_SETBORDER(); /* 6 */
2599 test_SPI_SETKEYBOARDSPEED(); /* 10 */
2603 test_SPI_SETGRIDGRANULARITY(); /* 19 */
2604 test_SPI_SETKEYBOARDDELAY(); /* 23 */
2606 test_SPI_SETICONTITLEWRAP(); /* 26 */
2608 test_SPI_SETDOUBLECLKWIDTH(); /* 29 */
2609 test_SPI_SETDOUBLECLKHEIGHT(); /* 30 */
2610 test_SPI_SETDOUBLECLICKTIME(); /* 32 */
2611 test_SPI_SETMOUSEBUTTONSWAP(); /* 33 */
2612 test_SPI_SETFASTTASKSWITCH(); /* 36 */
2613 test_SPI_SETDRAGFULLWINDOWS(); /* 37 */
2614 /* test_WM_DISPLAYCHANGE seems to be somewhat buggy on
2615 * some versions of Windows (Vista, Win2k8, Win7B) in that
2616 * not all metrics are properly restored. Problems are
2617 * SM_CXMAXTRACK, SM_CYMAXTRACK
2618 * Fortunately setting the Non-Client metrics like in
2619 * test_SPI_SETNONCLIENTMETRICS will correct this. That is why
2620 * we do the DISPLAY change now... */
2624 test_SPI_SETICONMETRICS(); /* 46 */
2625 test_SPI_SETWORKAREA(); /* 47 */
2626 test_SPI_SETSHOWSOUNDS(); /* 57 */
2627 test_SPI_SETKEYBOARDPREF(); /* 69 */
2628 test_SPI_SETSCREENREADER(); /* 71 */
2629 test_SPI_SETFONTSMOOTHING(); /* 75 */
2630 test_SPI_SETLOWPOWERACTIVE(); /* 85 */
2631 test_SPI_SETPOWEROFFACTIVE(); /* 86 */
2632 test_SPI_SETSNAPTODEFBUTTON(); /* 95 */
2633 test_SPI_SETMOUSEHOVERWIDTH(); /* 99 */
2634 test_SPI_SETMOUSEHOVERHEIGHT(); /* 101 */
2635 test_SPI_SETMOUSEHOVERTIME(); /* 103 */
2636 test_SPI_SETWHEELSCROLLLINES(); /* 105 */
2637 test_SPI_SETMENUSHOWDELAY(); /* 107 */
2638 test_SPI_SETWHEELSCROLLCHARS(); /* 108 */
2639 test_SPI_SETWALLPAPER(); /* 115 */
2640
2641
2643 return 0;
2644}
2645
2646/* test calculation of GetSystemMetrics values (mostly) from non client metrics,
2647 * icon metrics and minimized metrics.
2648 */
2649
2650/* copied from wine's GdiGetCharDimensions, which is not available on most
2651 * windows versions */
2653{
2654 SIZE sz;
2655 static const CHAR alphabet[] = {
2656 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
2657 'r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H',
2658 'I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',0};
2659
2660 if(lptm && !GetTextMetricsA(hdc, lptm)) return 0;
2661
2662 if(!GetTextExtentPointA(hdc, alphabet, 52, &sz)) return 0;
2663
2664 if (height) *height = sz.cy;
2665 return (sz.cx / 26 + 1) / 2;
2666}
2667
2668/* get text metrics and/or "average" char width of the specified logfont
2669 * for the specified dc */
2670static void get_text_metr_size( HDC hdc, LOGFONTA *plf, TEXTMETRICA * ptm, UINT *psz)
2671{
2672 HFONT hfont, hfontsav;
2674 if( !ptm) ptm = &tm;
2675 hfont = CreateFontIndirectA( plf);
2676 if( !hfont || ( hfontsav = SelectObject( hdc, hfont)) == NULL ) {
2677 ptm->tmHeight = -1;
2678 if( psz) *psz = 10;
2679 if( hfont) DeleteObject( hfont);
2680 return;
2681 }
2682 GetTextMetricsA( hdc, ptm);
2683 if( psz)
2684 if( !(*psz = _GdiGetCharDimensions( hdc, ptm, NULL)))
2685 *psz = 10;
2686 SelectObject( hdc, hfontsav);
2688}
2689
2690static int gsm_error_ctr;
2691
2692#define ok_gsm( i, e)\
2693{\
2694 int exp = (e);\
2695 int act = GetSystemMetrics( (i));\
2696 if( exp != act) gsm_error_ctr++;\
2697 ok( !( exp != act),"GetSystemMetrics(%s): expected %d actual %d\n", #i, exp,act);\
2698}
2699#define ok_gsm_2( i, e1, e2)\
2700{\
2701 int exp1 = (e1);\
2702 int exp2 = (e2);\
2703 int act = GetSystemMetrics( (i));\
2704 if( exp1 != act && exp2 != act) gsm_error_ctr++;\
2705 ok( !( exp1 != act && exp2 != act), "GetSystemMetrics(%s): expected %d or %d actual %d\n", #i, exp1, exp2, act);\
2706}
2707#define ok_gsm_3( i, e1, e2, e3)\
2708{\
2709 int exp1 = (e1);\
2710 int exp2 = (e2);\
2711 int exp3 = (e3);\
2712 int act = GetSystemMetrics( (i));\
2713 if( exp1 != act && exp2 != act && exp3 != act) gsm_error_ctr++;\
2714 ok( !( exp1 != act && exp2 != act && exp3 != act),"GetSystemMetrics(%s): expected %d or %d or %d actual %d\n", #i, exp1, exp2, exp3, act);\
2715}
2716
2718{
2719 return lstrcmpiA(elf->lfFaceName, (const char *)lparam);
2720}
2721
2722static BOOL is_font_enumerated(const char *name)
2723{
2725 BOOL ret = FALSE;
2726
2728 ret = TRUE;
2729
2730 DeleteDC(hdc);
2731 return ret;
2732}
2733
2734static int get_cursor_size( int size )
2735{
2736 /* only certain sizes are allowed for cursors */
2737 if (size >= 64) return 64;
2738 if (size >= 48) return 48;
2739 return 32;
2740}
2741
2742static void test_GetSystemMetrics( void)
2743{
2744 TEXTMETRICA tmMenuFont;
2745 UINT IconSpacing, IconVerticalSpacing;
2746 BOOL rc;
2747
2748 HDC hdc = CreateICA( "Display", 0, 0, 0);
2749 UINT avcwCaption;
2750 INT CaptionWidthfromreg, width, smicon, broken_val;
2751 MINIMIZEDMETRICS minim;
2752 NONCLIENTMETRICSA ncm;
2753 SIZE screen;
2754
2755 assert(sizeof(ncm) == 344);
2756
2757 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
2758 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2759 ok(rc, "SystemParametersInfoA failed\n");
2760
2761 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth) - 1;
2762 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2763 ok(!rc, "SystemParametersInfoA should fail\n");
2764
2765 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth) + 1;
2766 SetLastError(0xdeadbeef);
2767 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2768 ok(!rc, "SystemParametersInfoA should fail\n");
2769
2770 ncm.cbSize = sizeof(ncm); /* Vista added padding */
2771 SetLastError(0xdeadbeef);
2772 ncm.iPaddedBorderWidth = 0xcccc;
2773 rc = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2774 ok(rc || broken(!rc) /* before Vista */, "SystemParametersInfoA failed\n");
2775 if (rc) ok( ncm.iPaddedBorderWidth == 0, "wrong iPaddedBorderWidth %u\n", ncm.iPaddedBorderWidth );
2776
2777 minim.cbSize = sizeof( minim);
2778 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
2779 SystemParametersInfoA( SPI_GETMINIMIZEDMETRICS, 0, &minim, 0);
2780 rc = SystemParametersInfoA( SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
2781 if( !rc) {
2782 win_skip("SPI_GETNONCLIENTMETRICS is not available\n");
2783 return;
2784 }
2785
2786 ok(is_font_enumerated(ncm.lfCaptionFont.lfFaceName), "font %s should be enumerated\n", ncm.lfCaptionFont.lfFaceName);
2787 ok(is_font_enumerated(ncm.lfSmCaptionFont.lfFaceName), "font %s should be enumerated\n", ncm.lfSmCaptionFont.lfFaceName);
2788 ok(is_font_enumerated(ncm.lfMenuFont.lfFaceName), "font %s should be enumerated\n", ncm.lfMenuFont.lfFaceName);
2789 ok(is_font_enumerated(ncm.lfStatusFont.lfFaceName), "font %s should be enumerated\n", ncm.lfStatusFont.lfFaceName);
2790 ok(is_font_enumerated(ncm.lfMessageFont.lfFaceName), "font %s should be enumerated\n", ncm.lfMessageFont.lfFaceName);
2791
2792 /* CaptionWidth from the registry may have different value of iCaptionWidth
2793 * from the non client metrics (observed on WinXP) */
2794 CaptionWidthfromreg = metricfromreg(
2795 "Control Panel\\Desktop\\WindowMetrics","CaptionWidth", dpi);
2796 get_text_metr_size( hdc, &ncm.lfMenuFont, &tmMenuFont, NULL);
2797 get_text_metr_size( hdc, &ncm.lfCaptionFont, NULL, &avcwCaption);
2798 /* FIXME: use icon metric */
2799 if( !SystemParametersInfoA( SPI_ICONVERTICALSPACING, 0, &IconVerticalSpacing, 0))
2800 IconVerticalSpacing = 0;
2801 if( !SystemParametersInfoA( SPI_ICONHORIZONTALSPACING, 0, &IconSpacing, 0 ))
2802 IconSpacing = 0;
2803 /* reset error counters */
2804 gsm_error_ctr = 0;
2805
2806 /* the tests: */
2807
2808 /* SM_CXSCREEN, cannot test these two */
2809 /* SM_CYSCREEN */
2810 ok_gsm( SM_CXVSCROLL, ncm.iScrollWidth);
2811 ok_gsm( SM_CYHSCROLL, ncm.iScrollWidth);
2812 ok_gsm( SM_CYCAPTION, ncm.iCaptionHeight+1);
2813 ok_gsm( SM_CXBORDER, 1);
2814 ok_gsm( SM_CYBORDER, 1);
2815 ok_gsm( SM_CXDLGFRAME, 3);
2816 ok_gsm( SM_CYDLGFRAME, 3);
2817 ok_gsm( SM_CYVTHUMB, ncm.iScrollHeight);
2818 ok_gsm( SM_CXHTHUMB, ncm.iScrollHeight);
2819 /* These don't depend on the Shell Icon Size registry value */
2824 ok_gsm( SM_CYMENU, ncm.iMenuHeight + 1);
2829 /* SM_CYKANJIWINDOW */
2830 /* SM_MOUSEPRESENT */
2831 ok_gsm( SM_CYVSCROLL, ncm.iScrollHeight);
2832 ok_gsm( SM_CXHSCROLL, ncm.iScrollHeight);
2833 /* SM_DEBUG */
2834 /* SM_SWAPBUTTON */
2835 /* SM_RESERVED1 */
2836 /* SM_RESERVED2 */
2837 /* SM_RESERVED3 */
2838 /* SM_RESERVED4 */
2839 ok_gsm( SM_CXMIN, 3 * max( CaptionWidthfromreg >= 0 ? CaptionWidthfromreg : ncm.iCaptionWidth, 8) +
2840 GetSystemMetrics( SM_CYSIZE) + 4 + 4 * avcwCaption + 2 * GetSystemMetrics( SM_CXFRAME));
2844 ncm.iCaptionWidth, /* classic/standard windows style */
2845 GetSystemMetrics( SM_CYCAPTION) - 1 /* WinXP style */
2846 );
2847 ok_gsm( SM_CYSIZE, ncm.iCaptionHeight);
2848 ok_gsm( SM_CXFRAME, ncm.iBorderWidth + 3);
2849 ok_gsm( SM_CYFRAME, ncm.iBorderWidth + 3);
2852 /* SM_CXDOUBLECLK */
2853 /* SM_CYDOUBLECLK */
2854 if( IconSpacing) ok_gsm( SM_CXICONSPACING, IconSpacing);
2855 if( IconVerticalSpacing) ok_gsm( SM_CYICONSPACING, IconVerticalSpacing);
2856 /* SM_MENUDROPALIGNMENT */
2857 /* SM_PENWINDOWS */
2858 /* SM_DBCSENABLED */
2859 /* SM_CMOUSEBUTTONS */
2860 /* SM_SECURE */
2861 ok_gsm( SM_CXEDGE, 2);
2862 ok_gsm( SM_CYEDGE, 2);
2863 /* sign-extension for iHorzGap/iVertGap is broken on Win9x */
2866
2867 smicon = MulDiv( 16, dpi, USER_DEFAULT_SCREEN_DPI );
2868 width = CaptionWidthfromreg > 0 ? CaptionWidthfromreg : ncm.iCaptionWidth;
2869 if (!pIsProcessDPIAware || pIsProcessDPIAware())
2870 smicon = max( min( smicon, width - 2), 4 ) & ~1;
2871 todo_wine_if( real_dpi == dpi && smicon != (MulDiv( 16, dpi, USER_DEFAULT_SCREEN_DPI) & ~1) )
2872 {
2873 broken_val = (min( ncm.iCaptionHeight, width ) - 2) & ~1;
2874 broken_val = min( broken_val, 20 );
2875
2876 if (smicon == 4)
2877 {
2878 ok_gsm_2( SM_CXSMICON, smicon, 6 );
2879 ok_gsm_2( SM_CYSMICON, smicon, 6 );
2880 }
2881 else
2882 {
2883 ok_gsm_2( SM_CXSMICON, smicon, broken_val );
2884 ok_gsm_2( SM_CYSMICON, smicon, broken_val );
2885 }
2886 }
2887
2888 ok_gsm( SM_CYSMCAPTION, ncm.iSmCaptionHeight + 1);
2890 ncm.iSmCaptionWidth, /* classic/standard windows style */
2891 GetSystemMetrics( SM_CYSMCAPTION) - 1, /* WinXP style */
2892 smcxsmsize /* winXP seems to cache this value: setnonclientmetric
2893 does not change it */
2894 );
2896 ok_gsm( SM_CXMENUSIZE, ncm.iMenuWidth);
2897 ok_gsm( SM_CYMENUSIZE, ncm.iMenuHeight);
2898 /* SM_ARRANGE */
2899 ok_gsm( SM_CXMINIMIZED, minim.iWidth + 6);
2903 if (!screen.cx || !screen.cy) /* not supported on NT4 */
2904 {
2907 }
2909 screen.cx - 4 + 2 * GetSystemMetrics(SM_CXFRAME), /* Vista */
2910 screen.cx + 2 * GetSystemMetrics(SM_CXFRAME)); /* Win8 */
2912 screen.cy - 4 + 2 * GetSystemMetrics(SM_CYFRAME), /* Vista */
2913 screen.cy + 2 * GetSystemMetrics(SM_CYFRAME)); /* Win8 */
2914 /* the next two cannot really be tested as they depend on (application)
2915 * toolbars */
2916 /* SM_CXMAXIMIZED */
2917 /* SM_CYMAXIMIZED */
2918 /* SM_NETWORK */
2919 /* */
2920 /* */
2921 /* */
2922 /* SM_CLEANBOOT */
2923 /* SM_CXDRAG */
2924 /* SM_CYDRAG */
2925 /* SM_SHOWSOUNDS */
2927 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2929 ((tmMenuFont.tmHeight + tmMenuFont.tmExternalLeading+1)/2)*2-1);
2930 /* SM_SLOWMACHINE */
2931 /* SM_MIDEASTENABLED */
2932 /* SM_MOUSEWHEELPRESENT */
2933 /* SM_XVIRTUALSCREEN */
2934 /* SM_YVIRTUALSCREEN */
2935 /* SM_CXVIRTUALSCREEN */
2936 /* SM_CYVIRTUALSCREEN */
2937 /* SM_CMONITORS */
2938 /* SM_SAMEDISPLAYFORMAT */
2939 /* SM_IMMENABLED */
2940 /* SM_CXFOCUSBORDER */
2941 /* SM_CYFOCUSBORDER */
2942 /* SM_TABLETPC */
2943 /* SM_MEDIACENTER */
2944 /* SM_CMETRICS */
2945 /* end of tests */
2946 if( gsm_error_ctr ) { /* if any errors where found */
2947 trace( "BorderWidth %d CaptionWidth %d CaptionHeight %d IconSpacing %d IconVerticalSpacing %d\n",
2948 ncm.iBorderWidth, ncm.iCaptionWidth, ncm.iCaptionHeight, IconSpacing, IconVerticalSpacing);
2949 trace( "MenuHeight %d MenuWidth %d ScrollHeight %d ScrollWidth %d SmCaptionHeight %d SmCaptionWidth %d\n",
2950 ncm.iMenuHeight, ncm.iMenuWidth, ncm.iScrollHeight, ncm.iScrollWidth, ncm.iSmCaptionHeight, ncm.iSmCaptionWidth);
2951 trace( "Captionfontchar width %d MenuFont %ld,%ld CaptionWidth from registry: %d screen %ld,%ld\n",
2952 avcwCaption, tmMenuFont.tmHeight, tmMenuFont.tmExternalLeading, CaptionWidthfromreg, screen.cx, screen.cy);
2953 }
2954
2955 DeleteDC(hdc);
2956}
2957
2958static void compare_font( const LOGFONTW *lf1, const LOGFONTW *lf2, int dpi, int custom_dpi, int line )
2959{
2960 ok_(__FILE__,line)( lf2->lfHeight == (dpi == custom_dpi) ? lf1->lfHeight : MulDiv( lf1->lfHeight, custom_dpi, 2 * dpi ),
2961 "wrong lfHeight %ld vs %ld\n", lf1->lfHeight, lf2->lfHeight );
2962 ok_(__FILE__,line)( abs( lf1->lfWidth - MulDiv( lf2->lfWidth, dpi, custom_dpi )) <= 1,
2963 "wrong lfWidth %ld vs %ld\n", lf1->lfWidth, lf2->lfWidth );
2964 ok_(__FILE__,line)( !memcmp( &lf1->lfEscapement, &lf2->lfEscapement,
2965 offsetof( LOGFONTW, lfFaceName ) - offsetof( LOGFONTW, lfEscapement )),
2966 "font differs\n" );
2967 ok_(__FILE__,line)( !lstrcmpW( lf1->lfFaceName, lf2->lfFaceName ), "wrong face name %s vs %s\n",
2969}
2970
2971static void test_metrics_for_dpi( int custom_dpi )
2972{
2973 int i, val;
2974 NONCLIENTMETRICSW ncm1, ncm2;
2975 ICONMETRICSW im1, im2;
2976 LOGFONTW lf1, lf2;
2977 BOOL ret;
2978
2979 if (!pSystemParametersInfoForDpi)
2980 {
2981 win_skip( "custom dpi metrics not supported\n" );
2982 return;
2983 }
2984
2985 ncm1.cbSize = sizeof(ncm1);
2986 ret = SystemParametersInfoW( SPI_GETNONCLIENTMETRICS, sizeof(ncm1), &ncm1, FALSE );
2987 ok( ret, "SystemParametersInfoW failed err %lu\n", GetLastError() );
2988 ncm2.cbSize = sizeof(ncm2);
2989 ret = pSystemParametersInfoForDpi( SPI_GETNONCLIENTMETRICS, sizeof(ncm2), &ncm2, FALSE, custom_dpi );
2990 ok( ret, "SystemParametersInfoForDpi failed err %lu\n", GetLastError() );
2991
2992 for (i = 0; i < 92; i++)
2993 {
2994 int ret1 = GetSystemMetrics( i );
2995 int ret2 = pGetSystemMetricsForDpi( i, custom_dpi );
2996 switch (i)
2997 {
2998 case SM_CXVSCROLL:
2999 case SM_CYHSCROLL:
3000 case SM_CYVTHUMB:
3001 case SM_CXHTHUMB:
3002 case SM_CXICON:
3003 case SM_CYICON:
3004 case SM_CYVSCROLL:
3005 case SM_CXHSCROLL:
3006 case SM_CYSIZE:
3007 case SM_CXICONSPACING:
3008 case SM_CYICONSPACING:
3009 case SM_CXSMSIZE:
3010 case SM_CYSMSIZE:
3011 case SM_CYMENUSIZE:
3012 ok( ret1 == MulDiv( ret2, dpi, custom_dpi ), "%u: wrong value %u vs %u\n", i, ret1, ret2 );
3013 break;
3014 case SM_CXSIZE:
3015 ok( ret1 == ncm1.iCaptionWidth && ret2 == ncm2.iCaptionWidth,
3016 "%u: wrong value %u vs %u caption %u vs %u\n",
3017 i, ret1, ret2, ncm1.iCaptionWidth, ncm2.iCaptionWidth );
3018 break;
3019 case SM_CXCURSOR:
3020 case SM_CYCURSOR:
3021 val = MulDiv( 32, custom_dpi, USER_DEFAULT_SCREEN_DPI );
3022 if (val < 48) val = 32;
3023 else if (val < 64) val = 48;
3024 else val = 64;
3025 ok( val == ret2, "%u: wrong value %u vs %u\n", i, ret1, ret2 );
3026 break;
3027 case SM_CYCAPTION:
3028 case SM_CYSMCAPTION:
3029 case SM_CYMENU:
3030 ok( ret1 - 1 == MulDiv( ret2 - 1, dpi, custom_dpi ), "%u: wrong value %u vs %u\n", i, ret1, ret2 );
3031 break;
3032 case SM_CXMENUSIZE:
3033 ok( ret1 / 8 == MulDiv( ret2, dpi, custom_dpi ) / 8, "%u: wrong value %u vs %u\n", i, ret1, ret2 );
3034 break;
3035 case SM_CXFRAME:
3036 case SM_CYFRAME:
3037 ok( ret1 == ncm1.iBorderWidth + 3 && ret2 == ncm2.iBorderWidth + 3,
3038 "%u: wrong value %u vs %u borders %u+%u vs %u+%u\n", i, ret1, ret2,
3039 ncm1.iBorderWidth, ncm1.iPaddedBorderWidth, ncm2.iBorderWidth, ncm2.iPaddedBorderWidth );
3040 break;
3041 case SM_CXSMICON:
3042 case SM_CYSMICON:
3043 ok( ret1 == (MulDiv( 16, dpi, USER_DEFAULT_SCREEN_DPI ) & ~1) &&
3044 ret2 == (MulDiv( 16, custom_dpi, USER_DEFAULT_SCREEN_DPI ) & ~1),
3045 "%u: wrong value %u vs %u\n", i, ret1, ret2 );
3046 break;
3047 case SM_CXMENUCHECK:
3048 case SM_CYMENUCHECK:
3049 ok( ret1 == ((get_tmheightW( &ncm1.lfMenuFont, 1 ) - 1) | 1) &&
3050 ret2 == ((get_tmheightW( &ncm2.lfMenuFont, 1 ) - 1) | 1),
3051 "%u: wrong value %u vs %u font %u vs %u\n", i, ret1, ret2,
3052 get_tmheightW( &ncm1.lfMenuFont, 1 ), get_tmheightW( &ncm2.lfMenuFont, 1 ));
3053 break;
3054 case SM_CYMIN:
3055 case SM_CYMINTRACK:
3056 val = pGetSystemMetricsForDpi( SM_CYCAPTION, custom_dpi );
3057 val += 2 * pGetSystemMetricsForDpi( SM_CYFRAME, custom_dpi );
3058 val += 2 * ncm2.iPaddedBorderWidth;
3059 ok( ret1 == ret2 || ret2 == val /* Win10 1709+ */, "%u: expected %u or %u, got %u\n", i, ret1, val, ret2 );
3060 break;
3061 case SM_CXMIN:
3062 case SM_CXMINTRACK:
3063 val = MulDiv( ret1 - 7, custom_dpi, dpi );
3064 ok( ret1 == ret2 || (ret2 >= val - 10 && ret2 <= val + 10) /* Win10 1709+ */,
3065 "%u: expected %u or %u, got %u\n", i, ret1, val, ret2 );
3066 break;
3067 default:
3068 ok( ret1 == ret2, "%u: wrong value %u vs %u\n", i, ret1, ret2 );
3069 break;
3070 }
3071 }
3072 im1.cbSize = sizeof(im1);
3073 ret = SystemParametersInfoW( SPI_GETICONMETRICS, sizeof(im1), &im1, FALSE );
3074 ok( ret, "SystemParametersInfoW failed err %lu\n", GetLastError() );
3075 im2.cbSize = sizeof(im2);
3076 ret = pSystemParametersInfoForDpi( SPI_GETICONMETRICS, sizeof(im2), &im2, FALSE, custom_dpi );
3077 ok( ret, "SystemParametersInfoForDpi failed err %lu\n", GetLastError() );
3078 ok( im1.iHorzSpacing == MulDiv( im2.iHorzSpacing, dpi, custom_dpi ), "wrong iHorzSpacing %u vs %u\n",
3079 im1.iHorzSpacing, im2.iHorzSpacing );
3080 ok( im1.iVertSpacing == MulDiv( im2.iVertSpacing, dpi, custom_dpi ), "wrong iVertSpacing %u vs %u\n",
3081 im1.iVertSpacing, im2.iVertSpacing );
3082 ok( im1.iTitleWrap == im2.iTitleWrap, "wrong iTitleWrap %u vs %u\n",
3083 im1.iTitleWrap, im2.iTitleWrap );
3084 compare_font( &im1.lfFont, &im2.lfFont, dpi, custom_dpi, __LINE__ );
3085
3086 ret = SystemParametersInfoW( SPI_GETICONTITLELOGFONT, sizeof(lf1), &lf1, FALSE );
3087 ok( ret, "SystemParametersInfoW failed err %lu\n", GetLastError() );
3088 ret = pSystemParametersInfoForDpi( SPI_GETICONTITLELOGFONT, sizeof(lf2), &lf2, FALSE, custom_dpi );
3089 ok( ret, "SystemParametersInfoForDpi failed err %lu\n", GetLastError() );
3090 compare_font( &lf1, &lf2, dpi, custom_dpi, __LINE__ );
3091
3092 /* on high-dpi iPaddedBorderWidth is used in addition to iBorderWidth */
3093 ok( ncm1.iBorderWidth + ncm1.iPaddedBorderWidth == MulDiv( ncm2.iBorderWidth + ncm2.iPaddedBorderWidth, dpi, custom_dpi ),
3094 "wrong iBorderWidth %u+%u vs %u+%u\n",
3095 ncm1.iBorderWidth, ncm1.iPaddedBorderWidth, ncm2.iBorderWidth, ncm2.iPaddedBorderWidth );
3096 ok( ncm1.iScrollWidth == MulDiv( ncm2.iScrollWidth, dpi, custom_dpi ),
3097 "wrong iScrollWidth %u vs %u\n", ncm1.iScrollWidth, ncm2.iScrollWidth );
3098 ok( ncm1.iScrollHeight == MulDiv( ncm2.iScrollHeight, dpi, custom_dpi ),
3099 "wrong iScrollHeight %u vs %u\n", ncm1.iScrollHeight, ncm2.iScrollHeight );
3100 ok( ((ncm1.iCaptionWidth + 1) & ~1) == ((MulDiv( ncm2.iCaptionWidth, dpi, custom_dpi ) + 1) & ~1),
3101 "wrong iCaptionWidth %u vs %u\n", ncm1.iCaptionWidth, ncm2.iCaptionWidth );
3102 ok( ncm1.iCaptionHeight == MulDiv( ncm2.iCaptionHeight, dpi, custom_dpi ),
3103 "wrong iCaptionHeight %u vs %u\n", ncm1.iCaptionHeight, ncm2.iCaptionHeight );
3104 compare_font( &ncm1.lfCaptionFont, &ncm2.lfCaptionFont, dpi, custom_dpi, __LINE__ );
3105 ok( ncm1.iSmCaptionHeight == MulDiv( ncm2.iSmCaptionHeight, dpi, custom_dpi ),
3106 "wrong iSmCaptionHeight %u vs %u\n", ncm1.iSmCaptionHeight, ncm2.iSmCaptionHeight );
3107 compare_font( &ncm1.lfSmCaptionFont, &ncm2.lfSmCaptionFont, dpi, custom_dpi, __LINE__ );
3108 ok( ncm1.iMenuHeight == MulDiv( ncm2.iMenuHeight, dpi, custom_dpi ),
3109 "wrong iMenuHeight %u vs %u\n", ncm1.iMenuHeight, ncm2.iMenuHeight );
3110 /* iSmCaptionWidth and iMenuWidth apparently need to be multiples of 8 */
3111 ok( ncm1.iSmCaptionWidth / 8 == MulDiv( ncm2.iSmCaptionWidth, dpi, custom_dpi ) / 8,
3112 "wrong iSmCaptionWidth %u vs %u\n", ncm1.iSmCaptionWidth, ncm2.iSmCaptionWidth );
3113 ok( ncm1.iMenuWidth / 8 == MulDiv( ncm2.iMenuWidth, dpi, custom_dpi ) / 8,
3114 "wrong iMenuWidth %u vs %u\n", ncm1.iMenuWidth, ncm2.iMenuWidth );
3115 compare_font( &ncm1.lfMenuFont, &ncm2.lfMenuFont, dpi, custom_dpi, __LINE__ );
3116 compare_font( &ncm1.lfStatusFont, &ncm2.lfStatusFont, dpi, custom_dpi, __LINE__ );
3117 compare_font( &ncm1.lfMessageFont, &ncm2.lfMessageFont, dpi, custom_dpi, __LINE__ );
3118
3119 for (i = 1; i < 120; i++)
3120 {
3121 if (i == SPI_GETICONTITLELOGFONT || i == SPI_GETNONCLIENTMETRICS || i == SPI_GETICONMETRICS)
3122 continue;
3123 SetLastError( 0xdeadbeef );
3124 ret = pSystemParametersInfoForDpi( i, 0, &val, 0, custom_dpi );
3125 ok( !ret, "%u: SystemParametersInfoForDpi succeeded\n", i );
3126 ok( GetLastError() == ERROR_INVALID_PARAMETER, "%u: wrong error %lu\n", i, GetLastError() );
3127 }
3128}
3129
3131{
3132 DISPLAY_DEVICEA dd;
3133 DWORD adapter;
3134
3135 dd.cb = sizeof(dd);
3136 for (adapter = 0; EnumDisplayDevicesA(NULL, adapter, &dd, 0); ++adapter)
3137 {
3139 {
3141 return TRUE;
3142 }
3143 }
3144
3145 return FALSE;
3146}
3147
3149{
3150 INT width, height;
3152 DEVMODEA dm;
3153 BOOL ret;
3154
3155 memset(&mi, 0, sizeof(mi));
3156 mi.cbSize = sizeof(mi);
3157 ret = GetMonitorInfoA(hmonitor, (MONITORINFO *)&mi);
3158 ok(ret, "GetMonitorInfoA failed, error %#lx\n", GetLastError());
3159
3160 memset(&dm, 0, sizeof(dm));
3161 dm.dmSize = sizeof(dm);
3163 ok(ret, "EnumDisplaySettingsA failed, error %#lx\n", GetLastError());
3164
3166 "Unexpected dmFields %#lx.\n", dm.dmFields);
3167 ok(dm.dmPosition.x == mi.rcMonitor.left, "Expect dmPosition.x %ld, got %ld\n", mi.rcMonitor.left, dm.dmPosition.x);
3168 ok(dm.dmPosition.y == mi.rcMonitor.top, "Expect dmPosition.y %ld, got %ld\n", mi.rcMonitor.top, dm.dmPosition.y);
3170 ok(dm.dmPelsWidth == width, "Expect dmPelsWidth %d, got %ld\n", width, dm.dmPelsWidth);
3172 ok(dm.dmPelsHeight == height, "Expect dmPelsHeight %d, got %ld\n", height, dm.dmPelsHeight);
3173
3174 return TRUE;
3175}
3176
3178{
3179 static const DWORD mode_fields = DM_DISPLAYORIENTATION | DM_BITSPERPEL |
3181 static const DWORD setting_fields = DM_DISPLAYORIENTATION | DM_BITSPERPEL |
3183 CHAR primary_adapter[CCHDEVICENAME];
3185 DWORD err, val, device, mode;
3186 BOOL attached, ret;
3187 DISPLAY_DEVICEA dd;
3188 DEVMODEA dm, dm2;
3189 DEVMODEW dmW;
3190 HDC hdc;
3191
3192 /* Test invalid device names */
3193 memset(&dm, 0, sizeof(dm));
3194 dm.dmSize = sizeof(dm);
3195 SetLastError(0xdeadbeef);
3197 ok(!ret, "EnumDisplaySettingsA succeeded\n");
3198 ok(GetLastError() == 0xdeadbeef, "Expect error 0xdeadbeef, got %#lx\n", GetLastError());
3199 ok(dm.dmFields == 0, "Expect dmFields unchanged, got %#lx\n", dm.dmFields);
3200
3201 /* Monitor device names are invalid */
3202 memset(&dm, 0, sizeof(dm));
3203 dm.dmSize = sizeof(dm);
3204 SetLastError(0xdeadbeef);
3205 ret = EnumDisplaySettingsA("\\\\.\\DISPLAY1\\Monitor0", ENUM_CURRENT_SETTINGS, &dm);
3206 ok(!ret, "EnumDisplaySettingsA succeeded\n");
3207 ok(GetLastError() == 0xdeadbeef, "Expect error 0xdeadbeef, got %#lx\n", GetLastError());
3208 ok(dm.dmFields == 0, "Expect dmFields unchanged, got %#lx\n", dm.dmFields);
3209
3210 /* Test that passing NULL to device name parameter means to use the primary adapter */
3211 memset(&dm, 0, sizeof(dm));
3212 memset(&dm2, 0, sizeof(dm2));
3213 dm.dmSize = sizeof(dm);
3214 dm2.dmSize = sizeof(dm2);
3215 ret = get_primary_adapter_name(primary_adapter);
3216 ok(ret, "get_primary_adapter_name failed\n");
3218 ok(ret, "EnumDisplaySettingsA failed, error %#lx\n", GetLastError());
3219 ret = EnumDisplaySettingsA(primary_adapter, ENUM_CURRENT_SETTINGS, &dm2);
3220 ok(ret, "EnumDisplaySettingsA failed, error %#lx\n", GetLastError());
3221 ok(!memcmp(&dm, &dm2, sizeof(dm)), "Expect NULL device is the primary device.\n");
3222
3223 /* Test dmSize */
3224 /* EnumDisplaySettingsA/W modify dmSize and don't check for insufficient dmSize */
3225 memset(&dm, 0, sizeof(dm));
3227 ok(ret, "EnumDisplaySettingsA failed, error %#lx\n", GetLastError());
3228 ok(dm.dmSize == FIELD_OFFSET(DEVMODEA, dmICMMethod), "Expect dmSize %lu, got %u\n",
3229 FIELD_OFFSET(DEVMODEA, dmICMMethod), dm.dmSize);
3230 ok((dm.dmFields & setting_fields) == setting_fields, "Expect dmFields to contain %#lx, got %#lx\n",
3231 setting_fields, dm.dmFields);
3232
3233 memset(&dm, 0, sizeof(dm));
3234 dm.dmSize = sizeof(dm);
3236 ok(ret, "EnumDisplaySettingsA failed, error %#lx\n", GetLastError());
3237 ok(dm.dmSize == FIELD_OFFSET(DEVMODEA, dmICMMethod), "Expect dmSize %lu, got %u\n",
3238 FIELD_OFFSET(DEVMODEA, dmICMMethod), dm.dmSize);
3239 ok((dm.dmFields & setting_fields) == setting_fields, "Expect dmFields to contain %#lx, got %#lx\n",
3240 setting_fields, dm.dmFields);
3241
3242 memset(&dmW, 0, sizeof(dmW));
3244 ok(ret, "EnumDisplaySettingsW failed, error %#lx\n", GetLastError());
3245 ok(dmW.dmSize == FIELD_OFFSET(DEVMODEW, dmICMMethod), "Expect dmSize %lu, got %u\n",
3246 FIELD_OFFSET(DEVMODEW, dmICMMethod), dmW.dmSize);
3247 ok((dmW.dmFields & setting_fields) == setting_fields, "Expect dmFields to contain %#lx, got %#lx\n",
3248 setting_fields, dmW.dmFields);
3249
3250 memset(&dmW, 0, sizeof(dmW));
3251 dmW.dmSize = sizeof(dmW);
3253 ok(ret, "EnumDisplaySettingsW failed, error %#lx\n", GetLastError());
3254 ok(dmW.dmSize == FIELD_OFFSET(DEVMODEW, dmICMMethod), "Expect dmSize %lu, got %u\n",
3255 FIELD_OFFSET(DEVMODEW, dmICMMethod), dmW.dmSize);
3256 ok((dmW.dmFields & setting_fields) == setting_fields, "Expect dmFields to contain %#lx, got %#lx\n",
3257 setting_fields, dmW.dmFields);
3258
3259 /* EnumDisplaySettingsExA/W need dmSize to be at least FIELD_OFFSET(DEVMODEA/W, dmFields) + 1 to have valid dmFields */
3260 /* Crash on Windows when dmSize is zero */
3261 if (0)
3262 {
3263 memset(&dm, 0, sizeof(dm));
3265 ok(!ret, "EnumDisplaySettingsExA succeed\n");
3266
3267 memset(&dmW, 0, sizeof(dmW));
3269 ok(!ret, "EnumDisplaySettingsExA succeed\n");
3270 }
3271
3272 memset(&dm, 0, sizeof(dm));
3273 dm.dmSize = FIELD_OFFSET(DEVMODEA, dmFields);
3275 ok(ret, "EnumDisplaySettingsExA failed, error %#lx\n", GetLastError());
3276 todo_wine ok(dm.dmSize == FIELD_OFFSET(DEVMODEA, dmFields), "Expect dmSize unchanged, got %u\n", dm.dmSize);
3277 todo_wine ok(dm.dmFields == 0, "Expect dmFields unchanged, got %#lx\n", dm.dmFields);
3278
3279 memset(&dm, 0, sizeof(dm));
3280 dm.dmSize = FIELD_OFFSET(DEVMODEA, dmFields) + 1;
3282 ok(ret, "EnumDisplaySettingsExA failed, error %#lx\n", GetLastError());
3283 todo_wine ok(dm.dmSize == FIELD_OFFSET(DEVMODEA, dmFields) + 1, "Expect dmSize unchanged, got %u\n", dm.dmSize);
3284 todo_wine ok((dm.dmFields & setting_fields) == (DM_POSITION | DM_DISPLAYORIENTATION),
3285 "Expect dmFields to contain %#lx, got %#lx\n", DM_POSITION | DM_DISPLAYORIENTATION, dm.dmFields);
3286 /* Fields beyond dmSize don't get written */
3287 todo_wine ok(dm.dmPelsWidth == 0, "Expect dmPelsWidth unwritten\n");
3288
3289 memset(&dmW, 0, sizeof(dmW));
3290 dmW.dmSize = FIELD_OFFSET(DEVMODEW, dmFields);
3292 ok(ret, "EnumDisplaySettingsExW failed, error %#lx\n", GetLastError());
3293 todo_wine ok(dmW.dmSize == FIELD_OFFSET(DEVMODEW, dmFields), "Expect dmSize unchanged, got %u\n", dmW.dmSize);
3294 todo_wine ok(dmW.dmFields == 0, "Expect dmFields unchanged, got %#lx\n", dmW.dmFields);
3295
3296 memset(&dmW, 0, sizeof(dmW));
3297 dmW.dmSize = FIELD_OFFSET(DEVMODEW, dmFields) + 1;
3299 ok(ret, "EnumDisplaySettingsExW failed, error %#lx\n", GetLastError());
3300 todo_wine ok(dmW.dmSize == FIELD_OFFSET(DEVMODEW, dmFields) + 1, "Expect dmSize unchanged, got %u\n", dmW.dmSize);
3301 todo_wine ok((dmW.dmFields & setting_fields) == (DM_POSITION | DM_DISPLAYORIENTATION),
3302 "Expect dmFields to contain %#lx, got %#lx\n", DM_POSITION | DM_DISPLAYORIENTATION, dmW.dmFields);
3303 /* Fields beyond dmSize don't get written */
3304 todo_wine ok(dmW.dmPelsWidth == 0, "Expect dmPelsWidth unwritten\n");
3305
3306 /* Test dmBitsPerPel */
3307 hdc = GetDC(0);
3309
3310 memset(&dm, 0, sizeof(dm));
3311 dm.dmSize = sizeof(dm);
3313 ok(ret, "EnumDisplaySettingsExA failed, error %#lx\n", GetLastError());
3314 ok((dm.dmFields & setting_fields) == setting_fields, "Expect dmFields to contain %#lx, got %#lx\n",
3315 setting_fields, dm.dmFields);
3316 ok(dm.dmBitsPerPel == val, "Expect dmBitsPerPel %ld, got %ld\n", val, dm.dmBitsPerPel);
3317
3319 if (dm.dmBitsPerPel <= 8)
3320 {
3321 ok(val == 256, "Screen bpp is %ld, NUMCOLORS returned %ld\n", dm.dmBitsPerPel, val);
3322 }
3323 else
3324 {
3325 ok(val == -1, "Screen bpp is %ld, NUMCOLORS returned %ld\n", dm.dmBitsPerPel, val);
3326 }
3327
3328 ReleaseDC(0, hdc);
3329
3330 /* Test dmPosition, dmPelsWidth and dmPelsHeight */
3331 /* Set DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE so that GetMonitorInfo() returns physical pixels */
3332 if (pSetThreadDpiAwarenessContext)
3333 ctx = pSetThreadDpiAwarenessContext(DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE);
3335 if (pSetThreadDpiAwarenessContext && ctx)
3336 pSetThreadDpiAwarenessContext(ctx);
3337
3338 /* Test mode enumeration and other fields */
3339 dd.cb = sizeof(dd);
3340 for (device = 0; EnumDisplayDevicesA(NULL, device, &dd, 0); ++device)
3341 {
3342 INT number;
3343
3344 /* Skip software devices */
3345 if (sscanf(dd.DeviceName, "\\\\.\\DISPLAY%d", &number) != 1)
3346 continue;
3347
3349
3350 memset(&dm, 0, sizeof(dm));
3351 dm.dmSize = sizeof(dm);
3352 SetLastError(0xdeadbeef);
3354 {
3356 {
3357 ok((dm.dmFields & setting_fields) == setting_fields,
3358 "Expect dmFields to contain %#lx, got %#lx\n", setting_fields, dm.dmFields);
3359 }
3360 else
3361 {
3362 ok((dm.dmFields & mode_fields) == mode_fields, "Expect dmFields to contain %#lx, got %#lx\n",
3363 mode_fields, dm.dmFields);
3364 }
3365
3366 ok(dm.dmDisplayOrientation == DMDO_DEFAULT, "Expect dmDisplayOrientation DMDO_DEFAULT, got %#lx\n",
3368 ok(dm.dmDisplayFlags == 0, "Expect dmDisplayFlags zero\n");
3369
3370 if (mode == ENUM_CURRENT_SETTINGS && !attached)
3371 {
3372 ok(dm.dmBitsPerPel == 0, "Expect dmBitsPerPel zero, got %lu\n", dm.dmBitsPerPel);
3373 ok(dm.dmPelsWidth == 0, "Expect dmPelsWidth zero, got %lu\n", dm.dmPelsWidth);
3374 ok(dm.dmPelsHeight == 0, "Expect dmPelsHeight zero, got %lu\n", dm.dmPelsHeight);
3375 ok(dm.dmDisplayFrequency == 0, "Expect dmDisplayFrequency zero, got %lu\n", dm.dmDisplayFrequency);
3376 }
3377 else if (mode != ENUM_REGISTRY_SETTINGS)
3378 {
3379 ok(dm.dmBitsPerPel, "Expect dmBitsPerPel not zero\n");
3380 ok(dm.dmPelsWidth, "Expect dmPelsWidth not zero\n");
3381 ok(dm.dmPelsHeight, "Expect dmPelsHeight not zero\n");
3382 ok(dm.dmDisplayFrequency, "Expect dmDisplayFrequency not zero\n");
3383 }
3384 }
3385
3386 ok(mode >= 1, "Expect at least one valid mode gets enumerated.\n");
3387
3388 err = GetLastError();
3390 err == ERROR_MOD_NOT_FOUND /* Win8 */ ||
3391 err == 0xdeadbeef, /* XP, 2003 */
3392 "Expected ERROR_NO_MORE_FILES, ERROR_MOD_NOT_FOUND or 0xdeadbeef, got %#lx\n", err);
3393 }
3394}
3395
3396static void test_GetSysColorBrush(void)
3397{
3398 HBRUSH hbr;
3399
3400 SetLastError(0xdeadbeef);
3401 hbr = GetSysColorBrush(-1);
3402 ok(hbr == NULL, "Expected NULL brush\n");
3403 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %lx\n", GetLastError());
3404 /* greater than max index */
3405 hbr = GetSysColorBrush(COLOR_MENUBAR);
3406 if (hbr)
3407 {
3408 SetLastError(0xdeadbeef);
3409 hbr = GetSysColorBrush(COLOR_MENUBAR + 1);
3410 ok(hbr == NULL, "Expected NULL brush\n");
3411 ok(GetLastError() == 0xdeadbeef, "Expected last error not set, got %lx\n", GetLastError());
3412 }
3413 else
3414 win_skip("COLOR_MENUBAR unsupported\n");
3415}
3416
3418{
3420 HGDIOBJ obj[STOCK_LAST + 1], obj2[STOCK_LAST + 1];
3421 LOGFONTW lf, lf2;
3422 UINT i, dpi;
3423
3424 context = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
3426 ok( dpi == USER_DEFAULT_SCREEN_DPI, "wrong dpi %u\n", dpi );
3427 ok( !pIsProcessDPIAware(), "not aware\n" );
3428 for (i = 0; i <= STOCK_LAST; i++) obj[i] = GetStockObject( i );
3429
3430 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
3432 ok( dpi == real_dpi, "wrong dpi %u\n", dpi );
3433 ok( pIsProcessDPIAware(), "not aware\n" );
3434 for (i = 0; i <= STOCK_LAST; i++) obj2[i] = GetStockObject( i );
3435
3436 for (i = 0; i <= STOCK_LAST; i++)
3437 {
3438 switch (i)
3439 {
3440 case OEM_FIXED_FONT:
3441 case SYSTEM_FIXED_FONT:
3442 ok( obj[i] != obj2[i], "%u: same object\n", i );
3443 break;
3444 case SYSTEM_FONT:
3445 case DEFAULT_GUI_FONT:
3446 ok( obj[i] != obj2[i], "%u: same object\n", i );
3447 GetObjectW( obj[i], sizeof(lf), &lf );
3448 GetObjectW( obj2[i], sizeof(lf2), &lf2 );
3450 "%u: wrong height %ld / %ld\n", i, lf.lfHeight, lf2.lfHeight );
3451 break;
3452 default:
3453 ok( obj[i] == obj2[i], "%u: different object\n", i );
3454 break;
3455 }
3456 }
3457
3458 pSetThreadDpiAwarenessContext( context );
3459}
3460
3461static void scale_point_dpi( POINT *pt, UINT src_dpi, UINT target_dpi )
3462{
3463 pt->x = MulDiv( pt->x, target_dpi, src_dpi );
3464 pt->y = MulDiv( pt->y, target_dpi, src_dpi );
3465}
3466
3467static void scale_rect_dpi( RECT *rect, UINT src_dpi, UINT target_dpi )
3468{
3469 rect->left = MulDiv( rect->left, target_dpi, src_dpi );
3470 rect->top = MulDiv( rect->top, target_dpi, src_dpi );
3471 rect->right = MulDiv( rect->right, target_dpi, src_dpi );
3472 rect->bottom = MulDiv( rect->bottom, target_dpi, src_dpi );
3473}
3474
3476{
3481}
3482
3484{
3489}
3490
3491static void test_dpi_mapping(void)
3492{
3493 HWND hwnd, child;
3494 HDC hdc;
3495 UINT win_dpi, units;
3496 POINT point;
3497 BOOL ret;
3498 HRGN rgn, update;
3499 RECT rect, orig, client, desktop, expect;
3500 ULONG_PTR i, j, k;
3501 WINDOWPLACEMENT wpl_orig, wpl;
3502 HMONITOR monitor;
3504 MONITORINFO mon_info;
3506
3507 if (!pLogicalToPhysicalPointForPerMonitorDPI)
3508 {
3509 win_skip( "LogicalToPhysicalPointForPerMonitorDPI not supported\n" );
3510 return;
3511 }
3512 context = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
3513 GetWindowRect( GetDesktopWindow(), &desktop );
3516 {
3517 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~i );
3518 /* test desktop rect */
3520 expect = desktop;
3522 ok( EqualRect( &expect, &rect ), "%Iu: wrong desktop rect %s expected %s\n",
3525 ok( EqualRect( &expect, &rect ), "%Iu: wrong desktop rect %s expected %s\n",
3527 if (monitor_count < 2)
3528 {
3530 ok( EqualRect( &expect, &rect ), "%Iu: wrong virt desktop rect %s expected %s\n",
3532 }
3533 SetRect( &rect, 0, 0, 1, 1 );
3534 monitor = MonitorFromRect( &rect, MONITOR_DEFAULTTOPRIMARY );
3535 ok( monitor != 0, "failed to get monitor\n" );
3536 mon_info.cbSize = sizeof(mon_info);
3537 ok( GetMonitorInfoW( monitor, &mon_info ), "GetMonitorInfoExW failed\n" );
3538 ok( EqualRect( &expect, &mon_info.rcMonitor ), "%Iu: wrong monitor rect %s expected %s\n",
3540 hdc = CreateDCA( "display", NULL, NULL, NULL );
3542 ok( EqualRect( &expect, &rect ), "%Iu: wrong caps desktop rect %s expected %s\n",
3546 ok( EqualRect( &desktop, &rect ), "%Iu: wrong caps virt desktop rect %s expected %s\n",
3547 i, wine_dbgstr_rect(&rect), wine_dbgstr_rect(&desktop) );
3548 DeleteDC( hdc );
3549 /* test message window rect */
3550 hwnd = CreateWindowA( "SysParamsTestClass", "test", WS_CHILD,
3551 10, 10, 20, 20, HWND_MESSAGE, 0, GetModuleHandleA(0), NULL );
3553 SetRect( &expect, 0, 0, 100, 100 );
3555 ok( EqualRect( &expect, &rect ), "%Iu: wrong message rect %s expected %s\n",
3558 }
3560 {
3561 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~i );
3562 hwnd = CreateWindowA( "SysParamsTestClass", "test", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
3563 193, 177, 295, 303, 0, 0, GetModuleHandleA(0), NULL );
3564 ok( hwnd != 0, "creating window failed err %lu\n", GetLastError());
3565 child = CreateWindowA( "SysParamsTestClass", "child", WS_CHILD | WS_VISIBLE,
3566 50, 60, 70, 80, hwnd, 0, GetModuleHandleA(0), NULL );
3567 ok( child != 0, "creating child failed err %lu\n", GetLastError());
3568 GetWindowRect( hwnd, &orig );
3569 SetRect( &rect, 0, 0, 0, 0 );
3570 pAdjustWindowRectExForDpi( &rect, WS_OVERLAPPEDWINDOW, FALSE, 0, pGetDpiForWindow( hwnd ));
3571 SetRect( &client, orig.left - rect.left, orig.top - rect.top,
3572 orig.right - rect.right, orig.bottom - rect.bottom );
3575 GetWindowPlacement( hwnd, &wpl_orig );
3577
3579 {
3580 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~j );
3581 /* test window rect */
3582 GetWindowRect( hwnd, &rect );
3583 expect = orig;
3585 ok( EqualRect( &expect, &rect ), "%Iu/%Iu: wrong window rect %s expected %s\n",
3587 /* test client rect */
3588 GetClientRect( hwnd, &rect );
3589 expect = client;
3590 OffsetRect( &expect, -expect.left, -expect.top );
3592 ok( EqualRect( &expect, &rect ), "%Iu/%Iu: wrong client rect %s expected %s\n",
3594 /* test window placement */
3595 GetWindowPlacement( hwnd, &wpl );
3596 point = wpl_orig.ptMinPosition;
3597 if (point.x != -1 || point.y != -1) scale_point_dpi_aware( &point, i, j );
3598 ok( wpl.ptMinPosition.x == point.x && wpl.ptMinPosition.y == point.y,
3599 "%Iu/%Iu: wrong placement min pos %ld,%ld expected %ld,%ld\n", i, j,
3600 wpl.ptMinPosition.x, wpl.ptMinPosition.y, point.x, point.y );
3601 point = wpl_orig.ptMaxPosition;
3602 if (point.x != -1 || point.y != -1) scale_point_dpi_aware( &point, i, j );
3603 ok( wpl.ptMaxPosition.x == point.x && wpl.ptMaxPosition.y == point.y,
3604 "%Iu/%Iu: wrong placement max pos %ld,%ld expected %ld,%ld\n", i, j,
3605 wpl.ptMaxPosition.x, wpl.ptMaxPosition.y, point.x, point.y );
3606 expect = wpl_orig.rcNormalPosition;
3609 "%Iu/%Iu: wrong placement rect %s expect %s\n", i, j,
3611 /* test DC rect */
3612 hdc = GetDC( hwnd );
3613 GetClipBox( hdc, &rect );
3614 SetRect( &expect, 0, 0, client.right - client.left, client.bottom - client.top );
3615 ok( EqualRect( &expect, &rect ), "%Iu/%Iu: wrong clip box %s expected %s\n",
3617 /* test DC resolution */
3619 expect = desktop;
3621 ok( EqualRect( &expect, &rect ), "%Iu/%Iu: wrong DC resolution %s expected %s\n",
3625 ok( EqualRect( &desktop, &rect ), "%Iu/%Iu: wrong desktop resolution %s expected %s\n",
3626 i, j, wine_dbgstr_rect(&rect), wine_dbgstr_rect(&desktop) );
3627 ReleaseDC( hwnd, hdc );
3628 /* test DC win rect */
3629 hdc = GetWindowDC( hwnd );
3630 GetClipBox( hdc, &rect );
3631 SetRect( &expect, 0, 0, 295, 303 );
3632 todo_wine
3633 ok( EqualRect( &expect, &rect ), "%Iu/%Iu: wrong clip box win DC %s expected %s\n",
3635 ReleaseDC( hwnd, hdc );
3636 /* test window invalidation */
3637 UpdateWindow( hwnd );
3638 update = CreateRectRgn( 0, 0, 0, 0 );
3639 ret = GetUpdateRgn( hwnd, update, FALSE );
3640 ok( ret == NULLREGION, "update region not empty\n" );
3641 rgn = CreateRectRgn( 20, 20, 25, 25 );
3643 {
3644 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~k );
3645 RedrawWindow( hwnd, 0, rgn, RDW_INVALIDATE );
3646 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~j );
3647 GetUpdateRgn( hwnd, update, FALSE );
3648 GetRgnBox( update, &rect );
3649 SetRect( &expect, 20, 20, 25, 25 );
3650 ok( EqualRect( &expect, &rect ), "%Iu/%Iu/%Iu: wrong update region %s expected %s\n",
3654 ok( EqualRect( &expect, &rect ), "%Iu/%Iu/%Iu: wrong update rect %s expected %s\n",
3656 UpdateWindow( hwnd );
3657 }
3659 {
3660 RedrawWindow( hwnd, 0, rgn, RDW_INVALIDATE );
3661 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~k );
3662 GetUpdateRgn( hwnd, update, FALSE );
3663 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~j );
3664 GetRgnBox( update, &rect );
3665 SetRect( &expect, 20, 20, 25, 25 );
3666 ok( EqualRect( &expect, &rect ), "%Iu/%Iu/%Iu: wrong update region %s expected %s\n",
3670 ok( EqualRect( &expect, &rect ), "%Iu/%Iu/%Iu: wrong update rect %s expected %s\n",
3672 UpdateWindow( hwnd );
3673 }
3674 /* test desktop window invalidation */
3675 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
3676 GetClientRect( hwnd, &rect );
3677 InflateRect( &rect, -50, -50 );
3678 expect = rect;
3679 MapWindowPoints( hwnd, 0, (POINT *)&rect, 2 );
3680 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~j );
3682 GetUpdateRgn( hwnd, update, TRUE );
3683 GetRgnBox( update, &rect );
3685 ok( EqualRect( &expect, &rect ), "%Iu/%Iu: wrong update region %s expected %s\n",
3689 ok( EqualRect( &expect, &rect ), "%Iu/%Iu: wrong update rect %s expected %s\n",
3691 UpdateWindow( hwnd );
3692 DeleteObject( update );
3693 /* test dialog units */
3695 point.x = LOWORD( units );
3696 point.y = HIWORD( units );
3698 ok( LOWORD(ret) == point.x && HIWORD(ret) == point.y, "%Iu/%Iu: wrong units %d,%d / %ld,%ld\n",
3699 i, j, LOWORD(ret), HIWORD(ret), point.x, point.y );
3700 /* test window points mapping */
3701 SetRect( &rect, 0, 0, 100, 100 );
3702 rect.right = rect.left + 100;
3703 rect.bottom = rect.top + 100;
3704 MapWindowPoints( hwnd, 0, (POINT *)&rect, 2 );
3705 expect = client;
3707 expect.right = expect.left + 100;
3708 expect.bottom = expect.top + 100;
3709 ok( EqualRect( &expect, &rect ), "%Iu/%Iu: wrong MapWindowPoints rect %s expected %s\n",
3711 SetRect( &rect, 50, 60, 70, 80 );
3713 SetRect( &expect, 40, 30, 60, 80 );
3714 OffsetRect( &expect, -rect.left, -rect.top );
3715 SetRect( &rect, 40, 30, 60, 80 );
3716 MapWindowPoints( hwnd, child, (POINT *)&rect, 2 );
3717 ok( EqualRect( &expect, &rect ), "%Iu/%Iu: wrong MapWindowPoints child rect %s expected %s\n",
3719 /* test logical<->physical coords mapping */
3720 win_dpi = pGetDpiForWindow( hwnd );
3721 if (i == DPI_AWARENESS_UNAWARE)
3722 ok( win_dpi == USER_DEFAULT_SCREEN_DPI, "wrong dpi %u\n", win_dpi );
3723 else if (i == DPI_AWARENESS_SYSTEM_AWARE)
3724 ok( win_dpi == real_dpi, "wrong dpi %u / %u\n", win_dpi, real_dpi );
3725 point.x = 373;
3726 point.y = 377;
3727 ret = pLogicalToPhysicalPointForPerMonitorDPI( hwnd, &point );
3728 ok( ret, "%Iu/%Iu: LogicalToPhysicalPointForPerMonitorDPI failed\n", i, j );
3729 ok( point.x == MulDiv( 373, real_dpi, win_dpi ) &&
3730 point.y == MulDiv( 377, real_dpi, win_dpi ),
3731 "%Iu/%Iu: wrong pos %ld,%ld dpi %u\n", i, j, point.x, point.y, win_dpi );
3732 point.x = 405;
3733 point.y = 423;
3734 ret = pPhysicalToLogicalPointForPerMonitorDPI( hwnd, &point );
3735 ok( ret, "%Iu/%Iu: PhysicalToLogicalPointForPerMonitorDPI failed\n", i, j );
3736 ok( point.x == MulDiv( 405, win_dpi, real_dpi ) &&
3737 point.y == MulDiv( 423, win_dpi, real_dpi ),
3738 "%Iu/%Iu: wrong pos %ld,%ld dpi %u\n", i, j, point.x, point.y, win_dpi );
3739 /* point outside the window fails, but note that Windows (wrongly) checks against the
3740 * window rect transformed relative to the thread's awareness */
3741 GetWindowRect( hwnd, &rect );
3742 point.x = rect.left - 1;
3743 point.y = rect.top;
3744 ret = pLogicalToPhysicalPointForPerMonitorDPI( hwnd, &point );
3745 ok( !ret, "%Iu/%Iu: LogicalToPhysicalPointForPerMonitorDPI succeeded\n", i, j );
3746 point.x++;
3747 point.y--;
3748 ret = pLogicalToPhysicalPointForPerMonitorDPI( hwnd, &point );
3749 ok( !ret, "%Iu/%Iu: LogicalToPhysicalPointForPerMonitorDPI succeeded\n", i, j );
3750 point.y++;
3751 ret = pLogicalToPhysicalPointForPerMonitorDPI( hwnd, &point );
3752 ok( ret, "%Iu/%Iu: LogicalToPhysicalPointForPerMonitorDPI failed\n", i, j );
3753 point.x = rect.right;
3754 point.y = rect.bottom + 1;
3755 ret = pLogicalToPhysicalPointForPerMonitorDPI( hwnd, &point );
3756 ok( !ret, "%Iu/%Iu: LogicalToPhysicalPointForPerMonitorDPI succeeded\n", i, j );
3757 point.x++;
3758 point.y--;
3759 ret = pLogicalToPhysicalPointForPerMonitorDPI( hwnd, &point );
3760 ok( !ret, "%Iu/%Iu: LogicalToPhysicalPointForPerMonitorDPI succeeded\n", i, j );
3761 point.x--;
3762 ret = pLogicalToPhysicalPointForPerMonitorDPI( hwnd, &point );
3763 ok( ret, "%Iu/%Iu: LogicalToPhysicalPointForPerMonitorDPI failed\n", i, j );
3764 /* get physical window rect */
3765 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
3766 GetWindowRect( hwnd, &rect );
3767 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~j );
3768 point.x = rect.left - 1;
3769 point.y = rect.top;
3770 ret = pPhysicalToLogicalPointForPerMonitorDPI( hwnd, &point );
3771 ok( !ret, "%Iu/%Iu: PhysicalToLogicalPointForPerMonitorDPI succeeded\n", i, j );
3772 point.x++;
3773 point.y--;
3774 ret = pPhysicalToLogicalPointForPerMonitorDPI( hwnd, &point );
3775 ok( !ret, "%Iu/%Iu: PhysicalToLogicalPointForPerMonitorDPI succeeded\n", i, j );
3776 point.y++;
3777 ret = pPhysicalToLogicalPointForPerMonitorDPI( hwnd, &point );
3778 ok( ret, "%Iu/%Iu: PhysicalToLogicalPointForPerMonitorDPI failed\n", i, j );
3779 point.x = rect.right;
3780 point.y = rect.bottom + 1;
3781 ret = pPhysicalToLogicalPointForPerMonitorDPI( hwnd, &point );
3782 ok( !ret, "%Iu/%Iu: PhysicalToLogicalPointForPerMonitorDPI succeeded\n", i, j );
3783 point.x++;
3784 point.y--;
3785 ret = pPhysicalToLogicalPointForPerMonitorDPI( hwnd, &point );
3786 ok( !ret, "%Iu/%Iu: PhysicalToLogicalPointForPerMonitorDPI succeeded\n", i, j );
3787 point.x--;
3788 ret = pPhysicalToLogicalPointForPerMonitorDPI( hwnd, &point );
3789 ok( ret, "%Iu/%Iu: PhysicalToLogicalPointForPerMonitorDPI failed\n", i, j );
3790 }
3792 }
3793 pSetThreadDpiAwarenessContext( context );
3794}
3795
3796static void test_dpi_aware(void)
3797{
3798 BOOL ret;
3799
3800 if (!pIsProcessDPIAware)
3801 {
3802 win_skip("IsProcessDPIAware not available\n");
3803 return;
3804 }
3805
3806 ret = pSetProcessDPIAware();
3807 ok(ret, "got %d\n", ret);
3808
3809 ret = pIsProcessDPIAware();
3810 ok(ret, "got %d\n", ret);
3811
3812 dpi = real_dpi;
3815 test_metrics_for_dpi( 192 );
3816}
3817
3819{
3820 DPI_AWARENESS_CONTEXT contexts[] =
3821 {
3822 (DPI_AWARENESS_CONTEXT)0x6010,
3823 (DPI_AWARENESS_CONTEXT)0x40006010,
3824 (DPI_AWARENESS_CONTEXT)((UINT_PTR)0x11 | (real_dpi << 8)),
3827 };
3828 DPI_AWARENESS_CONTEXT context, ctx, old_ctx, expect_ctx;
3829 UINT ret, i;
3830
3831 /* 0x11 is system aware DPI and only works with the current system DPI */
3832 if (arg == 0x11) context = contexts[2];
3833 else context = LongToHandle( arg ) /* sign-extend */;
3834
3835 if (context == DPI_AWARENESS_CONTEXT_UNAWARE) expect_ctx = contexts[0];
3836 else if (context == DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED) expect_ctx = contexts[1];
3837 else if (context == DPI_AWARENESS_CONTEXT_SYSTEM_AWARE) expect_ctx = contexts[2];
3838 else if (context == DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE) expect_ctx = contexts[3];
3839 else if (context == DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2) expect_ctx = contexts[4];
3840 else if ((arg & 0xff000000) == 0x80000000) expect_ctx = ULongToHandle( arg ) /* no sign-extend */;
3841 else expect_ctx = context;
3842
3843 winetest_push_context( "%#lx", arg );
3844
3845 ctx = pGetThreadDpiAwarenessContext();
3846 ok( ctx == (DPI_AWARENESS_CONTEXT)0x6010, "got %p\n", ctx );
3847
3848 SetLastError( 0xdeadbeef );
3849 ret = pSetProcessDpiAwarenessContext( 0 );
3850 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3851 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3852 SetLastError( 0xdeadbeef );
3853 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x11 );
3854 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3856 SetLastError( 0xdeadbeef );
3857 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x21 );
3858 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3859 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3860 SetLastError( 0xdeadbeef );
3861 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x32 );
3862 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3863 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3864 SetLastError( 0xdeadbeef );
3865 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6012 );
3866 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3867 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3868 SetLastError( 0xdeadbeef );
3869 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6022 );
3870 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3871 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3872 SetLastError( 0xdeadbeef );
3873 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x40006011 );
3874 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3875 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3876 SetLastError( 0xdeadbeef );
3877 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x40000012 );
3878 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3879 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3880 SetLastError( 0xdeadbeef );
3881 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x7810 );
3882 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3883 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3884 SetLastError( 0xdeadbeef );
3885 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x1ff11 );
3886 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3887 todo_wine ok( GetLastError() == ERROR_ACCESS_DENIED, "got %#lx\n", GetLastError() );
3888 ctx = pGetThreadDpiAwarenessContext();
3889 ok( ctx == (DPI_AWARENESS_CONTEXT)0x6010, "got %p\n", ctx );
3890
3891 SetLastError( 0xdeadbeef );
3892 ret = pSetProcessDpiAwarenessContext( context );
3893 ok( ret, "SetProcessDpiAwarenessContext failed, error %lu\n", GetLastError() );
3894 ok( GetLastError() == 0xdeadbeef, "got %#lx\n", GetLastError() );
3895 ctx = pGetThreadDpiAwarenessContext();
3896 ok( ctx == expect_ctx, "got %p\n", ctx );
3897
3898 for (i = 0; i < ARRAY_SIZE(contexts); i++)
3899 {
3900 SetLastError( 0xdeadbeef );
3901 ret = pSetProcessDpiAwarenessContext( contexts[i] );
3902 ok( !ret, "SetProcessDpiAwarenessContext succeeded\n" );
3903 ok( GetLastError() == ERROR_ACCESS_DENIED, "got %#lx\n", GetLastError() );
3904 ctx = pGetThreadDpiAwarenessContext();
3905 ok( ctx == expect_ctx, "got %p\n", ctx );
3906 }
3907
3908 /* thread DPI context overrides process DPI context */
3909 ctx = pGetThreadDpiAwarenessContext();
3910 ok( ctx == expect_ctx, "got %p\n", ctx );
3911 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x12 );
3912 ok( old_ctx == (DPI_AWARENESS_CONTEXT)ULongToHandle( 0x80000000 | (UINT_PTR)expect_ctx ), "got %p\n", old_ctx );
3913 ctx = pGetThreadDpiAwarenessContext();
3914 ok( ctx == (DPI_AWARENESS_CONTEXT)0x12, "got %p\n", ctx );
3915 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x22 );
3916 ok( old_ctx == ctx, "got %p\n", old_ctx );
3917 ctx = pGetThreadDpiAwarenessContext();
3918 ok( ctx == (DPI_AWARENESS_CONTEXT)0x22, "got %p\n", ctx );
3919
3920 /* thread DPI context can be reset to process DPI context with 0x80000000, but needs to be valid */
3921 SetLastError( 0xdeadbeef );
3922 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80000000 );
3923 ok( !old_ctx, "SetThreadDpiAwarenessContext succeeded\n" );
3924 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3925 SetLastError( 0xdeadbeef );
3926 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80000010 );
3927 ok( !old_ctx, "SetThreadDpiAwarenessContext succeeded\n" );
3928 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %#lx\n", GetLastError() );
3929
3930 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80006010 );
3931 ok( old_ctx == ctx, "got %p\n", old_ctx );
3932 ctx = pGetThreadDpiAwarenessContext();
3933 ok( ctx == expect_ctx, "got %p\n", ctx );
3934 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((UINT_PTR)0x80000011 | (real_dpi << 8)) );
3935 ok( old_ctx == ULongToHandle( 0x80000000 | (UINT_PTR)expect_ctx ), "got %p\n", old_ctx );
3936 ctx = pGetThreadDpiAwarenessContext();
3937 ok( ctx == expect_ctx, "got %p\n", ctx );
3938 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80000012 );
3939 ok( old_ctx == ULongToHandle( 0x80000000 | (UINT_PTR)expect_ctx ), "got %p\n", old_ctx );
3940 ctx = pGetThreadDpiAwarenessContext();
3941 ok( ctx == expect_ctx, "got %p\n", ctx );
3942 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80000022 );
3943 ok( old_ctx == ULongToHandle( 0x80000000 | (UINT_PTR)expect_ctx ), "got %p\n", old_ctx );
3944 ctx = pGetThreadDpiAwarenessContext();
3945 ok( ctx == expect_ctx, "got %p\n", ctx );
3946
3948}
3949
3951{
3952 DPI_AWARENESS_CONTEXT ctx, old_ctx;
3953
3954 if (!pSetThreadDpiAwarenessContext || !pGetThreadDpiAwarenessContext)
3955 {
3956 win_skip( "(Set|Get)ThreadDpiAwarenessContext missing, skipping tests\n" );
3957 return;
3958 }
3959
3960 ctx = pGetThreadDpiAwarenessContext();
3961 ok( ctx == (DPI_AWARENESS_CONTEXT)0x6010, "got %p\n", ctx );
3962
3963 old_ctx = pSetThreadDpiAwarenessContext( 0 );
3964 ok( !old_ctx, "SetThreadDpiAwarenessContext succeeded\n" );
3965 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x11 );
3966 ok( !old_ctx, "SetThreadDpiAwarenessContext succeeded\n" );
3967
3968 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x12 );
3969 ok( old_ctx == (DPI_AWARENESS_CONTEXT)0x80006010, "got %p\n", old_ctx );
3970 ctx = pGetThreadDpiAwarenessContext();
3971 ok( ctx == (DPI_AWARENESS_CONTEXT)0x12, "got %p\n", ctx );
3972 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x22 );
3973 ok( old_ctx == ctx, "got %p\n", old_ctx );
3974 ctx = pGetThreadDpiAwarenessContext();
3975 ok( ctx == (DPI_AWARENESS_CONTEXT)0x22, "got %p\n", ctx );
3976
3977 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x7810 );
3978 ok( !old_ctx, "SetThreadDpiAwarenessContext succeeded\n" );
3979 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6010 );
3980 ok( old_ctx == ctx, "got %p\n", old_ctx );
3981 ctx = pGetThreadDpiAwarenessContext();
3982 ok( ctx == (DPI_AWARENESS_CONTEXT)0x6010, "got %p\n", ctx );
3983
3984 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((UINT_PTR)0x11 | ((real_dpi + 1) << 8)) );
3985 ok( !old_ctx, "SetThreadDpiAwarenessContext succeeded\n" );
3986 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((UINT_PTR)0x11 | (real_dpi << 8)) );
3987 ok( old_ctx == ctx, "got %p\n", old_ctx );
3988 ctx = pGetThreadDpiAwarenessContext();
3989 ok( ctx == (DPI_AWARENESS_CONTEXT)((UINT_PTR)0x11 | (real_dpi << 8)), "got %p\n", ctx );
3990
3991 old_ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x40006010 );
3992 ok( old_ctx == ctx, "got %p\n", old_ctx );
3993 ctx = pGetThreadDpiAwarenessContext();
3994 ok( ctx == (DPI_AWARENESS_CONTEXT)0x40006010, "got %p\n", ctx );
3995
3996 old_ctx = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
3997 ok( old_ctx == ctx, "got %p\n", old_ctx );
3998 ctx = pGetThreadDpiAwarenessContext();
3999 ok( ctx == (DPI_AWARENESS_CONTEXT)0x6010, "got %p\n", ctx );
4000 old_ctx = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
4001 ok( old_ctx == ctx, "got %p\n", old_ctx );
4002 ctx = pGetThreadDpiAwarenessContext();
4003 ok( ctx == (DPI_AWARENESS_CONTEXT)((UINT_PTR)0x11 | (real_dpi << 8)), "got %p\n", ctx );
4004 old_ctx = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
4005 ok( old_ctx == ctx, "got %p\n", old_ctx );
4006 ctx = pGetThreadDpiAwarenessContext();
4007 ok( ctx == (DPI_AWARENESS_CONTEXT)0x12, "got %p\n", ctx );
4008 old_ctx = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 );
4009 ok( old_ctx == ctx, "got %p\n", old_ctx );
4010 ctx = pGetThreadDpiAwarenessContext();
4011 ok( ctx == (DPI_AWARENESS_CONTEXT)0x22, "got %p\n", ctx );
4012 old_ctx = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED );
4013 ok( old_ctx == ctx, "got %p\n", old_ctx );
4014 ctx = pGetThreadDpiAwarenessContext();
4015 ok( ctx == (DPI_AWARENESS_CONTEXT)0x40006010, "got %p\n", ctx );
4016
4017 /* restore process-wide DPI awareness context */
4018 ctx = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80006010 );
4019 ok( ctx == (DPI_AWARENESS_CONTEXT)0x40006010, "got %p\n", ctx );
4020}
4021
4023{
4024 UINT_PTR i;
4025 BOOL ret;
4026
4027 if (!pIsValidDpiAwarenessContext)
4028 {
4029 win_skip( "IsValidDpiAwarenessContext missing, skipping tests\n" );
4030 return;
4031 }
4032
4033 ret = pIsValidDpiAwarenessContext( 0 );
4034 ok( !ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4035
4036 /* commonly seen dpi awareness contexts */
4037 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x12 );
4038 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4039 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x22 );
4040 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4041 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6010 );
4042 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4043 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6011 );
4044 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4045 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x40006010 );
4046 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4047
4048 ret = pIsValidDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
4049 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4050 ret = pIsValidDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
4051 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4052 ret = pIsValidDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
4053 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4054 ret = pIsValidDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 );
4055 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4056 ret = pIsValidDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED );
4057 ok( ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4058 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)-6 );
4059 ok( !ret, "IsValidDpiAwarenessContext returned %u\n", ret );
4060
4061 for (i = 1; i < 0xff; i++)
4062 {
4063 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)i );
4064 if (i == 0x12 || i == 0x22) ok( ret, "IsValidDpiAwarenessContext %#Ix failed\n", i );
4065 /* 0x0011 is rejected on win11 */
4066 else if (i != 0x11) ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", i );
4067
4068 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)(i | 0x6000) );
4069 if (i == 0x10 || i == 0x11) ok( ret, "IsValidDpiAwarenessContext %#Ix failed\n", (i | 0x6000) );
4070 /* 0x6013 is accepted on win11 */
4071 else if (i != 0x13) ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", (i | 0x6000) );
4072
4073 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 8) | 0x10) );
4074 if (i == 0x60) ok( ret, "IsValidDpiAwarenessContext %#Ix failed\n", ((i << 8) | 0x10) );
4075 else ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 8) | 0x10) );
4076 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 8) | 0x11) );
4077 if (i != 0xff) ok( ret, "IsValidDpiAwarenessContext %#Ix failed\n", ((i << 8) | 0x11) );
4078 else ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 8) | 0x11) );
4079 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 8) | 0x12) );
4080 ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 8) | 0x12) );
4081 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 8) | 0x22) );
4082 ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 8) | 0x22) );
4083
4084 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 16) | 0x6010) );
4085 ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 16) | 0x6010) );
4086 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 16) | (real_dpi << 8) | 0x11) );
4087 if (i == 1) ok( ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 16) | (real_dpi << 8) | 0x11) );
4088 else ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 16) | (real_dpi << 8) | 0x11) );
4089 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 16) | 0x12) );
4090 ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 16) | 0x12) );
4091 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 16) | 0x22) );
4092 ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 16) | 0x22) );
4093
4094 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 24) | 0x6010) );
4095 if (i & 0x1f) ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 24) | 0x6010) );
4096 /* 0x20000000 is rejected on win11 */
4097 else if (!(i & 0x20)) ok( ret, "IsValidDpiAwarenessContext %#Ix failed\n", ((i << 24) | 0x6010) );
4098 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 24) | (real_dpi << 8) | 0x11) );
4099 if (i & 0x5f) ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 24) | (real_dpi << 8) | 0x11) );
4100 /* 0x20000000 is rejected on win11 */
4101 else if (!(i & 0x20)) ok( ret, "IsValidDpiAwarenessContext %#Ix failed\n", ((i << 24) | (real_dpi << 8) | 0x11) );
4102 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 24) | 0x12) );
4103 if (i & 0x5f) ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 24) | 0x12) );
4104 /* 0x20000000 is rejected on win11 */
4105 else if (!(i & 0x20)) ok( ret, "IsValidDpiAwarenessContext %#Ix failed\n", ((i << 24) | 0x12) );
4106 ret = pIsValidDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)((i << 24) | 0x22) );
4107 if (i & 0x5f) ok( !ret, "IsValidDpiAwarenessContext %#Ix succeeded\n", ((i << 24) | 0x22) );
4108 /* 0x20000000 is rejected on win11 */
4109 else if (!(i & 0x20)) ok( ret, "IsValidDpiAwarenessContext %#Ix failed\n", ((i << 24) | 0x22) );
4110 }
4111}
4112
4114{
4115 UINT ret;
4116
4117 if (!pGetDpiFromDpiAwarenessContext)
4118 {
4119 win_skip( "GetDpiFromDpiAwarenessContext missing, skipping tests\n" );
4120 return;
4121 }
4122
4123 ret = pGetDpiFromDpiAwarenessContext( 0 );
4124 ok( !ret, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4125
4126 ret = pGetDpiFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x11 );
4127 ok( ret == 0, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4128 ret = pGetDpiFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x12 );
4129 ok( ret == 0, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4130 ret = pGetDpiFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x22 );
4131 ok( ret == 0, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4132 ret = pGetDpiFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6010 );
4133 ok( ret == 96, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4134 ret = pGetDpiFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6011 );
4135 ok( ret == 96, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4136 ret = pGetDpiFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6111 );
4137 ok( ret == 97, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4138 ret = pGetDpiFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x7811 );
4139 ok( ret == 120, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4140 ret = pGetDpiFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x10011 );
4141 ok( ret == 256, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4142 ret = pGetDpiFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x40006010 );
4143 ok( ret == 96, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4144
4145 ret = pGetDpiFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
4146 ok( ret == 96, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4147 ret = pGetDpiFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
4148 ok( ret == real_dpi, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4149 ret = pGetDpiFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
4150 ok( ret == 0, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4151 ret = pGetDpiFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 );
4152 ok( ret == 0, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4153 ret = pGetDpiFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED );
4154 ok( ret == 96, "GetDpiFromDpiAwarenessContext returned %u\n", ret );
4155}
4156
4158{
4159 BOOL ret;
4160
4161 if (!pAreDpiAwarenessContextsEqual)
4162 {
4163 win_skip( "AreDpiAwarenessContextsEqual missing, skipping tests\n" );
4164 return;
4165 }
4166
4167 ret = pAreDpiAwarenessContextsEqual( 0, 0 );
4168 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4169
4170 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x12, (DPI_AWARENESS_CONTEXT)0x12 );
4171 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4172 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x22, (DPI_AWARENESS_CONTEXT)0x22 );
4173 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4174 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x6010, (DPI_AWARENESS_CONTEXT)0x6010 );
4175 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4176 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x6011, (DPI_AWARENESS_CONTEXT)0x6011 );
4177 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4178 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x6111, (DPI_AWARENESS_CONTEXT)0x6111 );
4179 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4180 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x7811, (DPI_AWARENESS_CONTEXT)0x7811 );
4181 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4182 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x40006010, (DPI_AWARENESS_CONTEXT)0x40006010 );
4183 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4184
4185 ret = pAreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT_UNAWARE, DPI_AWARENESS_CONTEXT_UNAWARE );
4186 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4188 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4190 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4192 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4194 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4195
4196 ret = pAreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT_UNAWARE, (DPI_AWARENESS_CONTEXT)0x6010 );
4197 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4198 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x6010, DPI_AWARENESS_CONTEXT_UNAWARE );
4199 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4200 ret = pAreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT_UNAWARE, (DPI_AWARENESS_CONTEXT)0x10 );
4201 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4202
4203 ret = pAreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE, (DPI_AWARENESS_CONTEXT)((UINT_PTR)0x11 | (real_dpi << 8)) );
4204 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4205 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)((UINT_PTR)0x11 | (real_dpi << 8)), DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
4206 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4207 ret = pAreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE, (DPI_AWARENESS_CONTEXT)0x11 );
4208 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4209
4210 ret = pAreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE, (DPI_AWARENESS_CONTEXT)0x12 );
4211 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4212 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x12, DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
4213 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4214 ret = pAreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2, (DPI_AWARENESS_CONTEXT)0x22 );
4215 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4216 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x22, DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 );
4217 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4218 ret = pAreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED, (DPI_AWARENESS_CONTEXT)0x40006010 );
4219 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4220 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x40006010, DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED );
4221 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4222 ret = pAreDpiAwarenessContextsEqual( DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED, (DPI_AWARENESS_CONTEXT)0x40000010 );
4223 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4224
4225 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x10, (DPI_AWARENESS_CONTEXT)0x6010 );
4226 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4227 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x11, (DPI_AWARENESS_CONTEXT)0x6011 );
4228 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4229 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x12, (DPI_AWARENESS_CONTEXT)0x6012 );
4230 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4231 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x22, (DPI_AWARENESS_CONTEXT)0x6022 );
4232 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4233 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x20006010, (DPI_AWARENESS_CONTEXT)0x6010 );
4234 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4235 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x40006010, (DPI_AWARENESS_CONTEXT)0x6010 );
4236 ok( !ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4237 ret = pAreDpiAwarenessContextsEqual( (DPI_AWARENESS_CONTEXT)0x80006010, (DPI_AWARENESS_CONTEXT)0x6010 );
4238 ok( ret, "AreDpiAwarenessContextsEqual returned %u\n", ret );
4239}
4240
4242{
4244
4245 if (!pGetAwarenessFromDpiAwarenessContext)
4246 {
4247 win_skip( "GetAwarenessFromDpiAwarenessContext missing, skipping tests\n" );
4248 return;
4249 }
4250
4251 ret = pGetAwarenessFromDpiAwarenessContext( 0 );
4252 ok( ret == -1, "got %u\n", ret );
4253
4254 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x12 );
4255 ok( ret == DPI_AWARENESS_PER_MONITOR_AWARE, "got %u\n", ret );
4256 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x22 );
4257 ok( ret == DPI_AWARENESS_PER_MONITOR_AWARE, "got %u\n", ret );
4258 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6010 );
4259 ok( ret == DPI_AWARENESS_UNAWARE, "got %u\n", ret );
4260 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6011 );
4261 ok( ret == DPI_AWARENESS_SYSTEM_AWARE, "got %u\n", ret );
4262 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x6111 );
4263 ok( ret == DPI_AWARENESS_SYSTEM_AWARE, "got %u\n", ret );
4264 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x7811 );
4265 ok( ret == DPI_AWARENESS_SYSTEM_AWARE, "got %u\n", ret );
4266 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x10011 );
4267 ok( ret == DPI_AWARENESS_SYSTEM_AWARE, "got %u\n", ret );
4268 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x40006010 );
4269 ok( ret == DPI_AWARENESS_UNAWARE, "got %u\n", ret );
4270 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80000012 );
4271 ok( ret == DPI_AWARENESS_PER_MONITOR_AWARE, "got %u\n", ret );
4272 ret = pGetAwarenessFromDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80006010 );
4273 ok( ret == DPI_AWARENESS_UNAWARE, "got %u\n", ret );
4274
4275 ret = pGetAwarenessFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
4276 ok( ret == DPI_AWARENESS_UNAWARE, "got %u\n", ret );
4277 ret = pGetAwarenessFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
4278 ok( ret == DPI_AWARENESS_SYSTEM_AWARE, "got %u\n", ret );
4279 ret = pGetAwarenessFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
4280 ok( ret == DPI_AWARENESS_PER_MONITOR_AWARE, "got %u\n", ret );
4281 ret = pGetAwarenessFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2 );
4282 ok( ret == DPI_AWARENESS_PER_MONITOR_AWARE, "got %u\n", ret );
4283 ret = pGetAwarenessFromDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED );
4284 ok( ret == DPI_AWARENESS_UNAWARE, "got %u\n", ret );
4285}
4286
4287static void test_dpi_context(void)
4288{
4289 DPI_AWARENESS awareness;
4291 BOOL ret;
4292 UINT dpi;
4293 HDC hdc = GetDC( 0 );
4294
4295 context = pGetThreadDpiAwarenessContext();
4296 ok( context == (DPI_AWARENESS_CONTEXT)0x6010, "wrong context %p\n", context );
4297 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4298 ok( awareness == DPI_AWARENESS_UNAWARE, "wrong awareness %u\n", awareness );
4299 ok( !pIsProcessDPIAware(), "already aware\n" );
4300 dpi = pGetDpiForSystem();
4302 ok( dpi == USER_DEFAULT_SCREEN_DPI, "wrong dpi %u\n", dpi );
4305 ok( dpi == USER_DEFAULT_SCREEN_DPI, "wrong dpi %u\n", dpi );
4306 SetLastError( 0xdeadbeef );
4307 ret = pSetProcessDpiAwarenessContext( NULL );
4308 ok( !ret, "got %d\n", ret );
4309 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %lu\n", GetLastError() );
4310 SetLastError( 0xdeadbeef );
4311 ret = pSetProcessDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)-6 );
4312 ok( !ret, "got %d\n", ret );
4313 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %lu\n", GetLastError() );
4314 ret = pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
4315 ok( ret, "got %d\n", ret );
4316 ok( pIsProcessDPIAware(), "not aware\n" );
4317 real_dpi = pGetDpiForSystem();
4318 SetLastError( 0xdeadbeef );
4319 ret = pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
4320 ok( !ret, "got %d\n", ret );
4321 ok( GetLastError() == ERROR_ACCESS_DENIED, "wrong error %lu\n", GetLastError() );
4322 SetLastError( 0xdeadbeef );
4323 ret = pSetProcessDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
4324 ok( !ret, "got %d\n", ret );
4325 ok( GetLastError() == ERROR_ACCESS_DENIED, "wrong error %lu\n", GetLastError() );
4326
4327 ret = pSetProcessDpiAwarenessInternal( DPI_AWARENESS_INVALID );
4328 ok( !ret, "got %d\n", ret );
4329 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %lu\n", GetLastError() );
4330 ret = pSetProcessDpiAwarenessInternal( DPI_AWARENESS_UNAWARE );
4331 ok( !ret, "got %d\n", ret );
4332 ok( GetLastError() == ERROR_ACCESS_DENIED, "wrong error %lu\n", GetLastError() );
4333 ret = pGetProcessDpiAwarenessInternal( 0, &awareness );
4334 ok( ret, "got %d\n", ret );
4335 ok( awareness == DPI_AWARENESS_SYSTEM_AWARE, "wrong value %d\n", awareness );
4336 ret = pGetProcessDpiAwarenessInternal( GetCurrentProcess(), &awareness );
4337 ok( ret, "got %d\n", ret );
4338 ok( awareness == DPI_AWARENESS_SYSTEM_AWARE, "wrong value %d\n", awareness );
4339 SetLastError(0xdeadbeef);
4340 ret = pGetProcessDpiAwarenessInternal( (HANDLE)0xdeadbeef, &awareness );
4341 todo_wine
4342 ok( !ret || broken(ret) /* <= win10 1709 */, "got %d\n", ret );
4343 if (!ret)
4344 {
4345 ok( GetLastError() == ERROR_INVALID_PARAMETER, "got %lu\n", GetLastError() );
4346 ok( awareness == DPI_AWARENESS_INVALID, "wrong value %d\n", awareness );
4347 }
4348 else ok( awareness == DPI_AWARENESS_UNAWARE, "wrong value %d\n", awareness );
4349
4350 ret = pIsProcessDPIAware();
4351 ok(ret, "got %d\n", ret);
4352 context = pGetThreadDpiAwarenessContext();
4353 ok( context == (DPI_AWARENESS_CONTEXT)0x6011, "wrong context %p\n", context );
4354 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4355 ok( awareness == DPI_AWARENESS_SYSTEM_AWARE, "wrong awareness %u\n", awareness );
4356 SetLastError( 0xdeadbeef );
4357 context = pSetThreadDpiAwarenessContext( 0 );
4358 ok( !context, "got %p\n", context );
4359 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %lu\n", GetLastError() );
4360 SetLastError( 0xdeadbeef );
4361 context = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)-6 );
4362 ok( !context, "got %p\n", context );
4363 ok( GetLastError() == ERROR_INVALID_PARAMETER, "wrong error %lu\n", GetLastError() );
4364 context = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
4365 ok( context == (DPI_AWARENESS_CONTEXT)0x80006011, "wrong context %p\n", context );
4366 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4367 ok( awareness == DPI_AWARENESS_SYSTEM_AWARE, "wrong awareness %u\n", awareness );
4368 dpi = pGetDpiForSystem();
4369 ok( dpi == USER_DEFAULT_SCREEN_DPI, "wrong dpi %u\n", dpi );
4371 ok( dpi == USER_DEFAULT_SCREEN_DPI, "wrong dpi %u\n", dpi );
4372 ok( !pIsProcessDPIAware(), "still aware\n" );
4373 context = pGetThreadDpiAwarenessContext();
4374 ok( context == (DPI_AWARENESS_CONTEXT)0x6010, "wrong context %p\n", context );
4375 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4376 ok( awareness == DPI_AWARENESS_UNAWARE, "wrong awareness %u\n", awareness );
4377 context = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
4378 ok( context == (DPI_AWARENESS_CONTEXT)0x6010, "wrong context %p\n", context );
4379 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4380 ok( awareness == DPI_AWARENESS_UNAWARE, "wrong awareness %u\n", awareness );
4381 dpi = pGetDpiForSystem();
4382 ok( dpi == real_dpi, "wrong dpi %u/%u\n", dpi, real_dpi );
4384 ok( dpi == real_dpi, "wrong dpi %u\n", dpi );
4385 context = pGetThreadDpiAwarenessContext();
4386 ok( context == (DPI_AWARENESS_CONTEXT)0x12, "wrong context %p\n", context );
4387 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4388 ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
4389 context = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_SYSTEM_AWARE );
4390 ok( context == (DPI_AWARENESS_CONTEXT)0x12, "wrong context %p\n", context );
4391 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4392 ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
4393 dpi = pGetDpiForSystem();
4394 ok( dpi == real_dpi, "wrong dpi %u/%u\n", dpi, real_dpi );
4396 ok( dpi == real_dpi, "wrong dpi %u\n", dpi );
4397 ok( pIsProcessDPIAware(), "not aware\n" );
4398 context = pGetThreadDpiAwarenessContext();
4399 ok( context == (DPI_AWARENESS_CONTEXT)0x6011, "wrong context %p\n", context );
4400 context = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80006010 );
4401 ok( context == (DPI_AWARENESS_CONTEXT)0x6011, "wrong context %p\n", context );
4402 context = pGetThreadDpiAwarenessContext();
4403 ok( context == (DPI_AWARENESS_CONTEXT)0x6011, "wrong context %p\n", context );
4404 context = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x80006011 );
4405 ok( context == (DPI_AWARENESS_CONTEXT)0x80006011, "wrong context %p\n", context );
4406 context = pGetThreadDpiAwarenessContext();
4407 ok( context == (DPI_AWARENESS_CONTEXT)0x6011, "wrong context %p\n", context );
4408 context = pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)0x12 );
4409 ok( context == (DPI_AWARENESS_CONTEXT)0x80006011, "wrong context %p\n", context );
4410 context = pSetThreadDpiAwarenessContext( context );
4411 ok( context == (DPI_AWARENESS_CONTEXT)0x12, "wrong context %p\n", context );
4412 context = pGetThreadDpiAwarenessContext();
4413 ok( context == (DPI_AWARENESS_CONTEXT)0x6011, "wrong context %p\n", context );
4414
4416 ReleaseDC( 0, hdc );
4417}
4418
4420{
4421 DPI_AWARENESS_CONTEXT ctx = pGetWindowDpiAwarenessContext( hwnd );
4422 DPI_AWARENESS_CONTEXT ctx2 = pGetThreadDpiAwarenessContext();
4423 DWORD pos, pos2;
4424
4425 ok( pGetAwarenessFromDpiAwarenessContext( ctx ) == pGetAwarenessFromDpiAwarenessContext( ctx2 ),
4426 "msg %04x wrong awareness %p / %p\n", msg, ctx, ctx2 );
4427 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
4428 pos = GetMessagePos();
4429 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE );
4430 pos2 = GetMessagePos();
4431 ok( pos == pos2, "wrong pos %08lx / %08lx\n", pos, pos2 );
4432 pSetThreadDpiAwarenessContext( ctx2 );
4433 return DefWindowProcA( hwnd, msg, wp, lp );
4434}
4435
4436static void test_dpi_window(void)
4437{
4439 DPI_AWARENESS awareness;
4440 ULONG_PTR i, j;
4441 UINT dpi;
4442 HWND hwnd, child, ret;
4443 MSG msg = { 0, WM_USER + 1, 0, 0 };
4444
4445 if (!pGetWindowDpiAwarenessContext)
4446 {
4447 win_skip( "GetWindowDpiAwarenessContext not supported\n" );
4448 return;
4449 }
4450 orig = pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
4452 {
4453 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~i );
4454 hwnd = CreateWindowA( "DpiTestClass", "Test",
4455 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
4456 ok( hwnd != 0, "failed to create window\n" );
4457 context = pGetWindowDpiAwarenessContext( hwnd );
4458 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4459 ok( awareness == i, "%Iu: wrong awareness %u\n", i, awareness );
4460 dpi = pGetDpiForWindow( hwnd );
4462 "%Iu: got %u / %u\n", i, dpi, real_dpi );
4463 if (pGetDpiForMonitorInternal)
4464 {
4465 BOOL res;
4466 SetLastError( 0xdeadbeef );
4467 res = pGetDpiForMonitorInternal( MonitorFromWindow( hwnd, 0 ), 0, &dpi, NULL );
4468 ok( !res, "succeeded\n" );
4469 ok( GetLastError() == ERROR_INVALID_ADDRESS, "wrong error %lu\n", GetLastError() );
4470 SetLastError( 0xdeadbeef );
4471 res = pGetDpiForMonitorInternal( MonitorFromWindow( hwnd, 0 ), 3, &dpi, &dpi );
4472 ok( !res, "succeeded\n" );
4473 ok( GetLastError() == ERROR_BAD_ARGUMENTS, "wrong error %lu\n", GetLastError() );
4474 SetLastError( 0xdeadbeef );
4475 res = pGetDpiForMonitorInternal( MonitorFromWindow( hwnd, 0 ), 3, &dpi, NULL );
4476 ok( !res, "succeeded\n" );
4477 ok( GetLastError() == ERROR_BAD_ARGUMENTS, "wrong error %lu\n", GetLastError() );
4478 res = pGetDpiForMonitorInternal( MonitorFromWindow( hwnd, 0 ), 0, &dpi, &dpi );
4479 ok( res, "failed err %lu\n", GetLastError() );
4481 "%Iu: got %u / %u\n", i, dpi, real_dpi );
4482 }
4483 msg.hwnd = hwnd;
4485 {
4486 pSetThreadDpiAwarenessContext( (DPI_AWARENESS_CONTEXT)~j );
4487 SendMessageA( hwnd, WM_USER, 0, 0 );
4489 CallWindowProcA( dpi_winproc, hwnd, WM_USER + 2, 0, 0 );
4490 child = CreateWindowA( "DpiTestClass", "Test",
4491 WS_CHILD, 0, 0, 100, 100, hwnd, 0, GetModuleHandleA(0), NULL );
4492 context = pGetWindowDpiAwarenessContext( child );
4493 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4494 ok( awareness == i, "%Iu/%Iu: wrong awareness %u\n", i, j, awareness );
4495 dpi = pGetDpiForWindow( child );
4497 "%Iu/%Iu: got %u / %u\n", i, j, dpi, real_dpi );
4498 ret = SetParent( child, NULL );
4499 ok( ret != 0, "SetParent failed err %lu\n", GetLastError() );
4500 context = pGetWindowDpiAwarenessContext( child );
4501 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4502 ok( awareness == i, "%Iu/%Iu: wrong awareness %u\n", i, j, awareness );
4503 dpi = pGetDpiForWindow( child );
4505 "%Iu/%Iu: got %u / %u\n", i, j, dpi, real_dpi );
4507 child = CreateWindowA( "DpiTestClass", "Test",
4508 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, GetModuleHandleA(0), NULL );
4509 context = pGetWindowDpiAwarenessContext( child );
4510 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4511 ok( awareness == j, "%Iu/%Iu: wrong awareness %u\n", i, j, awareness );
4512 dpi = pGetDpiForWindow( child );
4514 "%Iu/%Iu: got %u / %u\n", i, j, dpi, real_dpi );
4515 ret = SetParent( child, hwnd );
4516 ok( ret != 0 || GetLastError() == ERROR_INVALID_STATE,
4517 "SetParent failed err %lu\n", GetLastError() );
4518 context = pGetWindowDpiAwarenessContext( child );
4519 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4520 ok( awareness == (ret ? i : j), "%Iu/%Iu: wrong awareness %u\n", i, j, awareness );
4521 dpi = pGetDpiForWindow( child );
4523 "%Iu/%Iu: got %u / %u\n", i, j, dpi, real_dpi );
4525 }
4527 }
4528
4529 SetLastError( 0xdeadbeef );
4530 context = pGetWindowDpiAwarenessContext( (HWND)0xdeadbeef );
4531 ok( !context, "got %p\n", context );
4532 ok( GetLastError() == ERROR_INVALID_WINDOW_HANDLE, "wrong error %lu\n", GetLastError() );
4533 SetLastError( 0xdeadbeef );
4534 dpi = pGetDpiForWindow( (HWND)0xdeadbeef );
4535 ok( !dpi, "got %u\n", dpi );
4537 "wrong error %lu\n", GetLastError() );
4538
4539 SetLastError( 0xdeadbeef );
4540 context = pGetWindowDpiAwarenessContext( GetDesktopWindow() );
4541 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4542 ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
4543 dpi = pGetDpiForWindow( GetDesktopWindow() );
4544 ok( dpi == real_dpi, "got %u / %u\n", dpi, real_dpi );
4545
4546 pSetThreadDpiAwarenessContext( DPI_AWARENESS_CONTEXT_UNAWARE );
4547 SetLastError( 0xdeadbeef );
4548 context = pGetWindowDpiAwarenessContext( GetDesktopWindow() );
4549 awareness = pGetAwarenessFromDpiAwarenessContext( context );
4550 ok( awareness == DPI_AWARENESS_PER_MONITOR_AWARE, "wrong awareness %u\n", awareness );
4551 dpi = pGetDpiForWindow( GetDesktopWindow() );
4552 ok( dpi == real_dpi, "got %u / %u\n", dpi, real_dpi );
4553
4554 pSetThreadDpiAwarenessContext( orig );
4555}
4556
4558{
4560 BOOL ret;
4561
4562 if (!pGetAutoRotationState)
4563 {
4564 win_skip("GetAutoRotationState not supported\n");
4565 return;
4566 }
4567
4568 SetLastError(0xdeadbeef);
4569 ret = pGetAutoRotationState(NULL);
4570 ok(!ret, "Expected GetAutoRotationState to fail\n");
4571 ok(GetLastError() == ERROR_INVALID_PARAMETER, "Expected ERROR_INVALID_PARAMETER, got %ld\n", GetLastError());
4572
4573 state = 0;
4574 ret = pGetAutoRotationState(&state);
4575 ok(ret, "Expected GetAutoRotationState to succeed, error %ld\n", GetLastError());
4576}
4577
4578static void test_LOGFONT_charset(void)
4579{
4580 CHARSETINFO csi;
4581 LOGFONTA lf;
4582 NONCLIENTMETRICSA ncm;
4583 BOOL ret;
4584
4586 ok(ret, "TranslateCharsetInfo(%d) error %lu\n", GetACP(), GetLastError());
4587
4588 GetObjectA(GetStockObject(DEFAULT_GUI_FONT), sizeof(lf), &lf);
4589 ok(lf.lfCharSet == csi.ciCharset, "got %d, expected %d\n", lf.lfCharSet, csi.ciCharset);
4590
4592 ok(ret, "SystemParametersInfoW error %lu\n", GetLastError());
4593 ok(lf.lfCharSet == DEFAULT_CHARSET, "got %d\n", lf.lfCharSet);
4594
4595 ncm.cbSize = FIELD_OFFSET(NONCLIENTMETRICSA, iPaddedBorderWidth);
4596 ret = SystemParametersInfoA(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
4597 ok(ret, "SystemParametersInfoW error %lu\n", GetLastError());
4598 ok(ncm.lfCaptionFont.lfCharSet == DEFAULT_CHARSET, "got %d\n", ncm.lfCaptionFont.lfCharSet);
4599 ok(ncm.lfSmCaptionFont.lfCharSet == DEFAULT_CHARSET, "got %d\n", ncm.lfSmCaptionFont.lfCharSet);
4600}
4601
4602START_TEST(sysparams)
4603{
4604 int argc;
4605 char** argv;
4606 WNDCLASSA wc;
4607 MSG msg;
4608 HDC hdc;
4612
4613 hdll = GetModuleHandleA("user32.dll");
4614 pIsProcessDPIAware = (void*)GetProcAddress(hdll, "IsProcessDPIAware");
4615 pSetProcessDPIAware = (void*)GetProcAddress(hdll, "SetProcessDPIAware");
4616 pGetDpiForSystem = (void*)GetProcAddress(hdll, "GetDpiForSystem");
4617 pGetDpiForWindow = (void*)GetProcAddress(hdll, "GetDpiForWindow");
4618 pGetDpiForMonitorInternal = (void*)GetProcAddress(hdll, "GetDpiForMonitorInternal");
4619 pSetProcessDpiAwarenessContext = (void*)GetProcAddress(hdll, "SetProcessDpiAwarenessContext");
4620 pGetProcessDpiAwarenessInternal = (void*)GetProcAddress(hdll, "GetProcessDpiAwarenessInternal");
4621 pSetProcessDpiAwarenessInternal = (void*)GetProcAddress(hdll, "SetProcessDpiAwarenessInternal");
4622 pGetThreadDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetThreadDpiAwarenessContext");
4623 pSetThreadDpiAwarenessContext = (void*)GetProcAddress(hdll, "SetThreadDpiAwarenessContext");
4624 pGetWindowDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetWindowDpiAwarenessContext");
4625 pGetAwarenessFromDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetAwarenessFromDpiAwarenessContext");
4626 pIsValidDpiAwarenessContext = (void*)GetProcAddress(hdll, "IsValidDpiAwarenessContext");
4627 pGetSystemMetricsForDpi = (void*)GetProcAddress(hdll, "GetSystemMetricsForDpi");
4628 pSystemParametersInfoForDpi = (void*)GetProcAddress(hdll, "SystemParametersInfoForDpi");
4629 pAdjustWindowRectExForDpi = (void*)GetProcAddress(hdll, "AdjustWindowRectExForDpi");
4630 pLogicalToPhysicalPointForPerMonitorDPI = (void*)GetProcAddress(hdll, "LogicalToPhysicalPointForPerMonitorDPI");
4631 pPhysicalToLogicalPointForPerMonitorDPI = (void*)GetProcAddress(hdll, "PhysicalToLogicalPointForPerMonitorDPI");
4632 pGetAutoRotationState = (void*)GetProcAddress(hdll, "GetAutoRotationState");
4633 pAreDpiAwarenessContextsEqual = (void*)GetProcAddress(hdll, "AreDpiAwarenessContextsEqual");
4634 pGetDpiFromDpiAwarenessContext = (void*)GetProcAddress(hdll, "GetDpiFromDpiAwarenessContext");
4635
4637 hdc = GetDC(0);
4640 ReleaseDC( 0, hdc);
4641
4642 /* This test requires interactivity, if we don't have it, give up */
4645
4647 strict=(argc >= 3 && strcmp(argv[2],"strict")==0);
4648
4649 if (argc > 3 && !strcmp( argv[2], "SetProcessDpiAwarenessContext" ))
4650 {
4652 return;
4653 }
4654
4655 trace("dpi %d real_dpi %d, strict %d\n", dpi, real_dpi, strict);
4656
4658
4659 trace("testing GetSystemMetrics with your current desktop settings\n");
4661 test_metrics_for_dpi( 192 );
4670
4671 change_counter = 0;
4673
4674 wc.lpszClassName = "SysParamsTestClass";
4677 wc.hInstance = hInstance;
4679 wc.hCursor = LoadCursorA( 0, (LPCSTR)IDC_ARROW );
4680 wc.hbrBackground = (HBRUSH)( COLOR_WINDOW + 1 );
4681 wc.lpszMenuName = 0;
4682 wc.cbClsExtra = 0;
4683 wc.cbWndExtra = 0;
4684 RegisterClassA( &wc );
4685 wc.lpszClassName = "DpiTestClass";
4687 RegisterClassA( &wc );
4688
4689 ghTestWnd = CreateWindowA( "SysParamsTestClass", "Test System Parameters Application",
4690 WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, 0, 0, hInstance, NULL );
4691
4693 assert( hThread );
4695
4696 while( GetMessageA( &msg, 0, 0, 0 )) {
4699 }
4700
4701 if (pSetThreadDpiAwarenessContext)
4702 {
4706 }
4707 else win_skip( "SetThreadDpiAwarenessContext not supported\n" );
4708
4710
4711 if (!pSetProcessDpiAwarenessContext || !pSetThreadDpiAwarenessContext || !pGetThreadDpiAwarenessContext)
4712 win_skip( "SetProcessDpiAwarenessContext not supported\n" );
4713 else
4714 {
4715 run_in_process( argv, "SetProcessDpiAwarenessContext 0x6010" );
4716 run_in_process( argv, "SetProcessDpiAwarenessContext 0x11" );
4717 run_in_process( argv, "SetProcessDpiAwarenessContext 0x12" );
4718 run_in_process( argv, "SetProcessDpiAwarenessContext 0x22" );
4719 run_in_process( argv, "SetProcessDpiAwarenessContext 0x40006010" );
4720 run_in_process( argv, "SetProcessDpiAwarenessContext 0x80006010" );
4721 run_in_process( argv, "SetProcessDpiAwarenessContext 0x80000012" );
4722 run_in_process( argv, "SetProcessDpiAwarenessContext 0x80000022" );
4723
4724 /* user32 allows abstract DPI contexts to be used */
4725 run_in_process( argv, "SetProcessDpiAwarenessContext 0xffffffff" );
4726 run_in_process( argv, "SetProcessDpiAwarenessContext 0xfffffffe" );
4727 run_in_process( argv, "SetProcessDpiAwarenessContext 0xfffffffd" );
4728 run_in_process( argv, "SetProcessDpiAwarenessContext 0xfffffffc" );
4729 run_in_process( argv, "SetProcessDpiAwarenessContext 0xfffffffb" );
4730 }
4731}
struct mke2fs_defaults settings[]
static HFONT hfont
@ lparam
Definition: SystemMenu.c:31
@ optional
Definition: SystemMenu.c:34
#define expect(EXPECTED, GOT)
Definition: SystemMenu.c:483
short INT16
Definition: actypes.h:130
static void startup(void)
static int state
Definition: maze.c:121
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
static const char * wine_dbgstr_rect(const RECT *prc)
Definition: atltest.h:160
#define msg(x)
Definition: auth_time.c:54
HANDLE HMONITOR
Definition: axextend.idl:431
HWND hWnd
Definition: settings.c:17
#define SPI_GETWHEELSCROLLCHARS
#define ARRAY_SIZE(A)
Definition: main.h:20
#define LongToHandle(h)
Definition: basetsd.h:76
#define ULongToHandle(h)
Definition: basetsd.h:75
#define ULongToPtr(ul)
Definition: basetsd.h:86
#define RegCloseKey(hKey)
Definition: registry.h:49
HINSTANCE hInstance
Definition: charmap.c:19
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define WAIT_TIMEOUT
Definition: dderror.h:14
#define CCHDEVICENAME
Definition: ddrawi.h:63
#define ERROR_SUCCESS
Definition: deptool.c:10
#define LF_FACESIZE
Definition: dimm.idl:39
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
DWORD bpp
Definition: surface.c:185
LONG WINAPI RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3234
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
Definition: reg.c:4009
#define CloseHandle
Definition: compat.h:739
#define ERROR_INVALID_ADDRESS
Definition: compat.h:106
#define ERROR_CALL_NOT_IMPLEMENTED
Definition: compat.h:102
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ERROR_MOD_NOT_FOUND
Definition: compat.h:104
#define CP_ACP
Definition: compat.h:109
#define SetLastError(x)
Definition: compat.h:752
#define GetProcAddress(x, y)
Definition: compat.h:753
#define GetCurrentProcess()
Definition: compat.h:759
HANDLE HWND
Definition: compat.h:19
#define MAX_PATH
Definition: compat.h:34
#define CALLBACK
Definition: compat.h:35
#define WideCharToMultiByte
Definition: compat.h:111
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
UINT WINAPI GetACP(void)
Definition: locale.c:2023
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4133
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA(const char *app_name, char *cmd_line, SECURITY_ATTRIBUTES *process_attr, SECURITY_ATTRIBUTES *thread_attr, BOOL inherit, DWORD flags, void *env, const char *cur_dir, STARTUPINFOA *startup_info, PROCESS_INFORMATION *info)
Definition: process.c:686
MonoAssembly int argc
Definition: metahost.c:107
#define assert(_expr)
Definition: assert.h:32
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2802
_ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl _ACRTIMP int __cdecl sscanf(const char *, const char *,...) __WINE_CRT_SCANF_ATTR(2
_ACRTIMP int __cdecl atoi(const char *)
Definition: string.c:1715
_ACRTIMP __msvcrt_ulong __cdecl strtoul(const char *, char **, int)
Definition: string.c:1859
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3319
#define pt(x, y)
Definition: drawing.c:79
return ret
Definition: mutex.c:146
action
Definition: namespace.c:707
#define wrap(journal, var)
Definition: recovery.c:207
#define UlongToPtr(u)
Definition: config.h:106
POINTL point
Definition: edittest.c:50
#define abs(i)
Definition: fconv.c:206
DWORD dwThreadId
Definition: fdebug.c:31
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
return adapter
FxAutoRegKey hKey
pKey DeleteObject()
GLint GLint GLsizei GLsizei GLsizei GLint border
Definition: gl.h:1546
GLint GLint GLint GLint GLint x
Definition: gl.h:1548
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLint GLint GLint GLint GLint GLint y
Definition: gl.h:1548
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLint GLint GLsizei GLsizei height
Definition: gl.h:1546
GLint GLint GLsizei width
Definition: gl.h:1546
GLuint res
Definition: glext.h:9613
GLsizeiptr size
Definition: glext.h:5919
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum mode
Definition: glext.h:6217
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLfloat units
Definition: glext.h:11727
GLuint GLfloat * val
Definition: glext.h:7180
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean flag
Definition: glfuncs.h:52
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
Definition: glfuncs.h:250
#define b
Definition: ke_i.h:79
#define wine_dbgstr_w
Definition: kernel32.h:34
#define REG_SZ
Definition: layer.c:22
LPSTR WINAPI lstrcpyA(LPSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:100
#define win_skip
Definition: minitest.h:67
#define todo_wine_if(is_todo)
Definition: minitest.h:81
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl void winetest_pop_context(void)
void __cdecl void __cdecl void __cdecl void __cdecl void __cdecl winetest_push_context(const char *fmt,...) __WINE_PRINTF_ATTR(1
Definition: test.h:537
#define todo_wine
Definition: minitest.h:80
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define sprintf
Definition: sprintf.c:45
HDC hdc
Definition: main.c:9
static HDC
Definition: imagelist.c:88
static unsigned int number
Definition: dsound.c:1479
static LPTEXTMETRICW lptm
Definition: font.c:42
static DWORD *static HFONT(WINAPI *pCreateFontIndirectExA)(const ENUMLOGFONTEXDVA *)
static int monitor_count
Definition: service.c:38
static HWND child
Definition: cursoricon.c:298
static const char * setmouse_valuenames[3]
Definition: sysparams.c:646
#define SPI_SETSCREENREADER_REGKEY_LEGACY
Definition: sysparams.c:133
static void test_EnumDisplaySettings(void)
Definition: sysparams.c:3177
static DWORD WINAPI SysParamsThreadFunc(LPVOID lpParam)
Definition: sysparams.c:2594
static void test_GetAwarenessFromDpiAwarenessContext(void)
Definition: sysparams.c:4241
#define test_reg_key_ex2(subKey1, subKey2, valName1, valName2, testValue)
Definition: sysparams.c:487
static BOOL dotest_spi_iconhorizontalspacing(INT curr_val)
Definition: sysparams.c:911
static BOOL dotest_spi_iconverticalspacing(INT curr_val)
Definition: sysparams.c:1080
static void test_SPI_SETSCREENREADER(void)
Definition: sysparams.c:2002
static void test_SPI_SETBORDER(void)
Definition: sysparams.c:823
static int change_last_param
Definition: sysparams.c:172
static BOOL get_reg_dword(HKEY base, const char *key_name, const char *value_name, DWORD *value)
Definition: sysparams.c:195
#define SPI_SETMOUSESCROLLLINES_REGKEY
Definition: sysparams.c:156
static void test_SPI_SETWHEELSCROLLLINES(void)
Definition: sysparams.c:2352
#define SPI_SETICONTITLEWRAP_REGKEY1
Definition: sysparams.c:107
static void test_dpi_context(void)
Definition: sysparams.c:4287
#define SPI_SETSNAPTODEFBUTTON_VALNAME
Definition: sysparams.c:147
#define SPI_SETKEYBOARDPREF_REGKEY
Definition: sysparams.c:127
static void test_SPI_SETICONMETRICS(void)
Definition: sysparams.c:1755
static LRESULT CALLBACK dpi_winproc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
Definition: sysparams.c:4419
static void test_SPI_SETKEYBOARDDELAY(void)
Definition: sysparams.c:1042
#define SPI_SETMENUDROPALIGNMENT_VALNAME
Definition: sysparams.c:112
#define SPI_MINWIDTH_VALNAME
Definition: sysparams.c:95
static BOOL strict
Definition: sysparams.c:55
#define SPI_ICONHORIZONTALSPACING_REGKEY2
Definition: sysparams.c:89
static void test_SPI_SETLOWPOWERACTIVE(void)
Definition: sysparams.c:2120
#define eq(received, expected, label, type)
Definition: sysparams.c:58
#define SPI_SETDOUBLECLICKTIME_REGKEY
Definition: sysparams.c:119
#define SPI_SETMOUSEHOVERTIME_REGKEY
Definition: sysparams.c:152
static void test_dpi_mapping(void)
Definition: sysparams.c:3491
#define SPI_SETMOUSEHOVERHEIGHT_VALNAME
Definition: sysparams.c:151
#define SPI_SETDESKWALLPAPER_REGKEY
Definition: sysparams.c:160
static UINT smcxsmsize
Definition: sysparams.c:1502
#define SPI_SETSCREENSAVETIMEOUT_VALNAME
Definition: sysparams.c:100
#define SPI_SETKEYBOARDPREF_VALNAME_LEGACY
Definition: sysparams.c:130
static void test_dpi_window(void)
Definition: sysparams.c:4436
#define SPI_SETMENUDROPALIGNMENT_REGKEY2
Definition: sysparams.c:111
#define SPI_SETFONTSMOOTHINGCONTRAST_VALNAME
Definition: sysparams.c:138
#define SPI_SETSHOWSOUNDS_REGKEY
Definition: sysparams.c:125
#define SPI_SETBORDER_REGKEY2
Definition: sysparams.c:69
static void test_GetSysColorBrush(void)
Definition: sysparams.c:3396
#define SPI_SETMOUSE_VALNAME3
Definition: sysparams.c:67
static void test_GetAutoRotationState(void)
Definition: sysparams.c:4557
#define SPI_SETMENUDROPALIGNMENT_REGKEY1
Definition: sysparams.c:110
#define SPI_MINIMIZEDMETRICS_REGKEY
Definition: sysparams.c:94
static BOOL
Definition: sysparams.c:48
#define SPI_SETMOUSE_VALNAME1
Definition: sysparams.c:65
static void test_SPI_SETSHOWSOUNDS(void)
Definition: sysparams.c:1928
static void test_change_message(int action, int optional)
Definition: sysparams.c:291
static void scale_point_dpi_aware(POINT *pt, DPI_AWARENESS from, DPI_AWARENESS to)
Definition: sysparams.c:3475
static void test_SPI_SETKEYBOARDSPEED(void)
Definition: sysparams.c:875
#define ok_gsm_2(i, e1, e2)
Definition: sysparams.c:2699
#define SPI_SETBEEP_VALNAME
Definition: sysparams.c:63
static BOOL get_primary_adapter_name(CHAR *name)
Definition: sysparams.c:3130
#define SPI_SETMOUSESCROLLCHARS_VALNAME
Definition: sysparams.c:155
#define SPI_SETMOUSESCROLLCHARS_REGKEY
Definition: sysparams.c:154
static void test_SPI_SETICONTITLEWRAP(void)
Definition: sysparams.c:1135
#define SPI_SETSCREENREADER_REGKEY
Definition: sysparams.c:131
static void test_GetDpiFromDpiAwarenessContext(void)
Definition: sysparams.c:4113
#define test_reg_key_optional(subKey, valName, testValue)
Definition: sysparams.c:483
static int get_tmheightW(LOGFONTW *plf, int flag)
Definition: sysparams.c:1489
static int change_counter
Definition: sysparams.c:171
static int lffromreg(const char *keyname, const char *valname, LOGFONTA *plf)
Definition: sysparams.c:534
#define SPI_ICONVERTICALSPACING_REGKEY2
Definition: sysparams.c:92
#define TEST_NONCLIENTMETRICS_REG(ncm)
Definition: sysparams.c:1460
static BOOL is_font_enumerated(const char *name)
Definition: sysparams.c:2722
static void test_SPI_SETWALLPAPER(void)
Definition: sysparams.c:2471
#define SPI_SETDOUBLECLKHEIGHT_REGKEY1
Definition: sysparams.c:116
#define SPI_SETMOUSESCROLLLINES_VALNAME
Definition: sysparams.c:157
static BOOL CALLBACK test_enum_display_settings(HMONITOR hmonitor, HDC hdc, LPRECT rect, LPARAM lparam)
Definition: sysparams.c:3148
static void test_SPI_SETBEEP(void)
Definition: sysparams.c:586
static void flush_change_messages(void)
Definition: sysparams.c:306
static int real_dpi
Definition: sysparams.c:56
static void test_SPI_SETMOUSEHOVERWIDTH(void)
Definition: sysparams.c:2234
#define SPI_SETSCREENSAVEACTIVE_VALNAME
Definition: sysparams.c:102
struct LOGFONT16 * LPLOGFONT16
static void test_SPI_SETMOUSEBUTTONSWAP(void)
Definition: sysparams.c:1346
#define SPI_SETSNAPTODEFBUTTON_REGKEY
Definition: sysparams.c:146
#define SPI_SETMOUSEHOVERWIDTH_VALNAME
Definition: sysparams.c:149
#define SPI_CAPTIONHEIGHT_VALNAME
Definition: sysparams.c:75
static DWORD get_real_dpi(void)
Definition: sysparams.c:214
#define SPI_SETMOUSEHOVERWIDTH_REGKEY
Definition: sysparams.c:148
#define SPI_SETMENUSHOWDELAY_VALNAME
Definition: sysparams.c:159
static void test_AreDpiAwarenessContextsEqual(void)
Definition: sysparams.c:4157
#define SPI_SETICONTITLEWRAP_VALNAME
Definition: sysparams.c:109
static void test_SetThreadDpiAwarenessContext(void)
Definition: sysparams.c:3950
static void _test_reg_key(LPCSTR subKey1, LPCSTR subKey2, LPCSTR valName1, LPCSTR valName2, const void *exp_value, DWORD exp_type, BOOL optional)
Definition: sysparams.c:345
static int get_tmheight(LOGFONTA *plf, int flag)
Definition: sysparams.c:1477
static BOOL displaychange_test_active
Definition: sysparams.c:174
static void test_SPI_SETKEYBOARDPREF(void)
Definition: sysparams.c:1966
#define SPI_ICONVERTICALSPACING_VALNAME
Definition: sysparams.c:93
#define test_reg_key_dword(subKey, valName, testValue)
Definition: sysparams.c:491
#define SPI_SETMOUSEHOVERHEIGHT_REGKEY
Definition: sysparams.c:150
#define SPI_SETBEEP_REGKEY
Definition: sysparams.c:62
static void test_SPI_SETSCREENSAVEACTIVE(void)
Definition: sysparams.c:1001
static void test_SPI_SETDOUBLECLICKTIME(void)
Definition: sysparams.c:1289
#define SPI_SETPOWEROFFACTIVE_REGKEY
Definition: sysparams.c:142
static void get_text_metr_size(HDC hdc, LOGFONTA *plf, TEXTMETRICA *ptm, UINT *psz)
Definition: sysparams.c:2670
#define run_in_process(a, b)
Definition: sysparams.c:177
static void compare_font(const LOGFONTW *lf1, const LOGFONTW *lf2, int dpi, int custom_dpi, int line)
Definition: sysparams.c:2958
#define SPI_SETSCREENREADER_VALNAME_LEGACY
Definition: sysparams.c:134
static void scale_rect_dpi(RECT *rect, UINT src_dpi, UINT target_dpi)
Definition: sysparams.c:3467
static void test_SPI_SETMOUSE(void)
Definition: sysparams.c:711
#define SPI_SETLOWPOWERACTIVE_VALNAME
Definition: sysparams.c:141
static int gsm_error_ctr
Definition: sysparams.c:2690
#define SPI_SETMOUSEBUTTONSWAP_VALNAME
Definition: sysparams.c:122
#define SPI_SETSCREENREADER_VALNAME
Definition: sysparams.c:132
static void scale_rect_dpi_aware(RECT *rect, DPI_AWARENESS from, DPI_AWARENESS to)
Definition: sysparams.c:3483
#define SPI_SETDOUBLECLICKTIME_VALNAME
Definition: sysparams.c:120
#define SPI_CAPTIONWIDTH_VALNAME
Definition: sysparams.c:74
static void test_WM_DISPLAYCHANGE(void)
Definition: sysparams.c:2496
#define SPI_SETKEYBOARDDELAY_REGKEY
Definition: sysparams.c:105
#define SPI_MINVERTGAP_VALNAME
Definition: sysparams.c:97
#define SPI_SETDRAGFULLWINDOWS_REGKEY
Definition: sysparams.c:144
static void test_SPI_SETFONTSMOOTHING(void)
Definition: sysparams.c:2038
static DWORD
Definition: sysparams.c:48
static BOOL run_spi_setmouse_test(int curr_val[], POINT *req_change, POINT *proj_change, int nchange)
Definition: sysparams.c:655
static void test_SPI_SETMINIMIZEDMETRICS(void)
Definition: sysparams.c:1628
#define SPI_SETSHOWSOUNDS_VALNAME
Definition: sysparams.c:126
static void test_LOGFONT_charset(void)
Definition: sysparams.c:4578
static BOOL displaychange_ok
Definition: sysparams.c:174
static LONG _GdiGetCharDimensions(HDC hdc, LPTEXTMETRICA lptm, LONG *height)
Definition: sysparams.c:2652
static void test_GetSystemMetrics(void)
Definition: sysparams.c:2742
static void test_SPI_SETWHEELSCROLLCHARS(void)
Definition: sysparams.c:2432
#define SPI_SETKEYBOARDSPEED_REGKEY
Definition: sysparams.c:86
#define SPI_SETFONTSMOOTHINGTYPE_VALNAME
Definition: sysparams.c:137
#define SPI_SETICONTITLEWRAP_REGKEY2
Definition: sysparams.c:108
static BOOL test_setborder(UINT curr_val, int usesetborder, int dpi)
Definition: sysparams.c:775
static void test_SPI_SETDRAGFULLWINDOWS(void)
Definition: sysparams.c:1398
#define SPI_SETLOWPOWERACTIVE_REGKEY
Definition: sysparams.c:140
static void test_SPI_SETPOWEROFFACTIVE(void)
Definition: sysparams.c:2159
#define ok_gsm_3(i, e1, e2, e3)
Definition: sysparams.c:2707
#define SPI_MENUHEIGHT_VALNAME
Definition: sysparams.c:81
static void test_SPI_SETSNAPTODEFBUTTON(void)
Definition: sysparams.c:2198
static void test_SPI_SETWORKAREA(void)
Definition: sysparams.c:1875
#define SPI_SETDOUBLECLKWIDTH_VALNAME
Definition: sysparams.c:115
static void test_SPI_SETMOUSEHOVERTIME(void)
Definition: sysparams.c:2310
static LRESULT CALLBACK SysParamsTestWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
Definition: sysparams.c:237
static void test_SPI_SETFASTTASKSWITCH(void)
Definition: sysparams.c:1382
static HANDLE displaychange_sem
Definition: sysparams.c:175
#define SPI_SETBORDER_REGKEY
Definition: sysparams.c:68
static void test_dpi_stock_objects(HDC hdc)
Definition: sysparams.c:3417
#define SPI_SETBORDER_VALNAME
Definition: sysparams.c:70
#define SPI_SETMOUSE_REGKEY
Definition: sysparams.c:64
static void test_dpi_aware(void)
Definition: sysparams.c:3796
#define SPI_SETDOUBLECLKWIDTH_REGKEY2
Definition: sysparams.c:114
static HWND ghTestWnd
Definition: sysparams.c:166
#define test_reg_key(subKey, valName, testValue)
Definition: sysparams.c:481
#define SPI_SETFONTSMOOTHING_VALNAME
Definition: sysparams.c:136
#define SPI_SETFONTSMOOTHING_REGKEY
Definition: sysparams.c:135
#define SPI_SETKEYBOARDDELAY_VALNAME
Definition: sysparams.c:106
#define SPI_SETDRAGFULLWINDOWS_VALNAME
Definition: sysparams.c:145
#define SPI_SMCAPTIONHEIGHT_VALNAME
Definition: sysparams.c:78
#define ok_gsm(i, e)
Definition: sysparams.c:2692
static void test_SPI_ICONVERTICALSPACING(void)
Definition: sysparams.c:1114
static void test_SPI_SETMENUSHOWDELAY(void)
Definition: sysparams.c:2392
static void test_metrics_for_dpi(int custom_dpi)
Definition: sysparams.c:2971
static void test_SetProcessDpiAwarenessContext(ULONG arg)
Definition: sysparams.c:3818
static void test_SPI_SETDOUBLECLKWIDTH(void)
Definition: sysparams.c:1220
static void test_SPI_SETMENUDROPALIGNMENT(void)
Definition: sysparams.c:1180
#define SPI_SETDOUBLECLKHEIGHT_VALNAME
Definition: sysparams.c:118
#define SPI_SETKEYBOARDPREF_VALNAME
Definition: sysparams.c:128
#define SPI_SETFONTSMOOTHINGORIENTATION_VALNAME
Definition: sysparams.c:139
#define SPI_MINHORZGAP_VALNAME
Definition: sysparams.c:96
#define test_reg_key_ex(subKey1, subKey2, valName, testValue)
Definition: sysparams.c:485
#define SPI_SETDOUBLECLKHEIGHT_REGKEY2
Definition: sysparams.c:117
static void test_SPI_ICONHORIZONTALSPACING(void)
Definition: sysparams.c:945
static int get_cursor_size(int size)
Definition: sysparams.c:2734
static DPI_AWARENESS_CONTEXT
Definition: sysparams.c:52
static void test_SPI_SETGRIDGRANULARITY(void)
Definition: sysparams.c:1037
static void run_in_process_(const char *file, int line, char **argv, const char *args)
Definition: sysparams.c:178
#define SPI_SETKEYBOARDPREF_REGKEY_LEGACY
Definition: sysparams.c:129
static void test_SPI_SETDOUBLECLKHEIGHT(void)
Definition: sysparams.c:1254
static INT CALLBACK enum_all_fonts_proc(const LOGFONTA *elf, const TEXTMETRICA *ntm, DWORD type, LPARAM lparam)
Definition: sysparams.c:2717
#define SPI_SETSCREENSAVEACTIVE_REGKEY
Definition: sysparams.c:101
#define SPI_SETMOUSE_VALNAME2
Definition: sysparams.c:66
#define SPI_SETMOUSEHOVERTIME_VALNAME
Definition: sysparams.c:153
#define SPI_SETPOWEROFFACTIVE_VALNAME
Definition: sysparams.c:143
#define SPI_ICONHORIZONTALSPACING_REGKEY
Definition: sysparams.c:88
#define SPI_SETKEYBOARDSPEED_VALNAME
Definition: sysparams.c:87
static void test_SPI_SETSCREENSAVETIMEOUT(void)
Definition: sysparams.c:964
static void scale_point_dpi(POINT *pt, UINT src_dpi, UINT target_dpi)
Definition: sysparams.c:3461
static int dpi
Definition: sysparams.c:56
#define SPI_ICONVERTICALSPACING_REGKEY
Definition: sysparams.c:91
static UINT metricfromreg(const char *keyname, const char *valname, int dpi)
Definition: sysparams.c:496
#define test_reg_key_ex2_optional(subKey1, subKey2, valName1, valName2, testValue)
Definition: sysparams.c:489
#define SPI_SETDESKWALLPAPER_VALNAME
Definition: sysparams.c:161
static void test_SPI_SETNONCLIENTMETRICS(void)
Definition: sysparams.c:1504
#define SPI_SETDOUBLECLKWIDTH_REGKEY1
Definition: sysparams.c:113
#define SPI_SETMOUSEBUTTONSWAP_REGKEY
Definition: sysparams.c:121
#define SPI_SETMENUSHOWDELAY_REGKEY
Definition: sysparams.c:158
static int last_bpp
Definition: sysparams.c:173
#define SPI_METRIC_REGKEY
Definition: sysparams.c:71
#define SPI_ICONHORIZONTALSPACING_VALNAME
Definition: sysparams.c:90
#define SPI_MINARRANGE_VALNAME
Definition: sysparams.c:98
#define SPI_SETSCREENSAVETIMEOUT_REGKEY
Definition: sysparams.c:99
static void test_SPI_SETMOUSEHOVERHEIGHT(void)
Definition: sysparams.c:2272
static BOOL test_error_msg(int rc, const char *name)
Definition: sysparams.c:313
static void test_IsValidDpiAwarenessContext(void)
Definition: sysparams.c:4022
static UINT
Definition: sysparams.c:40
static MONITORINFO mi
Definition: win.c:9400
#define min(a, b)
Definition: monoChain.cc:55
int k
Definition: mpi.c:3369
#define argv
Definition: mplay32.c:18
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
INT WINAPI MulDiv(INT nNumber, INT nNumerator, INT nDenominator)
Definition: muldiv.c:25
HMONITOR WINAPI MonitorFromRect(LPCRECT, DWORD)
HMONITOR WINAPI MonitorFromWindow(HWND, DWORD)
unsigned int UINT
Definition: ndis.h:50
HANDLE hThread
Definition: wizard.c:28
#define LOWORD(l)
Definition: pedump.c:82
#define WS_CHILD
Definition: pedump.c:617
#define WS_OVERLAPPEDWINDOW
Definition: pedump.c:637
#define WS_VISIBLE
Definition: pedump.c:620
long LONG
Definition: pedump.c:60
static Real area(Real A[2], Real B[2], Real C[2])
Definition: polyDBG.cc:50
#define INT
Definition: polytest.cpp:20
char screen[SCREENY][SCREENX]
Definition: polytest.cpp:65
struct _STARTUPINFOA STARTUPINFOA
#define err(...)
#define REG_DWORD
Definition: sdbapi.c:615
#define offsetof(TYPE, MEMBER)
strcpy
Definition: string.h:131
int winetest_get_mainargs(char ***pargv)
#define wait_child_process
Definition: test.h:159
#define memset(x, y, z)
Definition: compat.h:39
static FILE * client
Definition: client.c:37
static PVOID hdll
Definition: shimdbg.c:126
CardRegion * from
Definition: spigame.cpp:19
& rect
Definition: startmenu.cpp:1413
TCHAR * cmdline
Definition: stretchblt.cpp:32
BYTE lfStrikeOut
Definition: sysparams.c:524
BYTE lfCharSet
Definition: sysparams.c:525
BYTE lfPitchAndFamily
Definition: sysparams.c:529
BYTE lfClipPrecision
Definition: sysparams.c:527
CHAR lfFaceName[LF_FACESIZE]
Definition: sysparams.c:530
BYTE lfUnderline
Definition: sysparams.c:523
INT16 lfWeight
Definition: sysparams.c:521
INT16 lfHeight
Definition: sysparams.c:517
INT16 lfEscapement
Definition: sysparams.c:519
INT16 lfWidth
Definition: sysparams.c:518
BYTE lfOutPrecision
Definition: sysparams.c:526
BYTE lfQuality
Definition: sysparams.c:528
BYTE lfItalic
Definition: sysparams.c:522
INT16 lfOrientation
Definition: sysparams.c:520
BYTE lfStrikeOut
Definition: dimm.idl:49
BYTE lfClipPrecision
Definition: dimm.idl:52
BYTE lfUnderline
Definition: dimm.idl:48
BYTE lfQuality
Definition: dimm.idl:53
BYTE lfOutPrecision
Definition: dimm.idl:51
LONG lfOrientation
Definition: dimm.idl:45
BYTE lfItalic
Definition: dimm.idl:47
BYTE lfPitchAndFamily
Definition: dimm.idl:54
LONG lfHeight
Definition: dimm.idl:42
LONG lfEscapement
Definition: dimm.idl:44
BYTE lfCharSet
Definition: dimm.idl:50
LONG lfWeight
Definition: dimm.idl:46
CHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:55
LONG lfWidth
Definition: dimm.idl:43
BYTE lfOutPrecision
Definition: dimm.idl:68
BYTE lfStrikeOut
Definition: dimm.idl:66
BYTE lfItalic
Definition: dimm.idl:64
LONG lfHeight
Definition: dimm.idl:59
LONG lfWeight
Definition: dimm.idl:63
WCHAR lfFaceName[LF_FACESIZE]
Definition: dimm.idl:72
LONG lfOrientation
Definition: dimm.idl:62
LONG lfWidth
Definition: dimm.idl:60
BYTE lfUnderline
Definition: dimm.idl:65
BYTE lfClipPrecision
Definition: dimm.idl:69
LONG lfEscapement
Definition: dimm.idl:61
BYTE lfCharSet
Definition: dimm.idl:67
BYTE lfQuality
Definition: dimm.idl:70
BYTE lfPitchAndFamily
Definition: dimm.idl:71
DWORD StateFlags
Definition: wingdi.h:3258
CHAR DeviceName[32]
Definition: wingdi.h:3256
LONG y
Definition: windef.h:130
LONG x
Definition: windef.h:129
LONG cx
Definition: kdterminal.h:27
LONG cy
Definition: kdterminal.h:28
POINT ptMaxPosition
Definition: winuser.h:3402
RECT rcNormalPosition
Definition: winuser.h:3403
POINT ptMinPosition
Definition: winuser.h:3401
HBRUSH hbrBackground
Definition: winuser.h:3278
HICON hIcon
Definition: winuser.h:3276
HINSTANCE hInstance
Definition: winuser.h:3275
HCURSOR hCursor
Definition: winuser.h:3277
int cbWndExtra
Definition: winuser.h:3274
UINT style
Definition: winuser.h:3271
LPCSTR lpszMenuName
Definition: winuser.h:3279
LPCSTR lpszClassName
Definition: winuser.h:3280
WNDPROC lpfnWndProc
Definition: winuser.h:3272
int cbClsExtra
Definition: winuser.h:3273
DWORD dmDisplayFlags
Definition: wingdi.h:2045
DWORD dmDisplayFrequency
Definition: wingdi.h:2048
DWORD dmFields
Definition: wingdi.h:2016
DWORD dmDisplayOrientation
Definition: wingdi.h:2030
DWORD dmPelsWidth
Definition: wingdi.h:2042
DWORD dmPelsHeight
Definition: wingdi.h:2043
DWORD dmBitsPerPel
Definition: wingdi.h:2041
POINTL dmPosition
Definition: wingdi.h:2029
WORD dmSize
Definition: wingdi.h:2014
DWORD dmFields
Definition: wingdi.h:2068
DWORD dmPelsWidth
Definition: wingdi.h:2094
WORD dmSize
Definition: wingdi.h:2066
Definition: match.c:390
Definition: http.c:7252
Definition: devices.h:37
Definition: fci.c:127
Definition: copy.c:22
Definition: parser.c:49
Definition: name.c:39
UINT ciCharset
Definition: wingdi.h:1992
RECT rcMonitor
Definition: winuser.h:3893
DWORD cbSize
Definition: winuser.h:3892
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
LONG right
Definition: windef.h:108
LONG bottom
Definition: windef.h:109
LONG top
Definition: windef.h:107
LONG left
Definition: windef.h:106
LONG tmExternalLeading
Definition: wingdi.h:2811
LONG tmHeight
Definition: wingdi.h:2807
#define max(a, b)
Definition: svc.c:63
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateSemaphoreW(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL, IN LONG lInitialCount, IN LONG lMaximumCount, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:406
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseSemaphore(IN HANDLE hSemaphore, IN LONG lReleaseCount, IN LPLONG lpPreviousCount)
Definition: synch.c:491
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
unsigned char * LPBYTE
Definition: typedefs.h:53
PVOID HANDLE
Definition: typedefs.h:73
int32_t INT
Definition: typedefs.h:58
uint32_t ULONG_PTR
Definition: typedefs.h:65
uint32_t ULONG
Definition: typedefs.h:59
#define HIWORD(l)
Definition: typedefs.h:247
Definition: pdh_main.c:96
#define LPRECT
Definition: precomp.h:28
BOOL WINAPI EnumDisplaySettingsExA(LPCSTR lpszDeviceName, DWORD iModeNum, LPDEVMODEA lpDevMode, DWORD dwFlags)
Definition: display.c:182
LONG WINAPI ChangeDisplaySettingsExW(LPCWSTR lpszDeviceName, LPDEVMODEW lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam)
Definition: display.c:585
BOOL WINAPI EnumDisplayDevicesA(LPCSTR lpDevice, DWORD iDevNum, PDISPLAY_DEVICEA lpDisplayDevice, DWORD dwFlags)
Definition: display.c:23
BOOL WINAPI EnumDisplaySettingsW(LPCWSTR lpszDeviceName, DWORD iModeNum, LPDEVMODEW lpDevMode)
Definition: display.c:408
BOOL WINAPI EnumDisplaySettingsA(LPCSTR lpszDeviceName, DWORD iModeNum, LPDEVMODEA lpDevMode)
Definition: display.c:312
BOOL WINAPI EnumDisplaySettingsExW(LPCWSTR lpszDeviceName, DWORD iModeNum, LPDEVMODEW lpDevMode, DWORD dwFlags)
Definition: display.c:330
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023
DPI_AWARENESS
Definition: windef.h:80
@ DPI_AWARENESS_PER_MONITOR_AWARE
Definition: windef.h:84
@ DPI_AWARENESS_SYSTEM_AWARE
Definition: windef.h:83
@ DPI_AWARENESS_INVALID
Definition: windef.h:81
@ DPI_AWARENESS_UNAWARE
Definition: windef.h:82
#define DPI_AWARENESS_CONTEXT_UNAWARE
Definition: windef.h:87
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE
Definition: windef.h:89
#define DPI_AWARENESS_CONTEXT_PER_MONITOR_AWARE_V2
Definition: windef.h:90
#define DPI_AWARENESS_CONTEXT_SYSTEM_AWARE
Definition: windef.h:88
#define DPI_AWARENESS_CONTEXT_UNAWARE_GDISCALED
Definition: windef.h:91
#define WINAPI
Definition: msvc.h:6
#define ERROR_REQUIRES_INTERACTIVE_WINDOWSTATION
Definition: winerror.h:1285
#define ERROR_INVALID_SPI_VALUE
Definition: winerror.h:1265
#define ERROR_NO_MORE_FILES
Definition: winerror.h:243
#define ERROR_INVALID_WINDOW_HANDLE
Definition: winerror.h:1226
#define ERROR_INVALID_STATE
Definition: winerror.h:1799
#define ERROR_BAD_ARGUMENTS
Definition: winerror.h:354
#define DM_DISPLAYFREQUENCY
Definition: wingdi.h:1272
#define DMDO_DEFAULT
Definition: wingdi.h:1217
BOOL WINAPI GetTextMetricsW(_In_ HDC, _Out_ LPTEXTMETRICW)
Definition: text.c:221
#define HORZRES
Definition: wingdi.h:716
HGDIOBJ WINAPI GetStockObject(_In_ int)
int WINAPI GetObjectW(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
int WINAPI GetClipBox(_In_ HDC, _Out_ LPRECT)
int WINAPI GetDeviceCaps(_In_opt_ HDC, _In_ int)
#define STOCK_LAST
Definition: wingdi.h:923
HDC WINAPI CreateICA(_In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_opt_ LPCSTR, _In_opt_ const DEVMODEA *)
HRGN WINAPI CreateRectRgn(_In_ int, _In_ int, _In_ int, _In_ int)
HFONT WINAPI CreateFontIndirectA(_In_ const LOGFONTA *)
int WINAPI GetObjectA(_In_ HANDLE h, _In_ int c, _Out_writes_bytes_opt_(c) LPVOID pv)
#define DEFAULT_QUALITY
Definition: wingdi.h:436
#define NULLREGION
Definition: wingdi.h:361
#define LOGPIXELSY
Definition: wingdi.h:719
#define DM_PELSWIDTH
Definition: wingdi.h:1269
#define NUMCOLORS
Definition: wingdi.h:725
#define DEFAULT_GUI_FONT
Definition: wingdi.h:909
HGDIOBJ WINAPI SelectObject(_In_ HDC, _In_ HGDIOBJ)
Definition: dc.c:1546
HDC WINAPI CreateDCA(_In_opt_ LPCSTR pszDriver, _In_opt_ LPCSTR pszDevice, _In_opt_ LPCSTR pszOutput, _In_opt_ const DEVMODEA *pdmInit)
#define DM_POSITION
Definition: wingdi.h:1255
HDC WINAPI CreateCompatibleDC(_In_opt_ HDC hdc)
#define DEFAULT_CHARSET
Definition: wingdi.h:384
#define DRAFT_QUALITY
Definition: wingdi.h:437
#define CLIP_LH_ANGLES
Definition: wingdi.h:430
#define VERTRES
Definition: wingdi.h:717
struct _devicemodeW DEVMODEW
#define SYSTEM_FIXED_FONT
Definition: wingdi.h:912
#define DM_BITSPERPEL
Definition: wingdi.h:1268
int WINAPI EnumFontFamiliesA(_In_ HDC, _In_opt_ LPCSTR, _In_ FONTENUMPROCA, _In_ LPARAM)
#define OEM_FIXED_FONT
Definition: wingdi.h:910
#define OUT_DEFAULT_PRECIS
Definition: wingdi.h:415
#define DISPLAY_DEVICE_PRIMARY_DEVICE
Definition: wingdi.h:1398
#define OUT_TT_PRECIS
Definition: wingdi.h:419
#define DM_DISPLAYORIENTATION
Definition: wingdi.h:1257
#define DESKTOPHORZRES
Definition: wingdi.h:742
#define SYSTEM_FONT
Definition: wingdi.h:911
#define LOGPIXELSX
Definition: wingdi.h:718
#define BITSPIXEL
Definition: wingdi.h:720
#define DISPLAY_DEVICE_ATTACHED_TO_DESKTOP
Definition: wingdi.h:1396
BOOL WINAPI GetTextMetricsA(_In_ HDC, _Out_ LPTEXTMETRICA)
Definition: text.c:200
HFONT WINAPI CreateFontIndirectW(_In_ const LOGFONTW *)
#define DM_PELSHEIGHT
Definition: wingdi.h:1270
BOOL WINAPI DeleteDC(_In_ HDC)
#define DESKTOPVERTRES
Definition: wingdi.h:743
#define DM_DISPLAYFLAGS
Definition: wingdi.h:1271
BOOL WINAPI GetTextExtentPointA(_In_ HDC hdc, _In_reads_(c) LPCSTR lpString, _In_ int c, _Out_ LPSIZE lpsz)
BOOL WINAPI TranslateCharsetInfo(_Inout_ PDWORD, _Out_ LPCHARSETINFO, _In_ DWORD)
int WINAPI GetRgnBox(_In_ HRGN, _Out_ LPRECT)
#define TCI_SRCCODEPAGE
Definition: wingdi.h:962
#define HKEY_CURRENT_CONFIG
Definition: winreg.h:15
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define HWND_MESSAGE
Definition: winuser.h:1221
int WINAPI ReleaseDC(_In_opt_ HWND, _In_ HDC)
#define SM_MENUDROPALIGNMENT
Definition: winuser.h:1014
#define CS_VREDRAW
Definition: winuser.h:666
LRESULT WINAPI DispatchMessageA(_In_ const MSG *)
#define MOUSEEVENTF_ABSOLUTE
Definition: winuser.h:1205
#define SM_CXMINIMIZED
Definition: winuser.h:1031
BOOL WINAPI SetDoubleClickTime(_In_ UINT)
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1050
BOOL WINAPI RedrawWindow(_In_opt_ HWND, _In_opt_ LPCRECT, _In_opt_ HRGN, _In_ UINT)
void WINAPI mouse_event(_In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ DWORD, _In_ ULONG_PTR)
#define SPI_SETBORDER
Definition: winuser.h:1369
HDC WINAPI GetWindowDC(_In_opt_ HWND)
#define SM_CYEDGE
Definition: winuser.h:1020
#define SM_CXDOUBLECLK
Definition: winuser.h:1010
BOOL WINAPI TranslateMessage(_In_ const MSG *)
#define SPI_GETSHOWSOUNDS
Definition: winuser.h:1416
#define COLOR_WINDOW
Definition: winuser.h:929
BOOL WINAPI ShowWindow(_In_ HWND, _In_ int)
#define SPI_GETBORDER
Definition: winuser.h:1368
#define SM_CXHTHUMB
Definition: winuser.h:982
DWORD WINAPI GetMessagePos(void)
Definition: message.c:1351
#define SM_CYSCREEN
Definition: winuser.h:971
#define SPI_SETHANDEDNESS
Definition: winuser.h:1591
#define SPI_SETMENUDROPALIGNMENT
Definition: winuser.h:1388
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SPI_SETDESKWALLPAPER
Definition: winuser.h:1380
#define SM_CXEDGE
Definition: winuser.h:1019
#define SM_CYVSCROLL
Definition: winuser.h:992
BOOL WINAPI GetWindowPlacement(_In_ HWND, _Inout_ WINDOWPLACEMENT *)
#define SM_CXMENUCHECK
Definition: winuser.h:1042
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4469
BOOL WINAPI GetWindowRect(_In_ HWND, _Out_ LPRECT)
#define SM_CYSIZE
Definition: winuser.h:1003
#define SM_CXMINTRACK
Definition: winuser.h:1008
#define SW_MINIMIZE
Definition: winuser.h:787
#define SM_CXVSCROLL
Definition: winuser.h:972
__analysis_noreturn void WINAPI PostQuitMessage(_In_ int)
#define SM_CYVTHUMB
Definition: winuser.h:981
#define SM_CYMINIMIZED
Definition: winuser.h:1032
HWND WINAPI SetParent(_In_ HWND, _In_opt_ HWND)
#define SPI_ICONVERTICALSPACING
Definition: winuser.h:1384
HBRUSH WINAPI GetSysColorBrush(_In_ int)
#define DISP_CHANGE_BADMODE
Definition: winuser.h:195
#define SPI_SETDOUBLECLKWIDTH
Definition: winuser.h:1389
#define SM_CXFRAME
Definition: winuser.h:1005
#define SPI_SETBEEP
Definition: winuser.h:1365
#define SM_CYICONSPACING
Definition: winuser.h:1013
#define CS_HREDRAW
Definition: winuser.h:661
#define SPI_SETSCREENSAVEACTIVE
Definition: winuser.h:1377
#define IDC_ARROW
Definition: winuser.h:695
#define SM_CYMENU
Definition: winuser.h:987
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:3064
#define SPI_SETDOUBLECLKHEIGHT
Definition: winuser.h:1390
#define SM_CYSMICON
Definition: winuser.h:1024
LRESULT WINAPI SendMessageA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SM_CYDOUBLECLK
Definition: winuser.h:1011
#define ENUM_REGISTRY_SETTINGS
Definition: winuser.h:180
#define GA_PARENT
Definition: winuser.h:2892
BOOL WINAPI EnumDisplayMonitors(_In_opt_ HDC, _In_opt_ LPCRECT, _In_ MONITORENUMPROC, _In_ LPARAM)
#define SPI_GETFASTTASKSWITCH
Definition: winuser.h:1395
#define SPI_GETICONTITLELOGFONT
Definition: winuser.h:1391
BOOL WINAPI MessageBeep(_In_ UINT uType)
int WINAPI MapWindowPoints(_In_opt_ HWND hWndFrom, _In_opt_ HWND hWndTo, _Inout_updates_(cPoints) LPPOINT lpPoints, _In_ UINT cPoints)
#define SPI_GETMOUSE
Definition: winuser.h:1366
#define SM_CXSIZE
Definition: winuser.h:1002
UINT WINAPI GetDoubleClickTime(void)
Definition: ntwrapper.h:314
#define SM_CYFRAME
Definition: winuser.h:1007
#define SM_CYHSCROLL
Definition: winuser.h:973
#define SM_CXFULLSCREEN
Definition: winuser.h:988
#define IDI_APPLICATION
Definition: winuser.h:712
#define SPIF_SENDCHANGE
Definition: winuser.h:1600
#define DISP_CHANGE_FAILED
Definition: winuser.h:194
HWND WINAPI GetDesktopWindow(void)
Definition: window.c:628
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1049
#define WM_SETTINGCHANGE
Definition: winuser.h:1657
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1194
#define SM_CXMIN
Definition: winuser.h:1000
#define SPI_SETKEYBOARDSPEED
Definition: winuser.h:1371
#define SM_CYBORDER
Definition: winuser.h:976
#define SPIF_UPDATEINIFILE
Definition: winuser.h:1599
#define SM_CXSMICON
Definition: winuser.h:1023
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)
enum tagAR_STATE AR_STATE
ATOM WINAPI RegisterClassA(_In_ CONST WNDCLASSA *)
#define SM_CYMIN
Definition: winuser.h:1001
#define SM_CYMENUCHECK
Definition: winuser.h:1043
#define ENUM_CURRENT_SETTINGS
Definition: winuser.h:179
#define SM_CYICON
Definition: winuser.h:984
#define SM_CXMAXTRACK
Definition: winuser.h:1033
enum tagAR_STATE * PAR_STATE
#define SM_CXMAXIMIZED
Definition: winuser.h:1035
#define SM_CYMINSPACING
Definition: winuser.h:1022
struct tagMINIMIZEDMETRICS MINIMIZEDMETRICS
#define SM_CXSMSIZE
Definition: winuser.h:1026
#define RDW_ALLCHILDREN
Definition: winuser.h:1232
HICON WINAPI LoadIconA(_In_opt_ HINSTANCE hInstance, _In_ LPCSTR lpIconName)
Definition: cursoricon.c:2429
#define SM_CXBORDER
Definition: winuser.h:975
#define SPI_GETKEYBOARDSPEED
Definition: winuser.h:1370
#define RDW_FRAME
Definition: winuser.h:1223
#define SM_CYMAXTRACK
Definition: winuser.h:1034
int WINAPI GetUpdateRgn(_In_ HWND, _In_ HRGN, _In_ BOOL)
BOOL WINAPI SwapMouseButton(_In_ BOOL)
BOOL WINAPI UpdateWindow(_In_ HWND)
#define WM_NULL
Definition: winuser.h:1635
BOOL WINAPI GetMonitorInfoA(_In_ HMONITOR, _Inout_ LPMONITORINFO)
#define SPI_SETDOUBLECLICKTIME
Definition: winuser.h:1392
#define SPI_GETICONTITLEWRAP
Definition: winuser.h:1385
#define SM_CYFULLSCREEN
Definition: winuser.h:989
#define SM_CXSIZEFRAME
Definition: winuser.h:1004
HDC WINAPI GetDC(_In_opt_ HWND)
#define MB_OK
Definition: winuser.h:801
#define SM_CXDLGFRAME
Definition: winuser.h:977
LONG WINAPI GetDialogBaseUnits(void)
Definition: dialog.c:2144
BOOL WINAPI SystemParametersInfoW(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)
#define SM_CXHSCROLL
Definition: winuser.h:993
#define SPI_SETMOUSEBUTTONSWAP
Definition: winuser.h:1393
#define SM_SHOWSOUNDS
Definition: winuser.h:1041
#define SM_CXMENUSIZE
Definition: winuser.h:1028
#define SM_ARRANGE
Definition: winuser.h:1030
BOOL WINAPI SystemParametersInfoA(_In_ UINT uiAction, _In_ UINT uiParam, _Inout_opt_ PVOID pvParam, _In_ UINT fWinIni)
#define SW_RESTORE
Definition: winuser.h:790
#define SPI_ICONHORIZONTALSPACING
Definition: winuser.h:1373
#define WM_USER
Definition: winuser.h:1923
#define SM_CYSMCAPTION
Definition: winuser.h:1025
BOOL WINAPI OffsetRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define SM_CYSMSIZE
Definition: winuser.h:1027
#define CS_OWNDC
Definition: winuser.h:663
#define SM_CYDLGFRAME
Definition: winuser.h:979
#define WM_DESTROY
Definition: winuser.h:1637
#define SM_CXSCREEN
Definition: winuser.h:970
#define SM_SWAPBUTTON
Definition: winuser.h:995
BOOL WINAPI GetMonitorInfoW(_In_ HMONITOR, _Inout_ LPMONITORINFO)
#define SPI_GETBEEP
Definition: winuser.h:1364
#define SPI_SETMOUSE
Definition: winuser.h:1367
#define SM_CYMENUSIZE
Definition: winuser.h:1029
#define SPI_GETKEYBOARDDELAY
Definition: winuser.h:1382
#define USER_DEFAULT_SCREEN_DPI
Definition: winuser.h:5085
#define SPI_SETICONTITLEWRAP
Definition: winuser.h:1386
#define SM_CYCURSOR
Definition: winuser.h:986
BOOL WINAPI InflateRect(_Inout_ LPRECT, _In_ int, _In_ int)
#define SPI_SETKEYBOARDDELAY
Definition: winuser.h:1383
BOOL WINAPI GetMessageA(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
BOOL WINAPI GetUpdateRect(_In_ HWND, _Out_opt_ LPRECT, _In_ BOOL)
#define SM_CXICON
Definition: winuser.h:983
#define SM_CMONITORS
Definition: winuser.h:1051
BOOL WINAPI DestroyWindow(_In_ HWND)
#define SPI_SETSCREENSAVETIMEOUT
Definition: winuser.h:1375
#define SM_CYMAXIMIZED
Definition: winuser.h:1036
#define SM_CYCAPTION
Definition: winuser.h:974
BOOL WINAPI EqualRect(_In_ LPCRECT, _In_ LPCRECT)
#define SPI_SETSHOWSOUNDS
Definition: winuser.h:1417
#define SM_CYSIZEFRAME
Definition: winuser.h:1006
int WINAPI GetSystemMetrics(_In_ int)
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)
Definition: window.c:929
#define SPI_GETSCREENSAVETIMEOUT
Definition: winuser.h:1374
#define SM_CYMINTRACK
Definition: winuser.h:1009
LRESULT WINAPI CallWindowProcA(_In_ WNDPROC, _In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define SM_CXICONSPACING
Definition: winuser.h:1012
#define RDW_INVALIDATE
Definition: winuser.h:1225
#define SPI_GETSCREENSAVEACTIVE
Definition: winuser.h:1376
#define SM_CXMINSPACING
Definition: winuser.h:1021
HCURSOR WINAPI LoadCursorA(_In_opt_ HINSTANCE, _In_ LPCSTR)
Definition: cursoricon.c:2459
BOOL WINAPI SetRect(_Out_ LPRECT, _In_ int, _In_ int, _In_ int, _In_ int)
#define SM_CXCURSOR
Definition: winuser.h:985
#define SPI_GETMENUDROPALIGNMENT
Definition: winuser.h:1387
const char * LPCSTR
Definition: xmlstorage.h:183
char CHAR
Definition: xmlstorage.h:175
unsigned char BYTE
Definition: xxhash.c:193
#define SPI_SETWHEELSCROLLLINES
Definition: zmouse.h:30