Reactos
1#ifndef _EXPLORER_PRECOMP__H_
2#define _EXPLORER_PRECOMP__H_
3
4#define WIN7_COMPAT_MODE 0
5#define WIN7_DEBUG_MODE 0
6
7#if WIN7_DEBUG_MODE && !WIN7_COMPAT_MODE
8#undef WIN7_COMPAT_MODE
9#define WIN7_COMPAT_MODE 1
10#endif
11
12#include <stdio.h>
13#include <tchar.h>
14
15#define WIN32_NO_STATUS
16#define _INC_WINDOWS
17#define COM_NO_WINDOWS_H
18
19#define COBJMACROS
20#define OEMRESOURCE
21
22#include <windef.h>
23#include <winbase.h>
24#include <winreg.h>
25#include <wingdi.h>
26#include <winnls.h>
27#include <wincon.h>
28#include <atlbase.h>
29#include <atlcom.h>
30#include <atlwin.h>
31#include <atlstr.h>
32#include <atlcoll.h>
33#include <atlsimpcoll.h>
34#include <shellapi.h>
35#include <shlobj.h>
36#include <shlwapi.h>
37#include <uxtheme.h>
38#include <process.h>
39#include <strsafe.h>
40
41#include <undocuser.h>
42#include <shlwapi_undoc.h>
43#include <shlobj_undoc.h>
44#include <shlguid_undoc.h>
45#include <shdocvw_undoc.h>
46#include <undocshell.h>
47
48#include <ui/rosctrls.h>
49#include <ui/rosdlgs.h>
50#include <shellutils.h>
51
52#include "tmschema.h"
53#include "resource.h"
54
55#include <wine/debug.h>
56
57WINE_DEFAULT_DEBUG_CHANNEL(explorernew);
58
59#define ASSERT(cond) \
60 do if (!(cond)) { \
61 Win32DbgPrint(__FILE__, __LINE__, "ASSERTION %s FAILED!\n", #cond); \
62 } while (0)
63
64extern HINSTANCE hExplorerInstance;
65extern HANDLE hProcessHeap;
66extern HKEY hkExplorer;
67extern BOOL bExplorerIsShell;
68
69/*
70 * explorer.c
71 */
72
73static inline
74LONG
75SetWindowStyle(IN HWND hWnd,
76 IN LONG dwStyleMask,
77 IN LONG dwStyle)
78{
79 return SHSetWindowBits(hWnd, GWL_STYLE, dwStyleMask, dwStyle);
80}
81
82static inline
83LONG
84SetWindowExStyle(IN HWND hWnd,
85 IN LONG dwStyleMask,
86 IN LONG dwStyle)
87{
88 return SHSetWindowBits(hWnd, GWL_EXSTYLE, dwStyleMask, dwStyle);
89}
90
91HMENU
92LoadPopupMenu(IN HINSTANCE hInstance,
93 IN LPCWSTR lpMenuName);
94
95HMENU
96FindSubMenu(IN HMENU hMenu,
97 IN UINT uItem,
98 IN BOOL fByPosition);
99
100BOOL
101GetCurrentLoggedOnUserName(OUT LPWSTR szBuffer,
102 IN DWORD dwBufferSize);
103
104BOOL
105FormatMenuString(IN HMENU hMenu,
106 IN UINT uPosition,
107 IN UINT uFlags,
108 ...);
109
110BOOL GetRegValue(IN LPCWSTR pszSubKey, IN LPCWSTR pszValueName, IN BOOL bDefaultValue);
111BOOL SetRegDword(IN LPCWSTR pszSubKey, IN LPCWSTR pszValueName, IN DWORD dwValue);
112BOOL GetAdvancedBool(IN LPCWSTR pszValueName, IN BOOL bDefaultValue);
113BOOL SetAdvancedDword(IN LPCWSTR pszValueName, IN DWORD dwValue);
114
115/*
116 * rshell.c
117 */
118
119VOID InitRSHELL(VOID);
120HRESULT WINAPI _CStartMenu_CreateInstance(REFIID riid, void **ppv);
121HANDLE WINAPI _SHCreateDesktop(IShellDesktopTray *ShellDesk);
122BOOL WINAPI _SHDesktopMessageLoop(HANDLE hDesktop);
123BOOL WINAPI _WinList_Init(void);
124void WINAPI _ShellDDEInit(BOOL bInit);
125HRESULT WINAPI _CBandSiteMenu_CreateInstance(REFIID riid, void **ppv);
126HRESULT WINAPI _CBandSite_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **ppv);
127
128/*
129 * traywnd.c
130 */
131
132#define TWM_GETTASKSWITCH (WM_USER + 236)
133#define TWM_OPENSTARTMENU (WM_USER + 260)
134#define TWM_SETTINGSCHANGED (WM_USER + 300)
135#define TWM_SETZORDER (WM_USER + 338)
136
137extern const GUID IID_IShellDesktopTray;
138
139#define INTERFACE ITrayWindow
140DECLARE_INTERFACE_(ITrayWindow, IUnknown)
141{
142 /*** IUnknown methods ***/
143 STDMETHOD_(HRESULT, QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
144 STDMETHOD_(ULONG, AddRef) (THIS) PURE;
145 STDMETHOD_(ULONG, Release) (THIS) PURE;
146 /*** ITrayWindow methods ***/
147 STDMETHOD_(HRESULT, Open) (THIS) PURE;
148 STDMETHOD_(HRESULT, Close) (THIS) PURE;
149 STDMETHOD_(HWND, GetHWND) (THIS) PURE;
150 STDMETHOD_(BOOL, IsSpecialHWND) (THIS_ HWND hWnd) PURE;
151 STDMETHOD_(BOOL, IsHorizontal) (THIS) PURE;
152 STDMETHOD_(HWND, DisplayProperties) (THIS) PURE;
153 STDMETHOD_(BOOL, ExecContextMenuCmd) (THIS_ UINT uiCmd) PURE;
154 STDMETHOD_(BOOL, Lock) (THIS_ BOOL bLock) PURE;
155 STDMETHOD_(BOOL, IsTaskWnd) (THIS_ HWND hWnd) PURE;
156 STDMETHOD_(HRESULT, NotifyFullScreenToAppBars)(THIS_ HMONITOR hMonitor, BOOL bFullOpening) PURE;
157};
158#undef INTERFACE
159
160#if defined(COBJMACROS)
161/*** IUnknown methods ***/
162#define ITrayWindow_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
163#define ITrayWindow_AddRef(p) (p)->lpVtbl->AddRef(p)
164#define ITrayWindow_Release(p) (p)->lpVtbl->Release(p)
165/*** ITrayWindow methods ***/
166#define ITrayWindow_Open(p) (p)->lpVtbl->Open(p)
167#define ITrayWindow_Close(p) (p)->lpVtbl->Close(p)
168#define ITrayWindow_GetHWND(p) (p)->lpVtbl->GetHWND(p)
169#define ITrayWindow_IsSpecialHWND(p,a) (p)->lpVtbl->IsSpecialHWND(p,a)
170#define ITrayWindow_IsHorizontal(p) (p)->lpVtbl->IsHorizontal(p)
171#define ITrayWindow_DisplayProperties(p) (p)->lpVtbl->DisplayProperties(p)
172#define ITrayWindow_ExecContextMenuCmd(p,a) (p)->lpVtbl->ExecContextMenuCmd(p,a)
173#define ITrayWindow_Lock(p,a) (p)->lpVtbl->Lock(p,a)
174#define ITrayWindow_IsTaskWnd(p,a) (p)->lpVtbl->IsTaskWnd(p,a)
175#define ITrayWindow_NotifyFullScreenToAppBars(p,a,b) (p)->lpVtbl->NotifyFullScreenToAppBars(p,a,b)
176#endif
177
178HRESULT CreateTrayWindow(ITrayWindow ** ppTray);
179
180VOID
181TrayProcessMessages(IN OUT ITrayWindow *Tray);
182
183VOID
184TrayMessageLoop(IN OUT ITrayWindow *Tray);
185
186/*
187 * settings.c
188 */
189
190enum TrayIconsMode
191{
192 TIM_Default,
193 TIM_NeverCompact,
194 TIM_AlwaysCompact,
195 TIM_Max = TIM_AlwaysCompact
196};
197
198typedef struct _TW_STUCKRECTS2
199{
200 DWORD cbSize;
201 LONG Unknown;
202 union
203 {
204 DWORD dwFlags;
205 struct
206 {
207 DWORD AutoHide : 1;
208 DWORD AlwaysOnTop : 1;
209 DWORD SmSmallIcons : 1; // Start menu Small Icons
210 DWORD HideClock : 1;
211 };
212 };
213 DWORD Position;
214 SIZE Size;
215 RECT Rect;
216} TW_STRUCKRECTS2, *PTW_STUCKRECTS2;
217
218struct TaskbarSettings
219{
220 BOOL bLock;
221 BOOL bGroupButtons;
222 BOOL bShowSeconds;
223 BOOL bPreferDate;
224 BOOL bHideInactiveIcons;
225 BOOL bSmallIcons;
226 TrayIconsMode eCompactTrayIcons;
227 BOOL bShowDesktopButton;
228 TW_STRUCKRECTS2 sr;
229
230 BOOL Load();
231 BOOL Save();
232 inline BOOL UseCompactTrayIcons()
233 {
234 switch (eCompactTrayIcons)
235 {
236 case TIM_NeverCompact:
237 return FALSE;
238 case TIM_AlwaysCompact:
239 return TRUE;
240 default:
241 return bSmallIcons;
242 }
243 }
244};
245
246extern TaskbarSettings g_TaskbarSettings;
247
248/*
249 * shellservice.cpp
250 */
251HRESULT InitShellServices(HDPA * phdpa);
252HRESULT ShutdownShellServices(HDPA hdpa);
253
254/*
255 * startup.cpp
256 */
257
258VOID ReleaseStartupMutex();
259VOID ProcessRunOnceItems();
260BOOL DoStartStartupItems(ITrayWindow *Tray);
261INT ProcessStartupItems(BOOL bRunOnce);
262static inline INT ProcessStartupItems() { return ProcessStartupItems(FALSE); }
263static inline VOID DoFinishStartupItems() { ReleaseStartupMutex(); }
264
265/*
266 * trayprop.h
267 */
268
269VOID
270DisplayTrayProperties(IN HWND hwndOwner, IN HWND hwndTaskbar);
271
272/*
273 * desktop.cpp
274 */
275HANDLE
276DesktopCreateWindow(IN OUT ITrayWindow *Tray);
277
278VOID
279DesktopDestroyShellWindow(IN HANDLE hDesktop);
280
281
282/*
283 * notifyiconscust.cpp
284 */
285VOID
286ShowCustomizeNotifyIcons(HINSTANCE, HWND);
287
288/*
289 * taskband.cpp
290 */
291
292extern const GUID CLSID_ITaskBand; /* Internal Task Band CLSID */
293HRESULT CTaskBand_CreateInstance(IN ITrayWindow *Tray, HWND hWndStartButton, REFIID riid, void **ppv);
294
295/*
296 * tbsite.cpp
297 */
298
299#define INTERFACE ITrayBandSite
300DECLARE_INTERFACE_(ITrayBandSite, IUnknown)
301{
302 /*** IUnknown methods ***/
303 STDMETHOD_(HRESULT, QueryInterface) (THIS_ REFIID riid, void** ppvObject) PURE;
304 STDMETHOD_(ULONG, AddRef) (THIS) PURE;
305 STDMETHOD_(ULONG, Release) (THIS) PURE;
306 /*** IBandSiteStreamCallback ***/
307 STDMETHOD_(HRESULT, OnLoad)(THIS_ IStream *pStm, REFIID riid, PVOID *pvObj) PURE;
308 STDMETHOD_(HRESULT, OnSave)(THIS_ IUnknown *pUnk, IStream *pStm) PURE;
309 /*** ITrayBandSite methods ***/
310 STDMETHOD_(HRESULT, IsTaskBand) (THIS_ IUnknown *punk) PURE;
311 STDMETHOD_(HRESULT, ProcessMessage) (THIS_ HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *plResult) PURE;
312 STDMETHOD_(HRESULT, AddContextMenus) (THIS_ HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags, IContextMenu **ppcm) PURE;
313 STDMETHOD_(HRESULT, Lock) (THIS_ BOOL bLock) PURE;
314};
315#undef INTERFACE
316
317#if defined(COBJMACROS)
318/*** IUnknown methods ***/
319#define ITrayBandSite_QueryInterface(p,a,b) (p)->lpVtbl->QueryInterface(p,a,b)
320#define ITrayBandSite_AddRef(p) (p)->lpVtbl->AddRef(p)
321#define ITrayBandSite_Release(p) (p)->lpVtbl->Release(p)
322/*** IBandSiteStreamCallback methods ***/
323#define ITrayBandSite_OnLoad(p,a,b,c) (p)->lpVtbl->OnLoad(p,a,b,c)
324#define ITrayBandSite_OnSave(p,a,b) (p)->lpVtbl->OnSave(p,a,b)
325/*** ITrayBandSite methods ***/
326#define ITrayBandSite_IsTaskBand(p,a) (p)->lpVtbl->IsTaskBand(p,a)
327#define ITrayBandSite_ProcessMessage(p,a,b,c,d,e) (p)->lpVtbl->ProcessMessage(p,a,b,c,d,e)
328#define ITrayBandSite_AddContextMenus(p,a,b,c,d,e,f) (p)->lpVtbl->AddContextMenus(p,a,b,c,d,e,f)
329#define ITrayBandSite_Lock(p,a) (p)->lpVtbl->Lock(p,a)
330#endif
331
332HRESULT CTrayBandSite_CreateInstance(IN ITrayWindow *tray, IN IDeskBand* pTaskBand, OUT ITrayBandSite** pBandSite);
333
334/*
335 * startctxmnu.cpp
336 */
337HRESULT CStartMenuBtnCtxMenu_CreateInstance(ITrayWindow * TrayWnd, IN HWND hWndOwner, IContextMenu ** ppCtxMenu);
338
339/*
340 * startmnu.cpp
341 */
342IMenuPopup*
343CreateStartMenu(IN ITrayWindow *Tray,
344 OUT IMenuBand **ppMenuBand,
345 IN HBITMAP hbmBanner OPTIONAL,
346 IN BOOL bSmallIcons);
347HRESULT
348UpdateStartMenu(IN OUT IMenuPopup *pMenuPopup,
349 IN HBITMAP hbmBanner OPTIONAL,
350 IN BOOL bSmallIcons,
351 IN BOOL bRefresh);
352
353/*
354 * startmnucust.cpp
355 */
356VOID
357ShowCustomizeClassic(HINSTANCE, HWND);
358VOID
359ClearRecentAndMru();
360
361/*
362* startmnusite.cpp
363*/
364HRESULT
365CStartMenuSite_CreateInstance(IN OUT ITrayWindow *Tray, const IID & riid, PVOID * ppv);
366
367/*
368 * trayntfy.c
369 */
370
371/* TrayClockWnd */
372HRESULT CTrayClockWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv);
373
374static inline BOOL GetHideClock()
375{
376 return g_TaskbarSettings.sr.HideClock || SHRestricted(REST_HIDECLOCK);
377}
378
379/* TrayNotifyWnd */
380#define TNWM_GETMINIMUMSIZE (WM_USER + 0x100)
381#define TNWM_CHANGETRAYPOS (WM_USER + 0x104)
382#define TNWM_GETSHOWDESKTOPBUTTON (WM_USER + 0x7601)
383
384#define NTNWM_REALIGN (0x1)
385
386HRESULT CTrayNotifyWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv);
387
388/* SysPagerWnd */
389HRESULT CSysPagerWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv);
390
391#include "traydeskbtn.h"
392
393/*
394 * taskswnd.c
395 */
396
397#define TSWM_UPDATETASKBARPOS (WM_USER + 2)
398
399HRESULT CTaskSwitchWnd_CreateInstance(IN HWND hWndParent, IN OUT ITrayWindow *Tray, REFIID riid, void **ppv);
400
401HRESULT
402Tray_OnStartMenuDismissed(ITrayWindow* Tray);
403
404HRESULT
405IsSameObject(IN IUnknown *punk1, IN IUnknown *punk2);
406
407#endif /* _EXPLORER_PRECOMP__H_ */