[EXPLORER]
[reactos.git] / reactos / base / shell / explorer / precomp.h
1 #ifndef _EXPLORER_PRECOMP__H_
2 #define _EXPLORER_PRECOMP__H_
3
4 #define WIN7_COMPAT_MODE 0
5
6 #include <stdio.h>
7 #include <tchar.h>
8
9 #define WIN32_NO_STATUS
10 #define _INC_WINDOWS
11 #define COM_NO_WINDOWS_H
12
13 #define COBJMACROS
14
15 #include <windef.h>
16 #include <winbase.h>
17 #include <winreg.h>
18 #include <wingdi.h>
19 #include <winnls.h>
20 #include <wincon.h>
21 #include <atlbase.h>
22 #include <atlcom.h>
23 #include <atlwin.h>
24 #include <shellapi.h>
25 #include <shlobj.h>
26 #include <shlwapi.h>
27 #include <uxtheme.h>
28 #include <strsafe.h>
29
30 #include <undocuser.h>
31 #include <shlwapi_undoc.h>
32 #include <shlobj_undoc.h>
33 #include <shlguid_undoc.h>
34 #include <undocshell.h>
35
36 #include <rosctrls.h>
37 #include <shellutils.h>
38
39 #include "tmschema.h"
40 #include "resource.h"
41
42 #include <wine/debug.h>
43
44 WINE_DEFAULT_DEBUG_CHANNEL(explorernew);
45
46 #define ASSERT(cond) \
47 do if (!(cond)) { \
48 Win32DbgPrint(__FILE__, __LINE__, "ASSERTION %s FAILED!\n", #cond); \
49 } while (0)
50
51 extern HINSTANCE hExplorerInstance;
52 extern HANDLE hProcessHeap;
53 extern HKEY hkExplorer;
54
55 /*
56 * dragdrop.c
57 */
58
59 typedef struct _DROPTARGET_CALLBACKS
60 {
61 HRESULT(*OnDragEnter)(IN IDropTarget *pDropTarget,
62 IN PVOID Context,
63 IN const FORMATETC *Format,
64 IN DWORD grfKeyState,
65 IN POINTL pt,
66 IN OUT DWORD *pdwEffect);
67 HRESULT(*OnDragOver)(IN IDropTarget *pDropTarget,
68 IN PVOID Context,
69 IN DWORD grfKeyState,
70 IN POINTL pt,
71 IN OUT DWORD *pdwEffect);
72 HRESULT(*OnDragLeave)(IN IDropTarget *pDropTarget,
73 IN PVOID Context);
74 HRESULT(*OnDrop)(IN IDropTarget *pDropTarget,
75 IN PVOID Context,
76 IN const FORMATETC *Format,
77 IN DWORD grfKeyState,
78 IN POINTL pt,
79 IN OUT DWORD *pdwEffect);
80 } DROPTARGET_CALLBACKS, *PDROPTARGET_CALLBACKS;
81
82 IDropTarget *
83 CreateDropTarget(IN HWND hwndTarget,
84 IN DWORD nSupportedFormats,
85 IN const FORMATETC *Formats OPTIONAL,
86 IN PVOID Context OPTIONAL,
87 IN const DROPTARGET_CALLBACKS *Callbacks OPTIONAL);
88
89 /*
90 * explorer.c
91 */
92
93 LONG
94 SetWindowStyle(IN HWND hWnd,
95 IN LONG dwStyleMask,
96 IN LONG dwStyle);
97
98 LONG
99 SetWindowExStyle(IN HWND hWnd,
100 IN LONG dwStyleMask,
101 IN LONG dwStyle);
102
103 HMENU
104 LoadPopupMenu(IN HINSTANCE hInstance,
105 IN LPCTSTR lpMenuName);
106
107 HMENU
108 FindSubMenu(IN HMENU hMenu,
109 IN UINT uItem,
110 IN BOOL fByPosition);
111
112 BOOL
113 GetCurrentLoggedOnUserName(OUT LPTSTR szBuffer,
114 IN DWORD dwBufferSize);
115
116 BOOL
117 FormatMenuString(IN HMENU hMenu,
118 IN UINT uPosition,
119 IN UINT uFlags,
120 ...);
121
122 BOOL
123 GetExplorerRegValueSet(IN HKEY hKey,
124 IN LPCTSTR lpSubKey,
125 IN LPCTSTR lpValue);
126
127 /*
128 * rshell.c
129 */
130
131 HRESULT WINAPI _CStartMenu_Constructor(REFIID riid, void **ppv);
132 HANDLE WINAPI _SHCreateDesktop(IShellDesktopTray *ShellDesk);
133 BOOL WINAPI _SHDesktopMessageLoop(HANDLE hDesktop);
134 DWORD WINAPI _WinList_Init(void);
135 void WINAPI _ShellDDEInit(BOOL bInit);
136
137 /*
138 * traywnd.c
139 */
140
141 #define TWM_OPENSTARTMENU (WM_USER + 260)
142
143 extern const GUID IID_IShellDesktopTray;
144
145 #define INTERFACE ITrayWindow
146 DECLARE_INTERFACE_(ITrayWindow, IUnknown)
147 {
148 /*** IUnknown methods ***/
149 STDMETHOD_(HRESULT, QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
150 STDMETHOD_(ULONG, AddRef) (THIS) PURE;
151 STDMETHOD_(ULONG, Release) (THIS) PURE;
152 /*** ITrayWindow methods ***/
153 STDMETHOD_(HRESULT, Open) (THIS) PURE;
154 STDMETHOD_(HRESULT, Close) (THIS) PURE;
155 STDMETHOD_(HWND, GetHWND) (THIS) PURE;
156 STDMETHOD_(BOOL, IsSpecialHWND) (THIS_ HWND hWnd) PURE;
157 STDMETHOD_(BOOL, IsHorizontal) (THIS) PURE;
158 STDMETHOD_(HFONT, GetCaptionFonts) (THIS_ HFONT *phBoldCaption) PURE;
159 STDMETHOD_(HWND, DisplayProperties) (THIS) PURE;
160 STDMETHOD_(BOOL, ExecContextMenuCmd) (THIS_ UINT uiCmd) PURE;
161 STDMETHOD_(BOOL, Lock) (THIS_ BOOL bLock) PURE;
162 };
163 #undef INTERFACE
164
165 #if defined(COBJMACROS)
166 /*** IUnknown methods ***/
167 #define ITrayWindow_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
168 #define ITrayWindow_AddRef(p) (p)->lpVtbl->AddRef(p)
169 #define ITrayWindow_Release(p) (p)->lpVtbl->Release(p)
170 /*** ITrayWindow methods ***/
171 #define ITrayWindow_Open(p) (p)->lpVtbl->Open(p)
172 #define ITrayWindow_Close(p) (p)->lpVtbl->Close(p)
173 #define ITrayWindow_GetHWND(p) (p)->lpVtbl->GetHWND(p)
174 #define ITrayWindow_IsSpecialHWND(p,a) (p)->lpVtbl->IsSpecialHWND(p,a)
175 #define ITrayWindow_IsHorizontal(p) (p)->lpVtbl->IsHorizontal(p)
176 #define ITrayWindow_GetCaptionFonts(p,a) (p)->lpVtbl->GetCaptionFonts(p,a)
177 #define ITrayWindow_DisplayProperties(p) (p)->lpVtbl->DisplayProperties(p)
178 #define ITrayWindow_ExecContextMenuCmd(p,a) (p)->lpVtbl->ExecContextMenuCmd(p,a)
179 #define ITrayWindow_Lock(p,a) (p)->lpVtbl->Lock(p,a)
180 #endif
181
182 BOOL
183 RegisterTrayWindowClass(VOID);
184
185 VOID
186 UnregisterTrayWindowClass(VOID);
187
188 HRESULT CreateTrayWindow(ITrayWindow ** ppTray);
189
190 VOID
191 TrayProcessMessages(IN OUT ITrayWindow *Tray);
192
193 VOID
194 TrayMessageLoop(IN OUT ITrayWindow *Tray);
195
196 /*
197 * settings.c
198 */
199
200 /* Structure to hold non-default options*/
201 typedef struct _ADVANCED_SETTINGS
202 {
203 BOOL bShowSeconds;
204 } ADVANCED_SETTINGS, *PADVANCED_SETTINGS;
205
206 extern ADVANCED_SETTINGS AdvancedSettings;
207 extern const TCHAR szAdvancedSettingsKey [];
208
209 VOID
210 LoadAdvancedSettings(VOID);
211
212 BOOL
213 SaveSettingDword(IN PCTSTR pszKeyName,
214 IN PCTSTR pszValueName,
215 IN DWORD dwValue);
216
217 /*
218 * shellservice.cpp
219 */
220 HRESULT InitShellServices(HDPA * phdpa);
221 HRESULT ShutdownShellServices(HDPA hdpa);
222
223 /*
224 * startup.cpp
225 */
226
227 int
228 ProcessStartupItems(VOID);
229
230 /*
231 * trayprop.h
232 */
233
234 VOID
235 DisplayTrayProperties(IN HWND hwndOwner);
236
237 /*
238 * desktop.cpp
239 */
240 HANDLE
241 DesktopCreateWindow(IN OUT ITrayWindow *Tray);
242
243 VOID
244 DesktopDestroyShellWindow(IN HANDLE hDesktop);
245
246 /*
247 * taskband.cpp
248 */
249
250 /* Internal Task Band CLSID */
251 extern const GUID CLSID_ITaskBand;
252
253 #define INTERFACE ITaskBand
254 DECLARE_INTERFACE_(ITaskBand, IUnknown)
255 {
256 /*** IUnknown methods ***/
257 STDMETHOD_(HRESULT, QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
258 STDMETHOD_(ULONG, AddRef) (THIS) PURE;
259 STDMETHOD_(ULONG, Release) (THIS) PURE;
260 /*** ITaskBand methods ***/
261 STDMETHOD_(HRESULT, GetRebarBandID)(THIS_ DWORD *pdwBandID) PURE;
262 };
263 #undef INTERFACE
264
265 #if defined(COBJMACROS)
266 /*** IUnknown methods ***/
267 #define ITaskBand_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
268 #define ITaskBand_AddRef(p) (p)->lpVtbl->AddRef(p)
269 #define ITaskBand_Release(p) (p)->lpVtbl->Release(p)
270 /*** ITaskBand methods ***/
271 #define ITaskBand_GetRebarBandID(p,a) (p)->lpVtbl->GetRebarBandID(p,a)
272 #endif
273
274 ITaskBand *
275 CreateTaskBand(IN OUT ITrayWindow *Tray);
276
277 /*
278 * tbsite.cpp
279 */
280
281 #define INTERFACE ITrayBandSite
282 DECLARE_INTERFACE_(ITrayBandSite, IUnknown)
283 {
284 /*** IUnknown methods ***/
285 STDMETHOD_(HRESULT, QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
286 STDMETHOD_(ULONG, AddRef) (THIS) PURE;
287 STDMETHOD_(ULONG, Release) (THIS) PURE;
288 /*** IBandSiteStreamCallback ***/
289 STDMETHOD_(HRESULT, OnLoad)(THIS_ IStream *pStm, REFIID riid, PVOID *pvObj) PURE;
290 STDMETHOD_(HRESULT, OnSave)(THIS_ IUnknown *pUnk, IStream *pStm) PURE;
291 /*** ITrayBandSite methods ***/
292 STDMETHOD_(HRESULT, IsTaskBand) (THIS_ IUnknown *punk) PURE;
293 STDMETHOD_(HRESULT, ProcessMessage) (THIS_ HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) PURE;
294 STDMETHOD_(HRESULT, AddContextMenus) (THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags, IContextMenu **ppcm) PURE;
295 STDMETHOD_(HRESULT, Lock) (THIS_ BOOL bLock) PURE;
296 };
297 #undef INTERFACE
298
299 #if defined(COBJMACROS)
300 /*** IUnknown methods ***/
301 #define ITrayBandSite_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
302 #define ITrayBandSite_AddRef(p) (p)->lpVtbl->AddRef(p)
303 #define ITrayBandSite_Release(p) (p)->lpVtbl->Release(p)
304 /*** IBandSiteStreamCallback methods ***/
305 #define ITrayBandSite_OnLoad(p,a,b,c) (p)->lpVtbl->OnLoad(p,a,b,c)
306 #define ITrayBandSite_OnSave(p,a,b) (p)->lpVtbl->OnSave(p,a,b)
307 /*** ITrayBandSite methods ***/
308 #define ITrayBandSite_IsTaskBand(p,a) (p)->lpVtbl->IsTaskBand(p,a)
309 #define ITrayBandSite_ProcessMessage(p,a,b,c,d,e) (p)->lpVtbl->ProcessMessage(p,a,b,c,d,e)
310 #define ITrayBandSite_AddContextMenus(p,a,b,c,d,e,f) (p)->lpVtbl->AddContextMenus(p,a,b,c,d,e,f)
311 #define ITrayBandSite_Lock(p,a) (p)->lpVtbl->Lock(p,a)
312 #endif
313
314 ITrayBandSite *
315 CreateTrayBandSite(IN OUT ITrayWindow *Tray,
316 OUT HWND *phWndRebar,
317 OUT HWND *phWndTaskSwitch);
318
319 /*
320 * startmnu.cpp
321 */
322
323 HRESULT StartMenuBtnCtxMenuCreator(ITrayWindow * TrayWnd, IN HWND hWndOwner, IContextMenu ** ppCtxMenu);
324
325 #define INTERFACE IStartMenuSite
326 DECLARE_INTERFACE_(IStartMenuSite, IUnknown)
327 {
328 /*** IUnknown methods ***/
329 STDMETHOD_(HRESULT, QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
330 STDMETHOD_(ULONG, AddRef) (THIS) PURE;
331 STDMETHOD_(ULONG, Release) (THIS) PURE;
332 /*** IStartMenuSite ***/
333 };
334 #undef INTERFACE
335
336 #if defined(COBJMACROS)
337 /*** IUnknown methods ***/
338 #define IStartMenuSite_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
339 #define IStartMenuSite_AddRef(p) (p)->lpVtbl->AddRef(p)
340 #define IStartMenuSite_Release(p) (p)->lpVtbl->Release(p)
341 /*** IStartMenuSite methods ***/
342 #endif
343
344 IMenuPopup*
345 CreateStartMenu(IN ITrayWindow *Tray,
346 OUT IMenuBand **ppMenuBand,
347 IN HBITMAP hbmBanner OPTIONAL,
348 IN BOOL bSmallIcons);
349
350 HRESULT
351 UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
352 IN HBITMAP hbmBanner OPTIONAL,
353 IN BOOL bSmallIcons);
354
355 /*
356 * startmnusite.cpp
357 */
358
359 HRESULT
360 CreateStartMenuSite(IN OUT ITrayWindow *Tray, const IID & riid, PVOID * ppv);
361
362 /*
363 * trayntfy.c
364 */
365
366 /* TrayClockWnd */
367 #define TCWM_GETMINIMUMSIZE (WM_USER + 0x100)
368 #define TCWM_UPDATETIME (WM_USER + 0x101)
369
370 /* TrayNotifyWnd */
371 #define TNWM_GETMINIMUMSIZE (WM_USER + 0x100)
372 #define TNWM_UPDATETIME (WM_USER + 0x101)
373 #define TNWM_SHOWCLOCK (WM_USER + 0x102)
374 #define TNWM_SHOWTRAY (WM_USER + 0x103)
375 #define TNWM_CHANGETRAYPOS (WM_USER + 0x104)
376
377 #define NTNWM_REALIGN (0x1)
378
379 BOOL
380 RegisterTrayNotifyWndClass(VOID);
381
382 VOID
383 UnregisterTrayNotifyWndClass(VOID);
384
385 HWND
386 CreateTrayNotifyWnd(IN OUT ITrayWindow *TrayWindow,
387 IN BOOL bHideClock);
388
389 VOID
390 TrayNotify_NotifyMsg(IN WPARAM wParam,
391 IN LPARAM lParam);
392
393 BOOL
394 TrayNotify_GetClockRect(OUT PRECT rcClock);
395
396 /*
397 * taskswnd.c
398 */
399
400 #define TSWM_ENABLEGROUPING (WM_USER + 1)
401 #define TSWM_UPDATETASKBARPOS (WM_USER + 2)
402
403 BOOL
404 RegisterTaskSwitchWndClass(VOID);
405
406 VOID
407 UnregisterTaskSwitchWndClass(VOID);
408
409 HWND
410 CreateTaskSwitchWnd(IN HWND hWndParent,
411 IN OUT ITrayWindow *Tray);
412
413 HRESULT
414 Tray_OnStartMenuDismissed();
415
416 HRESULT
417 IsSameObject(IN IUnknown *punk1, IN IUnknown *punk2);
418
419 #endif /* _EXPLORER_PRECOMP__H_ */