Reactos
at master 407 lines 11 kB view raw
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_ */