#ifndef _TRAYREG_H #define _TRAYREG_H #include "dpa.h" #define SZ_TRAYNOTIFY_REGKEY TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\TrayNotify") #define SZ_EXPLORER_REGKEY TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Explorer") #define SZ_AUTOTRAY_REGVALUE TEXT("EnableAutoTray") #define SZ_ITEMSTREAMS_REGVALUE TEXT("IconStreams") #define SZ_ICONSTREAMS_REGVALUE TEXT("PastIconsStream") #define SZ_INFOTIP_REGVALUE TEXT("BalloonTip") #define SZ_ICON_COUNTDOWN_VALUE TEXT("TrayIconResidentInterval") #define SZ_ICONCLEANUP_VALUE TEXT("Icon Cleanup Time") #define SZ_ICONDEMOTE_TIMER_TICK_VALUE TEXT("IconDemoteTimerTick") #define SZ_INFOTIP_TIMER_TICK_VALUE TEXT("InfoTipTimerTick") // Parameters to control the aging algorithm #ifdef FULL_DEBUG #define TT_ICON_COUNTDOWN_INTERVAL 15000 #else #define TT_ICON_COUNTDOWN_INTERVAL 3600000 // 1 hour #endif #define TT_ICONCLEANUP_INTERVAL 6 // 6 months #define TT_ICON_COUNTDOWN_INCREMENT 8*60*60*1000 // 8 hours // Show the Chevron info tip 5 times, once per session for the first 5 sessions, or // until the user clicks on the balloon, whichever comes first. #define MAX_CHEVRON_INFOTIP_SHOWN 5 // Flags decide which user tracking timer to use - the balloon tips or the icons #define TF_ICONDEMOTE_TIMER 1 #define TF_INFOTIP_TIMER 2 // What is the timer interval for the UserEventTimer for each of the timer cases ? // Once every 5 minutes, for the tray items... #define UET_ICONDEMOTE_TIMER_TICK_INTERVAL 300000 // Once every 5 seconds, for balloon tips... #define UET_INFOTIP_TIMER_TICK_INTERVAL 5000 // // header for persistent streams storing the tray notify info // typedef struct tagTNPersistStreamHeader { DWORD dwSize; // Size of the header structure.. DWORD dwVersion; // Version number for the header DWORD dwSignature; // Signature to identify this version of the header DWORD cIcons; // Number of Icons that have been stored in the stream DWORD dwOffset; // Offset to the start of the first icondata in the stream } TNPersistStreamHeader; #define INVALID_IMAGE_INDEX -1 typedef struct tagTNPersistStreamData { TCHAR szExeName[MAX_PATH]; UINT uID; BOOL bDemoted; DWORD dwUserPref; WORD wYear; WORD wMonth; TCHAR szIconText[MAX_PATH]; UINT uNumSeconds; BOOL bStartupIcon; INT nImageIndex; // Index of the image in the Past Items image list. GUID guidItem; } TNPersistStreamData; typedef struct tagTNPersistentIconStreamHeader { DWORD dwSize; // Size of the header structure DWORD dwVersion; // Version number of the header DWORD dwSignature; // This signature must be the same as TNPersistStreamHeader.dwSignature DWORD cIcons; // Number of icons stored in the stream DWORD dwOffset; // Offset into the first item in the stream } TNPersistentIconStreamHeader; #define TNH_VERSION_ONE 1 #define TNH_VERSION_TWO 2 #define TNH_VERSION_THREE 3 #define TNH_VERSION_FOUR 4 #define TNH_VERSION_FIVE 5 #define TNH_SIGNATURE 0x00010001 class CNotificationItem; class CTrayItem; // Any client asking the TrayNotify class for an item passes these flags as one of the // parameters to the callback functions... typedef enum TRAYCBARG { TRAYCBARG_PTI, TRAYCBARG_HICON, TRAYCBARG_ALL } TRAYCBARG; typedef struct TRAYCBRET { CTrayItem * pti; HICON hIcon; } TRAYCBRET; typedef BOOL (CALLBACK * PFNTRAYNOTIFYCALLBACK)(INT_PTR nIndex, void *pCallbackData, TRAYCBARG trayCallbackArg, TRAYCBRET *pOutData); class CTrayItemRegistry { public: CTrayItemRegistry() : _himlPastItemsIconList(NULL) { } ~CTrayItemRegistry() { } void InitRegistryValues(UINT uIconListFlags); void InitTrayItemStream(DWORD dwStreamMode, PFNTRAYNOTIFYCALLBACK pfnTrayNotifyCB, void *pCBData); BOOL GetTrayItem(INT_PTR nIndex, CNotificationItem * pni, BOOL * pbStat); BOOL AddToPastItems(CTrayItem * pti, HICON hIcon); void IncChevronInfoTipShownInRegistry(BOOL bUserClickedInfoTip = FALSE); BOOL SetIsAutoTrayEnabledInRegistry(BOOL bAutoTray); BOOL SetPastItemPreference(LPNOTIFYITEM pNotifyItem); INT_PTR CheckAndRestorePersistentIconSettings(CTrayItem *pti, LPTSTR pszIconToolTip, HICON hIcon); void DeletePastItem(INT_PTR nIndex); int DoesIconExistFromPreviousSession(CTrayItem * pti, LPTSTR pszIconToolTip, HICON hIcon); void Delete() { _dpaPersistentItemInfo.DestroyCallback(_DestroyIconInfoCB, NULL); _DestroyPastItemsIconList(); } int _AddPastIcon(int nImageIndex, HICON hIcon) { if (_himlPastItemsIconList && hIcon) return ImageList_ReplaceIcon(_himlPastItemsIconList, nImageIndex, hIcon); return INVALID_IMAGE_INDEX; } UINT GetTimerTickInterval(int nTimerFlag); public: BOOL ShouldChevronInfoTipBeShown() { return _bShowChevronInfoTip; } // Has the Whistler "Auto" tray been disabled by policy ? BOOL IsNoAutoTrayPolicyEnabled() const { return _fNoAutoTrayPolicyEnabled; } // If not, has the user turned off Whistler "auto" tray policy ? BOOL IsAutoTrayEnabledByUser() const { return _fAutoTrayEnabledByUser; } BOOL IsAutoTrayEnabled() { return (!_fNoAutoTrayPolicyEnabled && _fAutoTrayEnabledByUser); } public: ULONG _uPrimaryCountdown; private: static int _DestroyIconInfoCB(TNPersistStreamData * pData, LPVOID pData2); HRESULT _LoadTrayItemStream(IStream *pstm, PFNTRAYNOTIFYCALLBACK pfnTrayNotifyCB, void *pCBData); HRESULT _SaveTrayItemStream(IStream *pstm, PFNTRAYNOTIFYCALLBACK pfnTrayNotifyCB, void *pCBData); BOOL _FillPersistData(TNPersistStreamData * ptnPersistData, CTrayItem * pti, HICON hIcon); BOOL _IsAutoTrayEnabledInRegistry(); void _QueryRegValue(HKEY hkey, LPTSTR pszValue, ULONG* puVal, ULONG uDefault); void _RestorePersistentIconSettings(TNPersistStreamData * ptnpd, CTrayItem * pti); BOOL _IsValidStreamHeaderVersion(DWORD dwVersion) { return ( (dwVersion == TNH_VERSION_FOUR) || (dwVersion == TNH_VERSION_FIVE) ); } UINT_PTR _SizeOfPersistStreamData(DWORD dwVersion); inline void _DestroyPastItemsIconList() { if (_himlPastItemsIconList) { ImageList_Destroy(_himlPastItemsIconList); _himlPastItemsIconList = NULL; } } BOOL _IsIconLastUseValid(WORD wYear, WORD wMonth); BOOL _SaveIconsToRegStream(); BOOL _LoadIconsFromRegStream(DWORD dwItemStreamSignature); void UpdateImageIndices(INT_PTR nDeletedImageIndex); // // Persistent Icon information... // CDPA _dpaPersistentItemInfo; DWORD _dwTimesChevronInfoTipShown; BOOL _bShowChevronInfoTip; ULONG _uValidLastUseTimePeriod; // We store this policy in a local cache, since we do not support settings // changes during the session. At logon, the settings are renewed, and if the // settings change during the session, they dont take effect, until the user // has logged off and logged back on to a different session. // This policy states that the tray should function like the Windows 2000 tray, // and disables all "smart" functionality like aging, and advanced balloon // tips. BOOL _fNoAutoTrayPolicyEnabled; // This variable dictates the current setting of the tray, since the user is // allowed to specify if he wants the Windows 2000 tray, or the Whistler // auto-tray. BOOL _fAutoTrayEnabledByUser; HIMAGELIST _himlPastItemsIconList; ULONG _uIconDemoteTimerTickInterval; ULONG _uInfoTipTimerTickInterval; }; #endif // _TRAYREG_H