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