2 * System parameters functions
4 * Copyright 1994 Alexandre Julliard
12 #include "wine/winuser16.h"
19 #include "debugtools.h"
21 DEFAULT_DEBUG_CHANNEL(system
);
23 /***********************************************************************
24 * GetTimerResolution (USER.14)
26 LONG WINAPI
GetTimerResolution16(void)
31 /***********************************************************************
32 * ControlPanelInfo16 (USER.273)
34 void WINAPI
ControlPanelInfo16( INT16 nInfoType
, WORD wData
, LPSTR lpBuffer
)
36 FIXME("(%d, %04x, %p): stub.\n", nInfoType
, wData
, lpBuffer
);
39 /***********************************************************************
40 * SystemParametersInfoA (USER32.540)
42 BOOL WINAPI
SystemParametersInfoA( UINT uAction
, UINT uParam
,
43 LPVOID lpvParam
, UINT fuWinIni
)
49 *(BOOL
*) lpvParam
= KEYBOARD_GetBeepActive();
52 KEYBOARD_SetBeepActive(uParam
);
56 *(INT
*)lpvParam
= GetSystemMetrics( SM_CXFRAME
);
59 case SPI_GETDRAGFULLWINDOWS
:
60 *(BOOL
*) lpvParam
= FALSE
;
63 case SPI_SETDRAGFULLWINDOWS
:
66 case SPI_GETFASTTASKSWITCH
:
67 if ( GetProfileIntA( "windows", "CoolSwitch", 1 ) == 1 )
68 *(BOOL
*) lpvParam
= TRUE
;
70 *(BOOL
*) lpvParam
= FALSE
;
73 case SPI_GETGRIDGRANULARITY
:
74 *(INT
*)lpvParam
=GetProfileIntA("desktop","GridGranularity",1);
77 case SPI_GETICONTITLEWRAP
:
78 *(BOOL
*)lpvParam
=GetProfileIntA("desktop","IconTitleWrap",TRUE
);
81 case SPI_GETKEYBOARDDELAY
:
82 *(INT
*)lpvParam
=GetProfileIntA("keyboard","KeyboardDelay",1);
85 case SPI_GETKEYBOARDSPEED
:
86 *(DWORD
*)lpvParam
=GetProfileIntA("keyboard","KeyboardSpeed",30);
89 case SPI_GETMENUDROPALIGNMENT
:
90 *(BOOL
*)lpvParam
=GetSystemMetrics(SM_MENUDROPALIGNMENT
); /* XXX check this */
93 case SPI_GETSCREENSAVEACTIVE
:
94 if(USER_Driver
->pGetScreenSaveActive() ||
95 GetProfileIntA( "windows", "ScreenSaveActive", 1 ) == 1)
96 *(BOOL
*)lpvParam
= TRUE
;
98 *(BOOL
*)lpvParam
= FALSE
;
101 case SPI_GETSCREENSAVETIMEOUT
:
102 timeout
= USER_Driver
->pGetScreenSaveTimeout();
104 timeout
= GetProfileIntA( "windows", "ScreenSaveTimeout", 300 );
105 *(INT
*) lpvParam
= timeout
* 1000;
108 case SPI_ICONHORIZONTALSPACING
:
109 /* FIXME Get/SetProfileInt */
110 if (lpvParam
== NULL
)
111 /*SetSystemMetrics( SM_CXICONSPACING, uParam )*/ ;
113 *(INT
*)lpvParam
=GetSystemMetrics(SM_CXICONSPACING
);
116 case SPI_ICONVERTICALSPACING
:
117 /* FIXME Get/SetProfileInt */
118 if (lpvParam
== NULL
)
119 /*SetSystemMetrics( SM_CYICONSPACING, uParam )*/ ;
121 *(INT
*)lpvParam
=GetSystemMetrics(SM_CYICONSPACING
);
124 case SPI_GETICONTITLELOGFONT
: {
125 LPLOGFONTA lpLogFont
= (LPLOGFONTA
)lpvParam
;
127 /* from now on we always have an alias for MS Sans Serif */
129 GetProfileStringA("Desktop", "IconTitleFaceName", "MS Sans Serif",
130 lpLogFont
->lfFaceName
, LF_FACESIZE
);
131 lpLogFont
->lfHeight
= -GetProfileIntA("Desktop","IconTitleSize", 13);
132 lpLogFont
->lfWidth
= 0;
133 lpLogFont
->lfEscapement
= lpLogFont
->lfOrientation
= 0;
134 lpLogFont
->lfWeight
= FW_NORMAL
;
135 lpLogFont
->lfItalic
= FALSE
;
136 lpLogFont
->lfStrikeOut
= FALSE
;
137 lpLogFont
->lfUnderline
= FALSE
;
138 lpLogFont
->lfCharSet
= ANSI_CHARSET
;
139 lpLogFont
->lfOutPrecision
= OUT_DEFAULT_PRECIS
;
140 lpLogFont
->lfClipPrecision
= CLIP_DEFAULT_PRECIS
;
141 lpLogFont
->lfPitchAndFamily
= DEFAULT_PITCH
| FF_SWISS
;
145 case SPI_GETICONMETRICS
: {
146 LPICONMETRICSA lpIcon
= lpvParam
;
147 if(!lpIcon
|| lpIcon
->cbSize
!= sizeof(*lpIcon
))
149 SystemParametersInfoA( SPI_ICONHORIZONTALSPACING
, 0,
150 &lpIcon
->iHorzSpacing
, FALSE
);
151 SystemParametersInfoA( SPI_ICONVERTICALSPACING
, 0,
152 &lpIcon
->iVertSpacing
, FALSE
);
153 SystemParametersInfoA( SPI_GETICONTITLEWRAP
, 0,
154 &lpIcon
->iTitleWrap
, FALSE
);
155 SystemParametersInfoA( SPI_GETICONTITLELOGFONT
, 0,
156 &lpIcon
->lfFont
, FALSE
);
159 case SPI_GETWORKAREA
:
160 SetRect( (RECT
*)lpvParam
, 0, 0,
161 GetSystemMetrics( SM_CXSCREEN
),
162 GetSystemMetrics( SM_CYSCREEN
)
165 case SPI_GETNONCLIENTMETRICS
:
167 #define lpnm ((LPNONCLIENTMETRICSA)lpvParam)
169 if (lpnm
->cbSize
== sizeof(NONCLIENTMETRICSA
))
171 LPLOGFONTA lpLogFont
= &(lpnm
->lfMenuFont
);
173 /* clear the struct, so we have 'sane' members */
175 (char*)lpvParam
+sizeof(lpnm
->cbSize
),
177 lpnm
->cbSize
-sizeof(lpnm
->cbSize
)
180 /* FIXME: initialize geometry entries */
181 /* FIXME: As these values are presumably in device units,
182 * we should calculate the defaults based on the screen dpi
185 lpnm
->iCaptionWidth
= ((TWEAK_WineLook
> WIN31_LOOK
) ? 32 : 20);
186 lpnm
->iCaptionHeight
= lpnm
->iCaptionWidth
;
187 lpnm
->lfCaptionFont
.lfWeight
= FW_BOLD
;
188 SystemParametersInfoA(SPI_GETICONTITLELOGFONT
, 0, (LPVOID
)&(lpnm
->lfCaptionFont
),0);
191 lpnm
->iSmCaptionWidth
= ((TWEAK_WineLook
> WIN31_LOOK
) ? 32 : 17);
192 lpnm
->iSmCaptionHeight
= lpnm
->iSmCaptionWidth
;
193 SystemParametersInfoA(SPI_GETICONTITLELOGFONT
, 0, (LPVOID
)&(lpnm
->lfSmCaptionFont
),0);
195 /* menus, FIXME: names of wine.conf entrys are bogus */
197 lpnm
->iMenuWidth
= GetProfileIntA("Desktop","MenuWidth", 13); /* size of the menu buttons*/
198 lpnm
->iMenuHeight
= GetProfileIntA("Desktop","MenuHeight",
199 (TWEAK_WineLook
> WIN31_LOOK
) ? 13 : 27);
201 GetProfileStringA("Desktop", "MenuFont",
202 (TWEAK_WineLook
> WIN31_LOOK
) ? "MS Sans Serif": "System",
203 lpLogFont
->lfFaceName
, LF_FACESIZE
);
205 lpLogFont
->lfHeight
= -GetProfileIntA("Desktop","MenuFontSize", 13);
206 lpLogFont
->lfWidth
= 0;
207 lpLogFont
->lfEscapement
= lpLogFont
->lfOrientation
= 0;
208 lpLogFont
->lfWeight
= (TWEAK_WineLook
> WIN31_LOOK
) ? FW_NORMAL
: FW_BOLD
;
209 lpLogFont
->lfItalic
= FALSE
;
210 lpLogFont
->lfStrikeOut
= FALSE
;
211 lpLogFont
->lfUnderline
= FALSE
;
212 lpLogFont
->lfCharSet
= ANSI_CHARSET
;
213 lpLogFont
->lfOutPrecision
= OUT_DEFAULT_PRECIS
;
214 lpLogFont
->lfClipPrecision
= CLIP_DEFAULT_PRECIS
;
215 lpLogFont
->lfPitchAndFamily
= DEFAULT_PITCH
| FF_SWISS
;
217 SystemParametersInfoA(SPI_GETICONTITLELOGFONT
, 0,
218 (LPVOID
)&(lpnm
->lfStatusFont
),0);
219 SystemParametersInfoA(SPI_GETICONTITLELOGFONT
, 0,
220 (LPVOID
)&(lpnm
->lfMessageFont
),0);
224 WARN("size mismatch !! (is %d; should be %d)\n", lpnm
->cbSize
, sizeof(NONCLIENTMETRICSA
));
230 case SPI_GETANIMATION
: {
231 LPANIMATIONINFO lpAnimInfo
= (LPANIMATIONINFO
)lpvParam
;
233 /* Tell it "disabled" */
234 lpAnimInfo
->cbSize
= sizeof(ANIMATIONINFO
);
235 uParam
= sizeof(ANIMATIONINFO
);
236 lpAnimInfo
->iMinAnimate
= 0; /* Minimise and restore animation is disabled (nonzero == enabled) */
240 case SPI_SETANIMATION
: {
241 LPANIMATIONINFO lpAnimInfo
= (LPANIMATIONINFO
)lpvParam
;
244 WARN("SPI_SETANIMATION ignored.\n");
245 lpAnimInfo
->cbSize
= sizeof(ANIMATIONINFO
);
246 uParam
= sizeof(ANIMATIONINFO
);
250 case SPI_GETHIGHCONTRAST
:
252 LPHIGHCONTRASTA lpHighContrastA
= (LPHIGHCONTRASTA
)lpvParam
;
254 FIXME("SPI_GETHIGHCONTRAST not fully implemented\n");
256 if ( lpHighContrastA
->cbSize
== sizeof( HIGHCONTRASTA
) )
258 /* Indicate that there is no high contrast available */
259 lpHighContrastA
->dwFlags
= 0;
260 lpHighContrastA
->lpszDefaultScheme
= NULL
;
271 return SystemParametersInfo16(uAction
,uParam
,lpvParam
,fuWinIni
);
277 /***********************************************************************
278 * SystemParametersInfo16 (USER.483)
280 BOOL16 WINAPI
SystemParametersInfo16( UINT16 uAction
, UINT16 uParam
,
281 LPVOID lpvParam
, UINT16 fuWinIni
)
289 *(BOOL
*) lpvParam
= KEYBOARD_GetBeepActive();
293 *(INT16
*)lpvParam
= GetSystemMetrics( SM_CXFRAME
);
296 case SPI_GETFASTTASKSWITCH
:
297 if ( GetProfileIntA( "windows", "CoolSwitch", 1 ) == 1 )
298 *(BOOL16
*) lpvParam
= TRUE
;
300 *(BOOL16
*) lpvParam
= FALSE
;
303 case SPI_GETGRIDGRANULARITY
:
304 *(INT16
*) lpvParam
= GetProfileIntA( "desktop",
309 case SPI_GETICONTITLEWRAP
:
310 *(BOOL16
*) lpvParam
= GetProfileIntA( "desktop",
315 case SPI_GETKEYBOARDDELAY
:
316 *(INT16
*) lpvParam
= GetProfileIntA( "keyboard",
317 "KeyboardDelay", 1 );
320 case SPI_GETKEYBOARDSPEED
:
321 *(WORD
*) lpvParam
= GetProfileIntA( "keyboard",
326 case SPI_GETMENUDROPALIGNMENT
:
327 *(BOOL16
*) lpvParam
= GetSystemMetrics( SM_MENUDROPALIGNMENT
); /* XXX check this */
330 case SPI_GETSCREENSAVEACTIVE
:
331 if(USER_Driver
->pGetScreenSaveActive() ||
332 GetProfileIntA( "windows", "ScreenSaveActive", 1 ) == 1)
333 *(BOOL16
*) lpvParam
= TRUE
;
335 *(BOOL16
*) lpvParam
= FALSE
;
338 case SPI_GETSCREENSAVETIMEOUT
:
339 timeout
= USER_Driver
->pGetScreenSaveTimeout();
341 timeout
= GetProfileIntA( "windows", "ScreenSaveTimeout", 300 );
342 *(INT16
*) lpvParam
= timeout
;
345 case SPI_ICONHORIZONTALSPACING
:
346 /* FIXME Get/SetProfileInt */
347 if (lpvParam
== NULL
)
348 /*SetSystemMetrics( SM_CXICONSPACING, uParam )*/ ;
350 *(INT16
*)lpvParam
= GetSystemMetrics( SM_CXICONSPACING
);
353 case SPI_ICONVERTICALSPACING
:
354 /* FIXME Get/SetProfileInt */
355 if (lpvParam
== NULL
)
356 /*SetSystemMetrics( SM_CYICONSPACING, uParam )*/ ;
358 *(INT16
*)lpvParam
= GetSystemMetrics(SM_CYICONSPACING
);
362 KEYBOARD_SetBeepActive(uParam
);
365 case SPI_SETSCREENSAVEACTIVE
:
366 USER_Driver
->pSetScreenSaveActive(uParam
);
369 case SPI_SETSCREENSAVETIMEOUT
:
370 USER_Driver
->pSetScreenSaveTimeout(uParam
);
373 case SPI_SETDESKWALLPAPER
:
374 return (SetDeskWallPaper((LPSTR
) lpvParam
));
377 case SPI_SETDESKPATTERN
:
378 if ((INT16
)uParam
== -1) {
379 GetProfileStringA("Desktop", "Pattern",
380 "170 85 170 85 170 85 170 85",
381 buffer
, sizeof(buffer
) );
382 return (DESKTOP_SetPattern((LPSTR
) buffer
));
384 return (DESKTOP_SetPattern((LPSTR
) lpvParam
));
387 case SPI_GETICONTITLELOGFONT
:
389 LPLOGFONT16 lpLogFont
= (LPLOGFONT16
)lpvParam
;
390 GetProfileStringA("Desktop", "IconTitleFaceName", "MS Sans Serif",
391 lpLogFont
->lfFaceName
, LF_FACESIZE
);
392 lpLogFont
->lfHeight
= -GetProfileIntA("Desktop","IconTitleSize", 13);
393 lpLogFont
->lfWidth
= 0;
394 lpLogFont
->lfEscapement
= lpLogFont
->lfOrientation
= 0;
395 lpLogFont
->lfWeight
= FW_NORMAL
;
396 lpLogFont
->lfItalic
= FALSE
;
397 lpLogFont
->lfStrikeOut
= FALSE
;
398 lpLogFont
->lfUnderline
= FALSE
;
399 lpLogFont
->lfCharSet
= ANSI_CHARSET
;
400 lpLogFont
->lfOutPrecision
= OUT_DEFAULT_PRECIS
;
401 lpLogFont
->lfClipPrecision
= CLIP_DEFAULT_PRECIS
;
402 lpLogFont
->lfPitchAndFamily
= DEFAULT_PITCH
| FF_SWISS
;
405 case SPI_GETNONCLIENTMETRICS
:
407 #define lpnm ((LPNONCLIENTMETRICS16)lpvParam)
408 if( lpnm
->cbSize
== sizeof(NONCLIENTMETRICS16
) )
410 /* clear the struct, so we have 'sane' members */
412 (char*)lpvParam
+sizeof(lpnm
->cbSize
),
414 lpnm
->cbSize
-sizeof(lpnm
->cbSize
)
416 /* FIXME: initialize geometry entries */
417 SystemParametersInfo16( SPI_GETICONTITLELOGFONT
, 0,
418 (LPVOID
)&(lpnm
->lfCaptionFont
),0);
419 lpnm
->lfCaptionFont
.lfWeight
= FW_BOLD
;
420 SystemParametersInfo16( SPI_GETICONTITLELOGFONT
, 0,
421 (LPVOID
)&(lpnm
->lfSmCaptionFont
),0);
422 SystemParametersInfo16( SPI_GETICONTITLELOGFONT
, 0,
423 (LPVOID
)&(lpnm
->lfMenuFont
),0);
424 SystemParametersInfo16( SPI_GETICONTITLELOGFONT
, 0,
425 (LPVOID
)&(lpnm
->lfStatusFont
),0);
426 SystemParametersInfo16( SPI_GETICONTITLELOGFONT
, 0,
427 (LPVOID
)&(lpnm
->lfMessageFont
),0);
429 else /* winfile 95 sets sbSize to 340 */
430 SystemParametersInfoA( uAction
, uParam
, lpvParam
, fuWinIni
);
436 case SPI_SETDOUBLECLKHEIGHT
:
437 case SPI_SETDOUBLECLICKTIME
:
438 case SPI_SETDOUBLECLKWIDTH
:
439 case SPI_SETFASTTASKSWITCH
:
440 case SPI_SETKEYBOARDDELAY
:
441 case SPI_SETKEYBOARDSPEED
:
442 WARN("Option %d ignored.\n", uAction
);
445 case SPI_GETWORKAREA
:
446 SetRect16( (RECT16
*)lpvParam
, 0, 0,
447 GetSystemMetrics( SM_CXSCREEN
),
448 GetSystemMetrics( SM_CYSCREEN
) );
451 /* FIXME need to implement SPI_SETMOUSEHOVER... */
452 case SPI_GETMOUSEHOVERWIDTH
:
453 *(INT16
*)lpvParam
= 4;
456 case SPI_GETMOUSEHOVERHEIGHT
:
457 *(INT16
*)lpvParam
= 4;
460 case SPI_GETMOUSEHOVERTIME
:
461 *(INT16
*)lpvParam
= 400; /* default for menu dropdowns */
465 FIXME("Unknown option %d.\n", uAction
);
466 SetLastError(ERROR_INVALID_SPI_VALUE
);
472 /***********************************************************************
473 * SystemParametersInfoW (USER32.541)
475 BOOL WINAPI
SystemParametersInfoW( UINT uAction
, UINT uParam
,
476 LPVOID lpvParam
, UINT fuWinIni
)
482 case SPI_SETDESKWALLPAPER
:
485 lstrcpynWtoA(buffer
,(LPWSTR
)lpvParam
,sizeof(buffer
));
486 return SetDeskWallPaper(buffer
);
488 return SetDeskWallPaper(NULL
);
490 case SPI_SETDESKPATTERN
:
491 if ((INT
) uParam
== -1)
493 GetProfileStringA("Desktop", "Pattern",
494 "170 85 170 85 170 85 170 85",
495 buffer
, sizeof(buffer
) );
496 return (DESKTOP_SetPattern((LPSTR
) buffer
));
500 lstrcpynWtoA(buffer
,(LPWSTR
)lpvParam
,sizeof(buffer
));
501 return DESKTOP_SetPattern(buffer
);
503 return DESKTOP_SetPattern(NULL
);
505 case SPI_GETICONTITLELOGFONT
:
507 LPLOGFONTW lpLogFont
= (LPLOGFONTW
)lpvParam
;
509 GetProfileStringA("Desktop", "IconTitleFaceName", "MS Sans Serif",
510 buffer
, sizeof(buffer
) );
511 lstrcpynAtoW(lpLogFont
->lfFaceName
, buffer
, LF_FACESIZE
);
512 lpLogFont
->lfHeight
= 17;
513 lpLogFont
->lfWidth
= 0;
514 lpLogFont
->lfEscapement
= lpLogFont
->lfOrientation
= 0;
515 lpLogFont
->lfWeight
= FW_NORMAL
;
516 lpLogFont
->lfItalic
= lpLogFont
->lfStrikeOut
= lpLogFont
->lfUnderline
= FALSE
;
517 lpLogFont
->lfCharSet
= ANSI_CHARSET
;
518 lpLogFont
->lfOutPrecision
= OUT_DEFAULT_PRECIS
;
519 lpLogFont
->lfClipPrecision
= CLIP_DEFAULT_PRECIS
;
520 lpLogFont
->lfPitchAndFamily
= DEFAULT_PITCH
| FF_SWISS
;
523 case SPI_GETICONMETRICS
: {
524 LPICONMETRICSW lpIcon
= lpvParam
;
525 if(!lpIcon
|| lpIcon
->cbSize
!= sizeof(*lpIcon
))
527 SystemParametersInfoW( SPI_ICONHORIZONTALSPACING
, 0,
528 &lpIcon
->iHorzSpacing
, FALSE
);
529 SystemParametersInfoW( SPI_ICONVERTICALSPACING
, 0,
530 &lpIcon
->iVertSpacing
, FALSE
);
531 SystemParametersInfoW( SPI_GETICONTITLEWRAP
, 0,
532 &lpIcon
->iTitleWrap
, FALSE
);
533 SystemParametersInfoW( SPI_GETICONTITLELOGFONT
, 0,
534 &lpIcon
->lfFont
, FALSE
);
537 case SPI_GETNONCLIENTMETRICS
: {
538 /* FIXME: implement correctly */
539 LPNONCLIENTMETRICSW lpnm
=(LPNONCLIENTMETRICSW
)lpvParam
;
541 /* clear the struct, so we have 'sane' members */
542 memset((char*)lpvParam
+sizeof(lpnm
->cbSize
),
544 lpnm
->cbSize
-sizeof(lpnm
->cbSize
)
546 SystemParametersInfoW(SPI_GETICONTITLELOGFONT
,0,(LPVOID
)&(lpnm
->lfCaptionFont
),0);
547 lpnm
->lfCaptionFont
.lfWeight
= FW_BOLD
;
548 SystemParametersInfoW(SPI_GETICONTITLELOGFONT
,0,(LPVOID
)&(lpnm
->lfSmCaptionFont
),0);
549 SystemParametersInfoW(SPI_GETICONTITLELOGFONT
,0,(LPVOID
)&(lpnm
->lfMenuFont
),0);
550 SystemParametersInfoW(SPI_GETICONTITLELOGFONT
,0,(LPVOID
)&(lpnm
->lfStatusFont
),0);
551 SystemParametersInfoW(SPI_GETICONTITLELOGFONT
,0,(LPVOID
)&(lpnm
->lfMessageFont
),0);
555 case SPI_GETHIGHCONTRAST
:
557 LPHIGHCONTRASTW lpHighContrastW
= (LPHIGHCONTRASTW
)lpvParam
;
559 FIXME("SPI_GETHIGHCONTRAST not fully implemented\n");
561 if ( lpHighContrastW
->cbSize
== sizeof( HIGHCONTRASTW
) )
563 /* Indicate that there is no high contrast available */
564 lpHighContrastW
->dwFlags
= 0;
565 lpHighContrastW
->lpszDefaultScheme
= NULL
;
576 return SystemParametersInfoA(uAction
,uParam
,lpvParam
,fuWinIni
);