244 lines
8.4 KiB
C
244 lines
8.4 KiB
C
|
#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<TNPersistStreamData> _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
|
||
|
|