Initialize 'str' in ICONTITLE_GetTitlePos.
[wine.git] / windows / sysparams.c
blob0a3ff01cd4d205791eb6beb52621b9d7f71e3aff
1 /*
2 * System parameters functions
4 * Copyright 1994 Alexandre Julliard
5 */
7 #include "config.h"
9 #include "windef.h"
10 #include "winbase.h"
11 #include "wingdi.h"
12 #include "wine/winuser16.h"
13 #include "winerror.h"
15 #include "keyboard.h"
16 #include "tweak.h"
17 #include "user.h"
18 #include "desktop.h"
19 #include "debugtools.h"
21 DEFAULT_DEBUG_CHANNEL(system);
23 /***********************************************************************
24 * GetTimerResolution (USER.14)
26 LONG WINAPI GetTimerResolution16(void)
28 return (1000);
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 )
45 int timeout;
47 switch (uAction) {
48 case SPI_GETBEEP:
49 *(BOOL *) lpvParam = KEYBOARD_GetBeepActive();
50 break;
51 case SPI_SETBEEP:
52 KEYBOARD_SetBeepActive(uParam);
53 break;
55 case SPI_GETBORDER:
56 *(INT *)lpvParam = GetSystemMetrics( SM_CXFRAME );
57 break;
59 case SPI_GETDRAGFULLWINDOWS:
60 *(BOOL *) lpvParam = FALSE;
61 break;
63 case SPI_SETDRAGFULLWINDOWS:
64 break;
66 case SPI_GETFASTTASKSWITCH:
67 if ( GetProfileIntA( "windows", "CoolSwitch", 1 ) == 1 )
68 *(BOOL *) lpvParam = TRUE;
69 else
70 *(BOOL *) lpvParam = FALSE;
71 break;
73 case SPI_GETGRIDGRANULARITY:
74 *(INT*)lpvParam=GetProfileIntA("desktop","GridGranularity",1);
75 break;
77 case SPI_GETICONTITLEWRAP:
78 *(BOOL*)lpvParam=GetProfileIntA("desktop","IconTitleWrap",TRUE);
79 break;
81 case SPI_GETKEYBOARDDELAY:
82 *(INT*)lpvParam=GetProfileIntA("keyboard","KeyboardDelay",1);
83 break;
85 case SPI_GETKEYBOARDSPEED:
86 *(DWORD*)lpvParam=GetProfileIntA("keyboard","KeyboardSpeed",30);
87 break;
89 case SPI_GETMENUDROPALIGNMENT:
90 *(BOOL*)lpvParam=GetSystemMetrics(SM_MENUDROPALIGNMENT); /* XXX check this */
91 break;
93 case SPI_GETSCREENSAVEACTIVE:
94 if(USER_Driver->pGetScreenSaveActive() ||
95 GetProfileIntA( "windows", "ScreenSaveActive", 1 ) == 1)
96 *(BOOL*)lpvParam = TRUE;
97 else
98 *(BOOL*)lpvParam = FALSE;
99 break;
101 case SPI_GETSCREENSAVETIMEOUT:
102 timeout = USER_Driver->pGetScreenSaveTimeout();
103 if(!timeout)
104 timeout = GetProfileIntA( "windows", "ScreenSaveTimeout", 300 );
105 *(INT *) lpvParam = timeout * 1000;
106 break;
108 case SPI_ICONHORIZONTALSPACING:
109 /* FIXME Get/SetProfileInt */
110 if (lpvParam == NULL)
111 /*SetSystemMetrics( SM_CXICONSPACING, uParam )*/ ;
112 else
113 *(INT*)lpvParam=GetSystemMetrics(SM_CXICONSPACING);
114 break;
116 case SPI_ICONVERTICALSPACING:
117 /* FIXME Get/SetProfileInt */
118 if (lpvParam == NULL)
119 /*SetSystemMetrics( SM_CYICONSPACING, uParam )*/ ;
120 else
121 *(INT*)lpvParam=GetSystemMetrics(SM_CYICONSPACING);
122 break;
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;
142 break;
145 case SPI_GETICONMETRICS: {
146 LPICONMETRICSA lpIcon = lpvParam;
147 if(!lpIcon || lpIcon->cbSize != sizeof(*lpIcon))
148 return FALSE;
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 );
157 break;
159 case SPI_GETWORKAREA:
160 SetRect( (RECT *)lpvParam, 0, 0,
161 GetSystemMetrics( SM_CXSCREEN ),
162 GetSystemMetrics( SM_CYSCREEN )
164 break;
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 */
174 memset(
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
184 /* caption */
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);
190 /* small caption */
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);
222 else
224 WARN("size mismatch !! (is %d; should be %d)\n", lpnm->cbSize, sizeof(NONCLIENTMETRICSA));
225 return FALSE;
227 #undef lpnm
228 break;
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) */
237 break;
240 case SPI_SETANIMATION: {
241 LPANIMATIONINFO lpAnimInfo = (LPANIMATIONINFO)lpvParam;
243 /* Do nothing */
244 WARN("SPI_SETANIMATION ignored.\n");
245 lpAnimInfo->cbSize = sizeof(ANIMATIONINFO);
246 uParam = sizeof(ANIMATIONINFO);
247 break;
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;
262 else
264 return FALSE;
267 break;
270 default:
271 return SystemParametersInfo16(uAction,uParam,lpvParam,fuWinIni);
273 return TRUE;
277 /***********************************************************************
278 * SystemParametersInfo16 (USER.483)
280 BOOL16 WINAPI SystemParametersInfo16( UINT16 uAction, UINT16 uParam,
281 LPVOID lpvParam, UINT16 fuWinIni )
283 int timeout;
284 char buffer[256];
286 switch (uAction)
288 case SPI_GETBEEP:
289 *(BOOL *) lpvParam = KEYBOARD_GetBeepActive();
290 break;
292 case SPI_GETBORDER:
293 *(INT16 *)lpvParam = GetSystemMetrics( SM_CXFRAME );
294 break;
296 case SPI_GETFASTTASKSWITCH:
297 if ( GetProfileIntA( "windows", "CoolSwitch", 1 ) == 1 )
298 *(BOOL16 *) lpvParam = TRUE;
299 else
300 *(BOOL16 *) lpvParam = FALSE;
301 break;
303 case SPI_GETGRIDGRANULARITY:
304 *(INT16 *) lpvParam = GetProfileIntA( "desktop",
305 "GridGranularity",
306 1 );
307 break;
309 case SPI_GETICONTITLEWRAP:
310 *(BOOL16 *) lpvParam = GetProfileIntA( "desktop",
311 "IconTitleWrap",
312 TRUE );
313 break;
315 case SPI_GETKEYBOARDDELAY:
316 *(INT16 *) lpvParam = GetProfileIntA( "keyboard",
317 "KeyboardDelay", 1 );
318 break;
320 case SPI_GETKEYBOARDSPEED:
321 *(WORD *) lpvParam = GetProfileIntA( "keyboard",
322 "KeyboardSpeed",
323 30 );
324 break;
326 case SPI_GETMENUDROPALIGNMENT:
327 *(BOOL16 *) lpvParam = GetSystemMetrics( SM_MENUDROPALIGNMENT ); /* XXX check this */
328 break;
330 case SPI_GETSCREENSAVEACTIVE:
331 if(USER_Driver->pGetScreenSaveActive() ||
332 GetProfileIntA( "windows", "ScreenSaveActive", 1 ) == 1)
333 *(BOOL16 *) lpvParam = TRUE;
334 else
335 *(BOOL16 *) lpvParam = FALSE;
336 break;
338 case SPI_GETSCREENSAVETIMEOUT:
339 timeout = USER_Driver->pGetScreenSaveTimeout();
340 if(!timeout)
341 timeout = GetProfileIntA( "windows", "ScreenSaveTimeout", 300 );
342 *(INT16 *) lpvParam = timeout;
343 break;
345 case SPI_ICONHORIZONTALSPACING:
346 /* FIXME Get/SetProfileInt */
347 if (lpvParam == NULL)
348 /*SetSystemMetrics( SM_CXICONSPACING, uParam )*/ ;
349 else
350 *(INT16 *)lpvParam = GetSystemMetrics( SM_CXICONSPACING );
351 break;
353 case SPI_ICONVERTICALSPACING:
354 /* FIXME Get/SetProfileInt */
355 if (lpvParam == NULL)
356 /*SetSystemMetrics( SM_CYICONSPACING, uParam )*/ ;
357 else
358 *(INT16 *)lpvParam = GetSystemMetrics(SM_CYICONSPACING);
359 break;
361 case SPI_SETBEEP:
362 KEYBOARD_SetBeepActive(uParam);
363 break;
365 case SPI_SETSCREENSAVEACTIVE:
366 USER_Driver->pSetScreenSaveActive(uParam);
367 break;
369 case SPI_SETSCREENSAVETIMEOUT:
370 USER_Driver->pSetScreenSaveTimeout(uParam);
371 break;
373 case SPI_SETDESKWALLPAPER:
374 return (SetDeskWallPaper((LPSTR) lpvParam));
375 break;
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));
383 } else
384 return (DESKTOP_SetPattern((LPSTR) lpvParam));
385 break;
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;
403 break;
405 case SPI_GETNONCLIENTMETRICS:
407 #define lpnm ((LPNONCLIENTMETRICS16)lpvParam)
408 if( lpnm->cbSize == sizeof(NONCLIENTMETRICS16) )
410 /* clear the struct, so we have 'sane' members */
411 memset(
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 );
431 #undef lpnm
432 break;
434 case SPI_LANGDRIVER:
435 case SPI_SETBORDER:
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);
443 break;
445 case SPI_GETWORKAREA:
446 SetRect16( (RECT16 *)lpvParam, 0, 0,
447 GetSystemMetrics( SM_CXSCREEN ),
448 GetSystemMetrics( SM_CYSCREEN ) );
449 break;
451 /* FIXME need to implement SPI_SETMOUSEHOVER... */
452 case SPI_GETMOUSEHOVERWIDTH:
453 *(INT16 *)lpvParam = 4;
454 break;
456 case SPI_GETMOUSEHOVERHEIGHT:
457 *(INT16 *)lpvParam = 4;
458 break;
460 case SPI_GETMOUSEHOVERTIME:
461 *(INT16 *)lpvParam = 400; /* default for menu dropdowns */
462 break;
464 default:
465 FIXME("Unknown option %d.\n", uAction);
466 SetLastError(ERROR_INVALID_SPI_VALUE);
467 return 0;
469 return 1;
472 /***********************************************************************
473 * SystemParametersInfoW (USER32.541)
475 BOOL WINAPI SystemParametersInfoW( UINT uAction, UINT uParam,
476 LPVOID lpvParam, UINT fuWinIni )
478 char buffer[256];
480 switch (uAction)
482 case SPI_SETDESKWALLPAPER:
483 if (lpvParam)
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));
498 if (lpvParam)
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;
522 break;
523 case SPI_GETICONMETRICS: {
524 LPICONMETRICSW lpIcon = lpvParam;
525 if(!lpIcon || lpIcon->cbSize != sizeof(*lpIcon))
526 return FALSE;
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 );
535 break;
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);
552 break;
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;
567 else
569 return FALSE;
572 break;
575 default:
576 return SystemParametersInfoA(uAction,uParam,lpvParam,fuWinIni);
579 return TRUE;