windows-nt/Source/XPSP1/NT/shell/explorer/trayreg.h
2020-09-26 16:20:57 +08:00

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