update for HEAD-2003091401
[reactos.git] / lib / 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 #include <string.h>
12 #include <windows.h>
13 #include <user32.h>
14 #include <debug.h>
15 #include <rosrtl/devmode.h>
16 #include <rosrtl/logfont.h>
17
18 /*
19  * @implemented
20  */
21 int STDCALL
22 GetSystemMetrics(int nIndex)
23 {
24   return(NtUserGetSystemMetrics(nIndex));
25 }
26
27
28 /*
29  * @unimplemented
30  */
31 WINBOOL STDCALL SetDeskWallpaper(LPCSTR filename)
32 {
33         return SystemParametersInfoA(SPI_SETDESKWALLPAPER,0,(PVOID)filename,1);
34 }
35 /*
36  * @implemented
37  */
38 WINBOOL STDCALL
39 SystemParametersInfoA(UINT uiAction,
40                       UINT uiParam,
41                       PVOID pvParam,
42                       UINT fWinIni)
43 {
44   switch (uiAction)
45     {
46       case SPI_GETWORKAREA:
47         {
48            return SystemParametersInfoW(uiAction, uiParam, pvParam, fWinIni);
49         }
50       case SPI_GETNONCLIENTMETRICS:
51         {
52            LPNONCLIENTMETRICSA nclma = (LPNONCLIENTMETRICSA)pvParam;
53            NONCLIENTMETRICSW nclmw;
54            nclmw.cbSize = sizeof(NONCLIENTMETRICSW);
55
56            if (!SystemParametersInfoW(uiAction, sizeof(NONCLIENTMETRICSW),
57                                       &nclmw, fWinIni))
58              return FALSE;
59
60            nclma->iBorderWidth = nclmw.iBorderWidth;
61            nclma->iScrollWidth = nclmw.iScrollWidth;
62            nclma->iScrollHeight = nclmw.iScrollHeight;
63            nclma->iCaptionWidth = nclmw.iCaptionWidth;
64            nclma->iCaptionHeight = nclmw.iCaptionHeight;
65            nclma->iSmCaptionWidth = nclmw.iSmCaptionWidth;
66            nclma->iSmCaptionHeight = nclmw.iSmCaptionHeight;
67            nclma->iMenuWidth = nclmw.iMenuWidth;
68            nclma->iMenuHeight = nclmw.iMenuHeight;
69            RosRtlLogFontW2A(&(nclma->lfCaptionFont), &(nclmw.lfCaptionFont));
70            RosRtlLogFontW2A(&(nclma->lfSmCaptionFont), &(nclmw.lfSmCaptionFont));
71            RosRtlLogFontW2A(&(nclma->lfMenuFont), &(nclmw.lfMenuFont));
72            RosRtlLogFontW2A(&(nclma->lfStatusFont), &(nclmw.lfStatusFont));
73            RosRtlLogFontW2A(&(nclma->lfMessageFont), &(nclmw.lfMessageFont));
74            return TRUE;
75         }
76       case SPI_GETICONTITLELOGFONT:
77         {
78            LOGFONTW lfw;
79            if (!SystemParametersInfoW(uiAction, 0, &lfw, fWinIni))
80              return FALSE;
81            RosRtlLogFontW2A(pvParam, &lfw);
82            return TRUE;
83         }
84     }
85
86   return FALSE;
87 }
88
89
90 /*
91  * @implemented
92  */
93 WINBOOL STDCALL
94 SystemParametersInfoW(UINT uiAction,
95                       UINT uiParam,
96                       PVOID pvParam,
97                       UINT fWinIni)
98 {
99   return NtUserSystemParametersInfo(uiAction, uiParam, pvParam, fWinIni);
100 }
101
102
103 /*
104  * @implemented
105  */
106 WINBOOL
107 STDCALL
108 CloseDesktop(
109   HDESK hDesktop)
110 {
111   return NtUserCloseDesktop(hDesktop);
112 }
113
114
115 /*
116  * @implemented
117  */
118 HDESK STDCALL
119 CreateDesktopA(LPCSTR lpszDesktop,
120                LPCSTR lpszDevice,
121                LPDEVMODEA pDevmode,
122                DWORD dwFlags,
123                ACCESS_MASK dwDesiredAccess,
124                LPSECURITY_ATTRIBUTES lpsa)
125 {
126   ANSI_STRING DesktopNameA;
127   UNICODE_STRING DesktopNameU;
128   HDESK hDesktop;
129   DEVMODEW DevmodeW;
130
131   if (lpszDesktop != NULL) 
132     {
133       RtlInitAnsiString(&DesktopNameA, (LPSTR)lpszDesktop);
134       RtlAnsiStringToUnicodeString(&DesktopNameU, &DesktopNameA, TRUE);
135     } 
136   else 
137     {
138       RtlInitUnicodeString(&DesktopNameU, NULL);
139     }
140
141   RosRtlDevModeA2W ( &DevmodeW, pDevmode );
142
143   hDesktop = CreateDesktopW(DesktopNameU.Buffer,
144                             NULL,
145                             &DevmodeW,
146                             dwFlags,
147                             dwDesiredAccess,
148                             lpsa);
149
150   RtlFreeUnicodeString(&DesktopNameU);
151   return(hDesktop);
152 }
153
154
155 /*
156  * @implemented
157  */
158 HDESK STDCALL
159 CreateDesktopW(LPCWSTR lpszDesktop,
160                LPCWSTR lpszDevice,
161                LPDEVMODEW pDevmode,
162                DWORD dwFlags,
163                ACCESS_MASK dwDesiredAccess,
164                LPSECURITY_ATTRIBUTES lpsa)
165 {
166   UNICODE_STRING DesktopName;
167   HWINSTA hWinSta;
168   HDESK hDesktop;
169
170   hWinSta = NtUserGetProcessWindowStation();
171
172   RtlInitUnicodeString(&DesktopName, lpszDesktop);
173
174   hDesktop = NtUserCreateDesktop(&DesktopName,
175                                  dwFlags,
176                                  dwDesiredAccess,
177                                  lpsa,
178                                  hWinSta);
179
180   return(hDesktop);
181 }
182
183
184 /*
185  * @unimplemented
186  */
187 WINBOOL
188 STDCALL
189 EnumDesktopsA(
190   HWINSTA hwinsta,
191   DESKTOPENUMPROCA lpEnumFunc,
192   LPARAM lParam)
193 {
194   UNIMPLEMENTED;
195   return FALSE;
196 }
197
198
199 /*
200  * @unimplemented
201  */
202 WINBOOL
203 STDCALL
204 EnumDesktopsW(
205   HWINSTA hwinsta,
206   DESKTOPENUMPROCW lpEnumFunc,
207   LPARAM lParam)
208 {
209   UNIMPLEMENTED;
210   return FALSE;
211 }
212
213
214 /*
215  * @implemented
216  */
217 HDESK
218 STDCALL
219 GetThreadDesktop(
220   DWORD dwThreadId)
221 {
222   return NtUserGetThreadDesktop(dwThreadId, 0);
223 }
224
225
226 /*
227  * @implemented
228  */
229 HDESK
230 STDCALL
231 OpenDesktopA(
232   LPSTR lpszDesktop,
233   DWORD dwFlags,
234   WINBOOL fInherit,
235   ACCESS_MASK dwDesiredAccess)
236 {
237   ANSI_STRING DesktopNameA;
238   UNICODE_STRING DesktopNameU;
239   HDESK hDesktop;
240
241         if (lpszDesktop != NULL) {
242                 RtlInitAnsiString(&DesktopNameA, lpszDesktop);
243                 RtlAnsiStringToUnicodeString(&DesktopNameU, &DesktopNameA, TRUE);
244   } else {
245     RtlInitUnicodeString(&DesktopNameU, NULL);
246   }
247
248   hDesktop = OpenDesktopW(
249     DesktopNameU.Buffer,
250     dwFlags,
251     fInherit,
252     dwDesiredAccess);
253
254         RtlFreeUnicodeString(&DesktopNameU);
255
256   return hDesktop;
257 }
258
259
260 /*
261  * @implemented
262  */
263 HDESK
264 STDCALL
265 OpenDesktopW(
266   LPWSTR lpszDesktop,
267   DWORD dwFlags,
268   WINBOOL fInherit,
269   ACCESS_MASK dwDesiredAccess)
270 {
271   UNICODE_STRING DesktopName;
272
273   RtlInitUnicodeString(&DesktopName, lpszDesktop);
274
275   return NtUserOpenDesktop(
276     &DesktopName,
277     dwFlags,
278     dwDesiredAccess);
279 }
280
281
282 /*
283  * @implemented
284  */
285 HDESK
286 STDCALL
287 OpenInputDesktop(
288   DWORD dwFlags,
289   WINBOOL fInherit,
290   ACCESS_MASK dwDesiredAccess)
291 {
292   return NtUserOpenInputDesktop(
293     dwFlags,
294     fInherit,
295     dwDesiredAccess);
296 }
297
298
299 /*
300  * @implemented
301  */
302 WINBOOL
303 STDCALL
304 PaintDesktop(
305   HDC hdc)
306 {
307   return NtUserPaintDesktop(hdc);
308 }
309
310
311 /*
312  * @implemented
313  */
314 WINBOOL
315 STDCALL
316 SetThreadDesktop(
317   HDESK hDesktop)
318 {
319   return NtUserSetThreadDesktop(hDesktop);
320 }
321
322
323 /*
324  * @implemented
325  */
326 WINBOOL
327 STDCALL
328 SwitchDesktop(
329   HDESK hDesktop)
330 {
331   return NtUserSwitchDesktop(hDesktop);
332 }
333
334
335 /*
336  * @implemented
337  */
338 BOOL STDCALL
339 SetShellWindowEx(HWND hwndShell, HWND hwndShellListView)
340 {
341         return NtUserSetShellWindowEx(hwndShell, hwndShellListView);
342 }
343
344
345 /*
346  * @implemented
347  */
348 BOOL STDCALL
349 SetShellWindow(HWND hwndShell)
350 {
351         return SetShellWindowEx(hwndShell, hwndShell);
352 }
353
354
355 /*
356  * @implemented
357  */
358 HWND STDCALL
359 GetShellWindow(VOID)
360 {
361         return NtUserGetShellWindow();
362 }
363
364
365 /* EOF */