reshuffling of dlls
[reactos.git] / reactos / dll / win32 / user32 / misc / desktop.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS user32.dll
5 * FILE: lib/user32/misc/desktop.c
6 * PURPOSE: Desktops
7 * PROGRAMMER: Casper S. Hornstrup (chorns@users.sourceforge.net)
8 * UPDATE HISTORY:
9 * 06-06-2001 CSH Created
10 */
11
12 #include <user32.h>
13
14 VOID
15 STDCALL
16 LogFontW2A(LPLOGFONTA pA, CONST LOGFONTW *pW)
17 {
18 #define COPYS(f,len) WideCharToMultiByte ( CP_THREAD_ACP, 0, pW->f, len, pA->f, len, NULL, NULL )
19 #define COPYN(f) pA->f = pW->f
20
21 COPYN(lfHeight);
22 COPYN(lfWidth);
23 COPYN(lfEscapement);
24 COPYN(lfOrientation);
25 COPYN(lfWeight);
26 COPYN(lfItalic);
27 COPYN(lfUnderline);
28 COPYN(lfStrikeOut);
29 COPYN(lfCharSet);
30 COPYN(lfOutPrecision);
31 COPYN(lfClipPrecision);
32 COPYN(lfQuality);
33 COPYN(lfPitchAndFamily);
34 COPYS(lfFaceName,LF_FACESIZE);
35
36 #undef COPYN
37 #undef COPYS
38 }
39
40 /*
41 * @implemented
42 */
43 int STDCALL
44 GetSystemMetrics(int nIndex)
45 {
46 return(NtUserGetSystemMetrics(nIndex));
47 }
48
49
50 /*
51 * @unimplemented
52 */
53 BOOL STDCALL SetDeskWallpaper(LPCSTR filename)
54 {
55 return SystemParametersInfoA(SPI_SETDESKWALLPAPER,0,(PVOID)filename,TRUE);
56 }
57 /*
58 * @implemented
59 */
60 BOOL STDCALL
61 SystemParametersInfoA(UINT uiAction,
62 UINT uiParam,
63 PVOID pvParam,
64 UINT fWinIni)
65 {
66 switch (uiAction)
67 {
68 case SPI_SETDOUBLECLKWIDTH:
69 case SPI_SETDOUBLECLKHEIGHT:
70 case SPI_SETDOUBLECLICKTIME:
71 case SPI_SETGRADIENTCAPTIONS:
72 case SPI_SETFONTSMOOTHING:
73 case SPI_SETFOCUSBORDERHEIGHT:
74 case SPI_SETFOCUSBORDERWIDTH:
75 case SPI_SETWORKAREA:
76 case SPI_GETWORKAREA:
77 case SPI_GETFONTSMOOTHING:
78 case SPI_GETGRADIENTCAPTIONS:
79 case SPI_GETFOCUSBORDERHEIGHT:
80 case SPI_GETFOCUSBORDERWIDTH:
81 {
82 return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
83 }
84 case SPI_GETNONCLIENTMETRICS:
85 {
86 LPNONCLIENTMETRICSA nclma = (LPNONCLIENTMETRICSA)pvParam;
87 NONCLIENTMETRICSW nclmw;
88 nclmw.cbSize = sizeof(NONCLIENTMETRICSW);
89
90 if (!SystemParametersInfoW(uiAction, sizeof(NONCLIENTMETRICSW),
91 &nclmw, fWinIni))
92 return FALSE;
93
94 nclma->iBorderWidth = nclmw.iBorderWidth;
95 nclma->iScrollWidth = nclmw.iScrollWidth;
96 nclma->iScrollHeight = nclmw.iScrollHeight;
97 nclma->iCaptionWidth = nclmw.iCaptionWidth;
98 nclma->iCaptionHeight = nclmw.iCaptionHeight;
99 nclma->iSmCaptionWidth = nclmw.iSmCaptionWidth;
100 nclma->iSmCaptionHeight = nclmw.iSmCaptionHeight;
101 nclma->iMenuWidth = nclmw.iMenuWidth;
102 nclma->iMenuHeight = nclmw.iMenuHeight;
103 LogFontW2A(&(nclma->lfCaptionFont), &(nclmw.lfCaptionFont));
104 LogFontW2A(&(nclma->lfSmCaptionFont), &(nclmw.lfSmCaptionFont));
105 LogFontW2A(&(nclma->lfMenuFont), &(nclmw.lfMenuFont));
106 LogFontW2A(&(nclma->lfStatusFont), &(nclmw.lfStatusFont));
107 LogFontW2A(&(nclma->lfMessageFont), &(nclmw.lfMessageFont));
108 return TRUE;
109 }
110 case SPI_GETICONTITLELOGFONT:
111 {
112 LOGFONTW lfw;
113 if (!SystemParametersInfoW(uiAction, 0, &lfw, fWinIni))
114 return FALSE;
115 LogFontW2A(pvParam, &lfw);
116 return TRUE;
117 }
118 case SPI_GETDESKWALLPAPER:
119 {
120 HKEY hKey;
121 BOOL Ret = FALSE;
122
123 #if 0
124 /* Get the desktop bitmap handle, this does NOT return the file name! */
125 if(!NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 0, &hbmWallpaper, 0))
126 {
127 /* Return an empty string, no wallpapaper is set */
128 *(CHAR*)pvParam = '\0';
129 return TRUE;
130 }
131 #endif
132
133 /* FIXME - Read the registry key for now, but what happens if the wallpaper was
134 changed without SPIF_UPDATEINIFILE?! */
135 if(RegOpenKeyExW(HKEY_CURRENT_USER,
136 L"Control Panel\\Desktop",
137 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
138 {
139 DWORD Type, Size;
140 Size = uiParam;
141 if(RegQueryValueExA(hKey,
142 "Wallpaper",
143 NULL,
144 &Type,
145 (LPBYTE)pvParam,
146 &Size) == ERROR_SUCCESS
147 && Type == REG_SZ)
148 {
149 Ret = TRUE;
150 }
151 RegCloseKey(hKey);
152 }
153 return Ret;
154 }
155 case SPI_SETDESKWALLPAPER:
156 {
157 HBITMAP hNewWallpaper;
158 BOOL Ret;
159 LPSTR lpWallpaper = (LPSTR)pvParam;
160
161 if(lpWallpaper != NULL && *lpWallpaper != '\0')
162 {
163 hNewWallpaper = LoadImageA(0, lpWallpaper, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
164 if(hNewWallpaper == NULL)
165 {
166 return FALSE;
167 }
168 }
169 else
170 {
171 hNewWallpaper = NULL;
172 lpWallpaper = NULL;
173 }
174
175 /* Set the wallpaper bitmap */
176 if(!NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hNewWallpaper, fWinIni & SPIF_SENDCHANGE))
177 {
178 if(hNewWallpaper != NULL)
179 DeleteObject(hNewWallpaper);
180 return FALSE;
181 }
182 /* Do not use the bitmap handle anymore, it doesn't belong to our process anymore! */
183
184 Ret = TRUE;
185 if(fWinIni & SPIF_UPDATEINIFILE)
186 {
187 /* Save the path to the file in the registry */
188 HKEY hKey;
189 if(RegOpenKeyExW(HKEY_CURRENT_USER,
190 L"Control Panel\\Desktop",
191 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS)
192 {
193 Ret = RegSetValueExA(hKey, "Wallpaper", 0, REG_SZ, (LPBYTE)(lpWallpaper != NULL ? lpWallpaper : ""),
194 (lpWallpaper != NULL ? (lstrlenA(lpWallpaper) + 1) * sizeof(CHAR) : sizeof(CHAR)) == ERROR_SUCCESS);
195 RegCloseKey(hKey);
196 }
197 }
198
199 RedrawWindow(GetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE);
200
201 return Ret;
202 }
203 }
204
205 return FALSE;
206 }
207
208
209 /*
210 * @implemented
211 */
212 BOOL STDCALL
213 SystemParametersInfoW(UINT uiAction,
214 UINT uiParam,
215 PVOID pvParam,
216 UINT fWinIni)
217 {
218 switch(uiAction)
219 {
220 case SPI_GETDESKWALLPAPER:
221 {
222 HKEY hKey;
223 BOOL Ret = FALSE;
224
225 #if 0
226 /* Get the desktop bitmap handle, this does NOT return the file name! */
227 if(!NtUserSystemParametersInfo(SPI_GETDESKWALLPAPER, 0, &hbmWallpaper, 0))
228 {
229 /* Return an empty string, no wallpapaper is set */
230 *(WCHAR*)pvParam = L'\0';
231 return TRUE;
232 }
233 #endif
234
235 /* FIXME - Read the registry key for now, but what happens if the wallpaper was
236 changed without SPIF_UPDATEINIFILE?! */
237 if(RegOpenKeyExW(HKEY_CURRENT_USER,
238 L"Control Panel\\Desktop",
239 0, KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS)
240 {
241 DWORD Type, Size;
242 Size = uiParam * sizeof(WCHAR);
243 if(RegQueryValueExW(hKey,
244 L"Wallpaper",
245 NULL,
246 &Type,
247 (LPBYTE)pvParam,
248 &Size) == ERROR_SUCCESS
249 && Type == REG_SZ)
250 {
251 Ret = TRUE;
252 }
253 RegCloseKey(hKey);
254 }
255 return Ret;
256 }
257 case SPI_SETDESKWALLPAPER:
258 {
259 HBITMAP hNewWallpaper;
260 BOOL Ret;
261 LPWSTR lpWallpaper = (LPWSTR)pvParam;
262
263 if(lpWallpaper != NULL && *lpWallpaper != L'\0')
264 {
265 hNewWallpaper = LoadImageW(0, lpWallpaper, IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
266
267 if(hNewWallpaper == NULL)
268 {
269 return FALSE;
270 }
271 }
272 else
273 {
274 hNewWallpaper = NULL;
275 lpWallpaper = NULL;
276 }
277
278 /* Set the wallpaper bitmap */
279 if(!NtUserSystemParametersInfo(SPI_SETDESKWALLPAPER, 0, &hNewWallpaper, fWinIni & SPIF_SENDCHANGE))
280 {
281 if(hNewWallpaper != NULL)
282 DeleteObject(hNewWallpaper);
283 return FALSE;
284 }
285 /* Do not use the bitmap handle anymore, it doesn't belong to our process anymore! */
286 Ret = TRUE;
287 if(fWinIni & SPIF_UPDATEINIFILE)
288 {
289 /* Save the path to the file in the registry */
290 HKEY hKey;
291
292 if(RegOpenKeyExW(HKEY_CURRENT_USER,
293 L"Control Panel\\Desktop",
294 0, KEY_SET_VALUE, &hKey) == ERROR_SUCCESS)
295 {
296 Ret = (RegSetValueExW(hKey, L"Wallpaper", 0, REG_SZ, (lpWallpaper != NULL ? (LPBYTE)lpWallpaper : (LPBYTE)L""),
297 (lpWallpaper != NULL ? (lstrlenW(lpWallpaper) + 1) * sizeof(WCHAR) : sizeof(WCHAR))) == ERROR_SUCCESS);
298 RegCloseKey(hKey);
299 }
300 }
301
302 RedrawWindow(GetShellWindow(), NULL, NULL, RDW_INVALIDATE | RDW_ERASE);
303
304 return Ret;
305 }
306 }
307 return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
308 }
309
310
311 /*
312 * @implemented
313 */
314 BOOL
315 STDCALL
316 CloseDesktop(
317 HDESK hDesktop)
318 {
319 return NtUserCloseDesktop(hDesktop);
320 }
321
322
323 /*
324 * @implemented
325 */
326 HDESK STDCALL
327 CreateDesktopA(LPCSTR lpszDesktop,
328 LPCSTR lpszDevice,
329 LPDEVMODEA pDevmode,
330 DWORD dwFlags,
331 ACCESS_MASK dwDesiredAccess,
332 LPSECURITY_ATTRIBUTES lpsa)
333 {
334 ANSI_STRING DesktopNameA;
335 UNICODE_STRING DesktopNameU;
336 HDESK hDesktop;
337 LPDEVMODEW DevmodeW;
338
339 if (lpszDesktop != NULL)
340 {
341 RtlInitAnsiString(&DesktopNameA, (LPSTR)lpszDesktop);
342 RtlAnsiStringToUnicodeString(&DesktopNameU, &DesktopNameA, TRUE);
343 }
344 else
345 {
346 RtlInitUnicodeString(&DesktopNameU, NULL);
347 }
348
349 DevmodeW = GdiConvertToDevmodeW(pDevmode);
350
351 hDesktop = CreateDesktopW(DesktopNameU.Buffer,
352 NULL,
353 DevmodeW,
354 dwFlags,
355 dwDesiredAccess,
356 lpsa);
357
358 RtlFreeUnicodeString(&DesktopNameU);
359 return(hDesktop);
360 }
361
362
363 /*
364 * @implemented
365 */
366 HDESK STDCALL
367 CreateDesktopW(LPCWSTR lpszDesktop,
368 LPCWSTR lpszDevice,
369 LPDEVMODEW pDevmode,
370 DWORD dwFlags,
371 ACCESS_MASK dwDesiredAccess,
372 LPSECURITY_ATTRIBUTES lpsa)
373 {
374 UNICODE_STRING DesktopName;
375 HWINSTA hWinSta;
376 HDESK hDesktop;
377
378 hWinSta = NtUserGetProcessWindowStation();
379
380 RtlInitUnicodeString(&DesktopName, lpszDesktop);
381
382 hDesktop = NtUserCreateDesktop(&DesktopName,
383 dwFlags,
384 dwDesiredAccess,
385 lpsa,
386 hWinSta);
387
388 return(hDesktop);
389 }
390
391
392 /*
393 * @implemented
394 */
395 BOOL
396 STDCALL
397 EnumDesktopsA(
398 HWINSTA WindowStation,
399 DESKTOPENUMPROCA EnumFunc,
400 LPARAM Context)
401 {
402 return EnumNamesA(WindowStation, EnumFunc, Context, TRUE);
403 }
404
405
406 /*
407 * @implemented
408 */
409 BOOL
410 STDCALL
411 EnumDesktopsW(
412 HWINSTA WindowStation,
413 DESKTOPENUMPROCW EnumFunc,
414 LPARAM Context)
415 {
416 return EnumNamesW(WindowStation, EnumFunc, Context, TRUE);
417 }
418
419
420 /*
421 * @implemented
422 */
423 HDESK
424 STDCALL
425 GetThreadDesktop(
426 DWORD dwThreadId)
427 {
428 return NtUserGetThreadDesktop(dwThreadId, 0);
429 }
430
431
432 /*
433 * @implemented
434 */
435 HDESK
436 STDCALL
437 OpenDesktopA(
438 LPSTR lpszDesktop,
439 DWORD dwFlags,
440 BOOL fInherit,
441 ACCESS_MASK dwDesiredAccess)
442 {
443 ANSI_STRING DesktopNameA;
444 UNICODE_STRING DesktopNameU;
445 HDESK hDesktop;
446
447 if (lpszDesktop != NULL) {
448 RtlInitAnsiString(&DesktopNameA, lpszDesktop);
449 RtlAnsiStringToUnicodeString(&DesktopNameU, &DesktopNameA, TRUE);
450 } else {
451 RtlInitUnicodeString(&DesktopNameU, NULL);
452 }
453
454 hDesktop = OpenDesktopW(
455 DesktopNameU.Buffer,
456 dwFlags,
457 fInherit,
458 dwDesiredAccess);
459
460 RtlFreeUnicodeString(&DesktopNameU);
461
462 return hDesktop;
463 }
464
465
466 /*
467 * @implemented
468 */
469 HDESK
470 STDCALL
471 OpenDesktopW(
472 LPWSTR lpszDesktop,
473 DWORD dwFlags,
474 BOOL fInherit,
475 ACCESS_MASK dwDesiredAccess)
476 {
477 UNICODE_STRING DesktopName;
478
479 RtlInitUnicodeString(&DesktopName, lpszDesktop);
480
481 return NtUserOpenDesktop(
482 &DesktopName,
483 dwFlags,
484 dwDesiredAccess);
485 }
486
487
488 /*
489 * @implemented
490 */
491 HDESK
492 STDCALL
493 OpenInputDesktop(
494 DWORD dwFlags,
495 BOOL fInherit,
496 ACCESS_MASK dwDesiredAccess)
497 {
498 return NtUserOpenInputDesktop(
499 dwFlags,
500 fInherit,
501 dwDesiredAccess);
502 }
503
504
505 /*
506 * @implemented
507 */
508 BOOL
509 STDCALL
510 PaintDesktop(
511 HDC hdc)
512 {
513 return NtUserPaintDesktop(hdc);
514 }
515
516
517 /*
518 * @implemented
519 */
520 BOOL
521 STDCALL
522 SetThreadDesktop(
523 HDESK hDesktop)
524 {
525 return NtUserSetThreadDesktop(hDesktop);
526 }
527
528
529 /*
530 * @implemented
531 */
532 BOOL
533 STDCALL
534 SwitchDesktop(
535 HDESK hDesktop)
536 {
537 return NtUserSwitchDesktop(hDesktop);
538 }
539
540
541 /*
542 * @implemented
543 */
544 BOOL STDCALL
545 SetShellWindowEx(HWND hwndShell, HWND hwndShellListView)
546 {
547 return NtUserSetShellWindowEx(hwndShell, hwndShellListView);
548 }
549
550
551 /*
552 * @implemented
553 */
554 BOOL STDCALL
555 SetShellWindow(HWND hwndShell)
556 {
557 return SetShellWindowEx(hwndShell, hwndShell);
558 }
559
560
561 /*
562 * @implemented
563 */
564 HWND STDCALL
565 GetShellWindow(VOID)
566 {
567 return NtUserGetShellWindow();
568 }
569
570
571 /* EOF */