#ifndef _TRAYNOT_H #define _TRAYNOT_H #include "cwndproc.h" #include #include "dpa.h" #include "traycmn.h" #include "trayitem.h" #include "trayreg.h" #define TNM_GETCLOCK (WM_USER + 1) #define TNM_HIDECLOCK (WM_USER + 2) #define TNM_TRAYHIDE (WM_USER + 3) #define TNM_TRAYPOSCHANGED (WM_USER + 4) #define TNM_ASYNCINFOTIP (WM_USER + 5) #define TNM_ASYNCINFOTIPPOS (WM_USER + 6) #define TNM_RUDEAPP (WM_USER + 7) #define TNM_SAVESTATE (WM_USER + 8) #define TNM_NOTIFY (WM_USER + 9) #define TNM_STARTUPAPPSLAUNCHED (WM_USER + 10) #define TNM_ENABLEUSERTRACKINGINFOTIPS (WM_USER + 11) #define TNM_BANGICONMESSAGE (WM_USER + 50) #define TNM_ICONDEMOTETIMER (WM_USER + 61) #define TNM_INFOTIPTIMER (WM_USER + 62) #define TNM_UPDATEVERTICAL (WM_USER + 63) #define TNM_WORKSTATIONLOCKED (WM_USER + 64) #define TNM_SHOWTRAYBALLOON (WM_USER + 90) #define UID_CHEVRONBUTTON (-1) typedef struct { HWND hWnd; UINT uID; TCHAR szTitle[64]; TCHAR szInfo[256]; UINT uTimeout; DWORD dwInfoFlags; } TNINFOITEM; // // For Win64 compat, the icon and hwnd are handed around as DWORDs // (so they won't change size as they travel between 32-bit and // 64-bit processes). // #define GetHIcon(pnid) ((HICON)ULongToPtr(pnid->dwIcon)) #define GetHWnd(pnid) ((HWND)ULongToPtr(pnid->dwWnd)) // Everybody has a copy of this function, so we will too! STDAPI_(void) ExplorerPlaySound(LPCTSTR pszSound); // defined in tray.cpp extern BOOL IsPosInHwnd(LPARAM lParam, HWND hwnd); // defined in taskband.cpp extern BOOL ToolBar_IsVisible(HWND hwndToolBar, int iIndex); typedef enum TRAYEVENT { TRAYEVENT_ONICONHIDE, TRAYEVENT_ONICONUNHIDE, TRAYEVENT_ONICONMODIFY, TRAYEVENT_ONITEMCLICK, TRAYEVENT_ONINFOTIP, TRAYEVENT_ONNEWITEMINSERT, TRAYEVENT_ONAPPLYUSERPREF, TRAYEVENT_ONDISABLEAUTOTRAY, TRAYEVENT_ONICONDEMOTETIMER, } TRAYEVENT; typedef enum TRAYITEMPOS { TIPOS_DEMOTED, TIPOS_PROMOTED, TIPOS_ALWAYS_DEMOTED, TIPOS_ALWAYS_PROMOTED, TIPOS_HIDDEN, TIPOS_STATUSQUO, } TRAYITEMPOS; typedef enum LASTINFOTIPSTATUS { LITS_BALLOONNONE, LITS_BALLOONDESTROYED, LITS_BALLOONXCLICKED } LASTINFOTIPSTATUS; typedef enum BALLOONEVENT { BALLOONEVENT_USERLEFTCLICK, BALLOONEVENT_USERRIGHTCLICK, BALLOONEVENT_USERXCLICK, BALLOONEVENT_TIMEOUT, BALLOONEVENT_NONE, BALLOONEVENT_APPDEMOTE, BALLOONEVENT_BALLOONHIDE } BALLOONEVENT; class CTrayNotify; // forward declaration... // // CTrayNotify class members // class CTrayNotify : public CImpWndProc { public: CTrayNotify() {}; virtual ~CTrayNotify() {}; // *** IUnknown methods *** STDMETHODIMP_(ULONG) AddRef(); STDMETHODIMP_(ULONG) Release(); // *** ITrayNotify methods, which are called from the CTrayNotifyStub *** STDMETHODIMP SetPreference(LPNOTIFYITEM pNotifyItem); STDMETHODIMP RegisterCallback(INotificationCB* pNotifyCB); STDMETHODIMP EnableAutoTray(BOOL bTraySetting); // *** Properties Sheet methods *** BOOL GetIsNoTrayItemsDisplayPolicyEnabled() const { return _fNoTrayItemsDisplayPolicyEnabled; } BOOL GetIsNoAutoTrayPolicyEnabled() const { return m_TrayItemRegistry.IsNoAutoTrayPolicyEnabled(); } BOOL GetIsAutoTrayEnabledByUser() const { return m_TrayItemRegistry.IsAutoTrayEnabledByUser(); } // *** Other *** HWND TrayNotifyCreate(HWND hwndParent, UINT uID, HINSTANCE hInst); LRESULT TrayNotify(HWND hwndTray, HWND hwndFrom, PCOPYDATASTRUCT pcds, BOOL *pbRefresh); protected: static BOOL GetTrayItemCB(INT_PTR nIndex, void *pCallbackData, TRAYCBARG trayCallbackArg, TRAYCBRET * pOutData); void _TickleForTooltip(CNotificationItem *pni); void _UpdateChevronSize(); void _UpdateChevronState(BOOL fBangMenuOpen, BOOL fTrayOrientationChanged, BOOL fUpdateDemotedItems); void _UpdateVertical(BOOL fVertical); void _OpenTheme(); void _OnSizeChanged(BOOL fForceRepaint); // Tray Animation functions DWORD _GetStepTime(int iStep, int cSteps); void _ToggleDemotedMenu(); void _BlankButtons(int iPos, int iNumberOfButtons, BOOL fAddButtons); void _AnimateButtons(int iIndex, DWORD dwSleep, int iNumberItems, BOOL fGrow); BOOL _SetRedraw(BOOL fRedraw); // Tray Icon Activation functions void _HideAllDemotedItems(BOOL bHide); BOOL _UpdateTrayItems(BOOL bUpdateDemotedItems); BOOL _PlaceItem(INT_PTR nIcon, CTrayItem * pti, TRAYEVENT tTrayEvent); TRAYITEMPOS _TrayItemPos(CTrayItem * pti, TRAYEVENT tTrayEvent, BOOL *bDemoteStatusChange); void _SetOrKillIconDemoteTimer(CTrayItem * pti, TRAYITEMPOS tiPos); // WndProc callback functions LRESULT v_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); // Callback for the chevron button static LRESULT CALLBACK ChevronSubClassWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData); // Callback for the toolbar static LRESULT CALLBACK s_ToolbarWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwRefData); // Icon Image-related functions void _RemoveImage(UINT uIMLIndex); BOOL _CheckAndResizeImages(); // InfoTip/Balloon tip functions void _ActivateTips(BOOL bActivate); void _InfoTipMouseClick(int x, int y, BOOL bRightMouseButtonClick); void _PositionInfoTip(); DWORD _ShowBalloonTip(LPTSTR szTitle, DWORD dwInfoFlags, UINT uTimeout, DWORD dwLastSoundTime); void _SetInfoTip(HWND hWnd, UINT uID, LPTSTR pszInfo, LPTSTR pszInfoTitle, DWORD dwInfoFlags, UINT uTimeout, BOOL bAsync); void _ShowInfoTip(HWND hwnd, UINT uID, BOOL bShow, BOOL bAsync, UINT uReason); void _ShowChevronInfoTip(); void _EmptyInfoTipQueue(); void _HideBalloonTip(); DWORD _GetBalloonWaitInterval(BALLOONEVENT be); void _DisableCurrentInfoTip(CTrayItem * ptiTemp, UINT uReason, BOOL bBalloonShowing); void _RemoveInfoTipFromQueue(HWND hWnd, UINT uID, BOOL bRemoveFirstOnly = FALSE); BOOL _CanShowBalloon(); BOOL _CanActivateTips() { return (!_fInfoTipShowing && !_fItemClicked); } BOOL _IsChevronInfoTip(HWND hwnd, UINT uID) { return (hwnd == _hwndNotify && uID == UID_CHEVRONBUTTON); } void _OnWorkStationLocked(BOOL bLocked); void _OnRudeApp(BOOL bRudeApp); // Toolbar Notification helper functions - respond to different user messages BOOL _InsertNotify(PNOTIFYICONDATA32 pnid); BOOL _DeleteNotify(INT_PTR nIcon, BOOL bShutdown, BOOL bShouldSaveIcon); BOOL _ModifyNotify(PNOTIFYICONDATA32 pnid, INT_PTR nIcon, BOOL *pbRefresh, BOOL bFirstTime); BOOL _SetVersionNotify(PNOTIFYICONDATA32 pnid, INT_PTR nIcon); LRESULT _SendNotify(CTrayItem *pti, UINT uMsg); void _SetToolbarHotItem(HWND hWndToolbar, UINT nToolbarIcon); INT_PTR _GetToolbarFirstVisibleItem(HWND hWndToolbar, BOOL bFromLast); void _NotifyCallback(DWORD dwMessage, INT_PTR nCurrentItem, INT_PTR nPastItem); void _SetCursorPos(INT_PTR i); // Tray registry setting-related functions void _ToggleTrayItems(BOOL bEnable); // Initialization/Destroy functions LRESULT _Create(HWND hWnd); LRESULT _Destroy(); // Tray repainting helpers LRESULT _Paint(HDC hdc); LRESULT _HandleCustomDraw(LPNMCUSTOMDRAW pcd); void _SizeWindows(int nMaxHorz, int nMaxVert, LPRECT prcTotal, BOOL fSizeWindows); LRESULT _CalcMinSize(int nMaxHorz, int nMaxVert); LRESULT _Size(); // Timer/Timer message handling functions void _OnInfoTipTimer(); LRESULT _OnTimer(UINT_PTR uTimerID); void _OnIconDemoteTimer(WPARAM wParam, LPARAM lParam); // Various Message handles LRESULT _OnMouseEvent(UINT uMsg, WPARAM wParam, LPARAM lParam); LRESULT _OnCDNotify(LPNMTBCUSTOMDRAW pnm); LRESULT _Notify(LPNMHDR pNmhdr); void _OnSysChange(UINT uMsg, WPARAM wParam, LPARAM lParam); void _OnCommand(UINT id, UINT uCmd); BOOL _TrayNotifyIcon(PTRAYNOTIFYDATA pnid, BOOL *pbRefresh); // User Event Timer functions HRESULT _SetItemTimer(CTrayItem *pti); HRESULT _KillItemTimer(CTrayItem *pti); IUserEventTimer * _CreateTimer(int nTimerFlag); HRESULT _SetTimer(int nTimerFlag, UINT uCallbackMessage, UINT uTimerInterval, ULONG * puTimerID); HRESULT _KillTimer(int nTimerFlag, ULONG uTimerID); BOOL _ShouldDestroyTimer(int nTimerFlag); UINT _GetAccumulatedTime(CTrayItem * pti); void _NullifyTimer(int nTimerFlag); LRESULT _OnKeyDown(WPARAM wChar, LPARAM lFlags); void _SetUsedTime(); #ifdef DEBUG void _TestNotify(); #endif static const TCHAR c_szTrayNotify[] ; static const WCHAR c_wzTrayNotifyTheme[]; static const WCHAR c_wzTrayNotifyHorizTheme[]; static const WCHAR c_wzTrayNotifyVertTheme[]; static const WCHAR c_wzTrayNotifyHorizOpenTheme[]; static const WCHAR c_wzTrayNotifyVertOpenTheme[]; private: // Helper/Utility functions BOOL _IsScreenSaverRunning(); UINT _GetQueueCount(); LONG m_cRef; HWND _hwndNotify; HWND _hwndChevron; HWND _hwndToolbar; HWND _hwndClock; HWND _hwndPager; HWND _hwndInfoTip; HWND _hwndChevronToolTip; HWND _hwndToolbarInfoTip; TCHAR _szExplorerExeName[MAX_PATH]; TCHAR * _pszCurrentThreadDesktopName; HIMAGELIST _himlIcons; CTrayItemManager m_TrayItemManager; CTrayItemRegistry m_TrayItemRegistry; BOOL _fKey; BOOL _fReturn; BOOL _fBangMenuOpen; BOOL _fHaveDemoted; BOOL _fAnimating; BOOL _fAnimateMenuOpen; BOOL _fRedraw; BOOL _fRepaint; BOOL _fChevronSelected; BOOL _fNoTrayItemsDisplayPolicyEnabled; BOOL _fHasFocus; RECT _rcAnimateTotal; RECT _rcAnimateCurrent; // // Timer for icon info tips.. // ULONG _uInfoTipTimer; TNINFOITEM *_pinfo; // current balloon being shown CDPA _dpaInfo; BOOL _fInfoTipShowing; BOOL _fItemClicked; BOOL _fEnableUserTrackedInfoTips; HTHEME _hTheme; int _nMaxHorz; int _nMaxVert; // command id of the icon which last received a single down-click int _idMouseActiveIcon; INotificationCB * _pNotifyCB; IUserEventTimer * m_pIconDemoteTimer; IUserEventTimer * m_pInfoTipTimer; BOOL _fVertical; SIZE _szChevron; BOOL _bStartupIcon; BOOL _bWorkStationLocked; BOOL _bRudeAppLaunched; // Includes screensaver... BOOL _bWaitAfterRudeAppHide; LASTINFOTIPSTATUS _litsLastInfoTip; BOOL _bWaitingBetweenBalloons; BOOL _bStartMenuAllowsTrayBalloon; BALLOONEVENT _beLastBalloonEvent; }; #endif // _TRAYNOT_H