336 lines
12 KiB
C++
336 lines
12 KiB
C++
#ifndef TASKBAND_H_
|
|
#define TASKBAND_H_
|
|
|
|
#ifdef __cplusplus
|
|
|
|
#include "atlstuff.h"
|
|
#include "cwndproc.h"
|
|
#include <dpa.h>
|
|
#include "commoncontrols.h"
|
|
|
|
class CTray;
|
|
class CGroupItemContextMenu;
|
|
|
|
class TASKITEM
|
|
{
|
|
public:
|
|
TASKITEM() {};
|
|
TASKITEM(TASKITEM* pti);
|
|
~TASKITEM();
|
|
HWND hwnd; // NULL if this item is a group of application entries
|
|
DWORD dwFlags;
|
|
class TaskShortcut *ptsh;
|
|
DWORD dwTimeLastClicked;
|
|
DWORD dwTimeFirstOpened;
|
|
WCHAR* pszExeName;
|
|
int iIconPref;
|
|
BOOL fMarkedFullscreen;
|
|
BOOL fHungApp;
|
|
};
|
|
|
|
typedef TASKITEM *PTASKITEM;
|
|
|
|
typedef struct
|
|
{
|
|
PTASKITEM pti;
|
|
UINT fState;
|
|
int iIndex; // used to cache toolbar index
|
|
}
|
|
ANIMATIONITEMINFO, *PANIMATIONITEMINFO;
|
|
|
|
class CTaskBandSMC;
|
|
|
|
class CTaskBand : public IDeskBand
|
|
, public IObjectWithSite
|
|
, public IDropTarget
|
|
, public IInputObject
|
|
, public IPersistStream
|
|
, public IWinEventHandler
|
|
, public IOleCommandTarget
|
|
, public CImpWndProc
|
|
{
|
|
public:
|
|
// *** IUnknown methods ***
|
|
STDMETHODIMP QueryInterface(REFIID riid, LPVOID * ppvObj);
|
|
STDMETHODIMP_(ULONG) AddRef();
|
|
STDMETHODIMP_(ULONG) Release();
|
|
|
|
// *** IOleWindow methods ***
|
|
STDMETHODIMP GetWindow(HWND * lphwnd);
|
|
STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) { return E_NOTIMPL; }
|
|
|
|
// *** IDockingWindow methods ***
|
|
STDMETHODIMP ShowDW(BOOL fShow) { return S_OK; }
|
|
STDMETHODIMP CloseDW(DWORD dwReserved) { return S_OK; }
|
|
STDMETHODIMP ResizeBorderDW(LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved) { return E_NOTIMPL; }
|
|
|
|
// *** IObjectWithSite methods ***
|
|
STDMETHODIMP SetSite(IUnknown* punkSite);
|
|
STDMETHODIMP GetSite(REFIID riid, void** ppvSite) { return E_NOTIMPL; };
|
|
|
|
// *** IDeskBand methods ***
|
|
STDMETHODIMP GetBandInfo(DWORD dwBandID, DWORD fViewMode, DESKBANDINFO* pdbi);
|
|
|
|
// *** IDropTarget methods ***
|
|
STDMETHODIMP DragEnter(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
|
|
STDMETHODIMP DragOver(DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
|
|
STDMETHODIMP DragLeave(void);
|
|
STDMETHODIMP Drop(IDataObject *pdtobj, DWORD grfKeyState, POINTL pt, DWORD *pdwEffect);
|
|
|
|
// *** IInputObject methods ***
|
|
STDMETHODIMP TranslateAcceleratorIO(LPMSG lpMsg) { return E_NOTIMPL; }
|
|
STDMETHODIMP HasFocusIO();
|
|
STDMETHODIMP UIActivateIO(BOOL fActivate, LPMSG lpMsg);
|
|
|
|
// *** IWinEventHandler methods ***
|
|
STDMETHODIMP OnWinEvent(HWND hwnd, UINT dwMsg, WPARAM wParam, LPARAM lParam, LRESULT* plres);
|
|
STDMETHODIMP IsWindowOwner(HWND hwnd);
|
|
|
|
// *** IPersistStream methods ***
|
|
STDMETHODIMP GetClassID(LPCLSID pClassID);
|
|
STDMETHODIMP IsDirty(void) { return S_FALSE; }
|
|
STDMETHODIMP Load(IStream *ps);
|
|
STDMETHODIMP Save(LPSTREAM, BOOL) { return S_OK; }
|
|
STDMETHODIMP GetSizeMax(ULARGE_INTEGER*) { return E_NOTIMPL; }
|
|
|
|
// *** IOleCommandTarget methods ***
|
|
STDMETHODIMP QueryStatus(const GUID *pguidCmdGroup, ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
|
|
STDMETHODIMP Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCmdexecopt, VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
|
|
|
|
protected:
|
|
static void IconAsyncProc(HWND hwnd, UINT uMsg, ULONG_PTR dwData, LRESULT lResult);
|
|
|
|
typedef struct
|
|
{
|
|
HWND hwnd;
|
|
LPTSTR pszExeName;
|
|
int iImage;
|
|
}
|
|
ICONCBPARAM, *PICONCBPARAM;
|
|
|
|
typedef int (*PICONCALLBACK)(CTaskBand* ptb, PICONCBPARAM pip, LPARAM lParam, int iPref);
|
|
|
|
static int GetIconCB(CTaskBand* ptb, PICONCBPARAM pip, LPARAM lParam, int iPref);
|
|
static int GetSHILIconCB(CTaskBand* ptb, PICONCBPARAM pip, LPARAM lParam, int);
|
|
static int GetDefaultIconCB(CTaskBand* ptb, PICONCBPARAM pip, LPARAM, int);
|
|
static int GetClassIconCB(CTaskBand* ptb, PICONCBPARAM pip, LPARAM lParam, int);
|
|
|
|
void _MoveGroup(HWND hwnd, WCHAR* szNewExeName);
|
|
void _SetWindowIcon(HWND hwnd, HICON hicon, int iPref);
|
|
static BOOL _ShouldMinimize(HWND hwnd);
|
|
BOOL _CanMinimizeAll();
|
|
BOOL _MinimizeAll(HWND hwndTray, BOOL fPostRaiseDesktop);
|
|
int _HitTest(POINTL ptl);
|
|
void _FreePopupMenu();
|
|
|
|
void _RealityCheck();
|
|
int _FindIndexByHwnd(HWND hwnd);
|
|
void _CheckNeedScrollbars(int cyRow, int cItems, int iCols, int iRows,
|
|
int iItemWidth, LPRECT lprcView);
|
|
void _NukeScrollbar(int fnBar);
|
|
void _SetItemWidth(int iItem, int iWidth);
|
|
int _GetItemWidth(int iItem);
|
|
int _GetLastVisibleItem();
|
|
int _GetVisibleItemCount();
|
|
int _GetGroupWidth(int iIndexGroup);
|
|
int _GetIdealWidth(int *iRemainder);
|
|
void _GetNumberOfRowsCols(int* piRows, int* piCols, BOOL fCurrentSize);
|
|
int _GetTextSpace();
|
|
void _GetToolbarMetrics(LPTBMETRICS ptbm);
|
|
void _CheckSize(void);
|
|
void _SizeItems(int iButtonWidth, int iRemainder = 0);
|
|
BOOL _AddWindow(HWND hwnd);
|
|
BOOL _CheckButton(int iIndex, BOOL fCheck);
|
|
BOOL _IsButtonChecked(int iIndex);
|
|
int _GetCurSel();
|
|
void _SetCurSel(int iIndex, BOOL fIgnoreCtrlKey);
|
|
int _SelectWindow(HWND hwnd);
|
|
void _SwitchToWindow(HWND hwnd);
|
|
|
|
int _GetSelectedItems(CDSA<PTASKITEM>* pdsa);
|
|
int _GetGroupItems(int iIndexGroup, CDSA<PTASKITEM>* pdsa);
|
|
void _OnGroupCommand(int iRet, CDSA<PTASKITEM>* pdsa);
|
|
void _SysMenuForItem(int i, int x, int y);
|
|
static void CALLBACK FakeSystemMenuCB(HWND hwnd, UINT uMsg, ULONG_PTR dwData, LRESULT lres);
|
|
HWND _CreateFakeWindow(HWND hwndOwner);
|
|
void _HandleSysMenuTimeout();
|
|
void _HandleSysMenu(HWND hwnd);
|
|
void _FakeSystemMenu(HWND hwndTask, DWORD dwPos);
|
|
BOOL _ContextMenu(DWORD dwPos);
|
|
|
|
void _HandleCommand(WORD wCmd, WORD wID, HWND hwnd);
|
|
void _DrawNumber(HDC hdc, int iValue, BOOL fCalcRect, LPRECT prc);
|
|
LRESULT _HandleCustomDraw(LPNMTBCUSTOMDRAW ptbcd, PTASKITEM pti = NULL);
|
|
void _RemoveImage(int iImage);
|
|
void _OnButtonPressed(int iIndex, PTASKITEM pti, BOOL fForceRestore);
|
|
LRESULT _HandleNotify(LPNMHDR lpnm);
|
|
void _SwitchToItem(int iItem, HWND hwnd, BOOL fIgnoreCtrlKey);
|
|
LRESULT _HandleCreate();
|
|
LRESULT _HandleDestroy();
|
|
LRESULT _HandleScroll(BOOL fHoriz, UINT code, int nPos);
|
|
void _ScrollIntoView(int iItem);
|
|
LRESULT _HandleSize(WPARAM fwSizeType);
|
|
LRESULT _HandleActivate(HWND hwndActive);
|
|
void _UpdateItemUsage(PTASKITEM pti);
|
|
void _HandleOtherWindowDestroyed(HWND hwndDestroyed);
|
|
void _HandleGetMinRect(HWND hwndShell, LPPOINTS lprc);
|
|
void _HandleChangeNotify(WPARAM wParam, LPARAM lParam);
|
|
LRESULT _HandleHardError(HARDERRORDATA *phed, DWORD cbData);
|
|
BOOL _IsItemActive(HWND hwndActive);
|
|
void _CreateTBImageLists();
|
|
int _AddIconToNormalImageList(HICON hicon, int iImage);
|
|
|
|
void _UpdateItemText(int iItem);
|
|
void _UpdateItemIcon(int iItem);
|
|
void _GetDispInfo(LPNMTBDISPINFO lptbdi);
|
|
|
|
void _DoRedrawWhereNeeded();
|
|
void _RedrawItem(HWND hwndShell, WPARAM code, int i = -1);
|
|
void _SetActiveAlt(HWND hwndAlt);
|
|
HWND _EnumForRudeWindow(HWND hwndSelected);
|
|
HWND _FindRudeApp(HWND hwndPossible);
|
|
LRESULT _OnAppCommand(int cmd);
|
|
PTASKITEM _FindItemByHwnd(HWND hwnd);
|
|
void _OnWindowActivated(HWND hwnd, BOOL fSuspectFullscreen);
|
|
LRESULT _HandleShellHook(int iCode, LPARAM lParam);
|
|
void _VerifyButtonHeight();
|
|
void _InitFonts();
|
|
void _SetItemImage(int iItem, int iImage, int iPref);
|
|
void _UpdateAllIcons();
|
|
LRESULT _HandleWinIniChange(WPARAM wParam, LPARAM lParam, BOOL fOnCreate);
|
|
void _OnSetFocus();
|
|
BOOL _RegisterWindowClass();
|
|
void _UpdateFlashingFlag();
|
|
void _ExecuteMenuOption(HWND hwnd, int iCmd);
|
|
TASKITEM* _GetItem(int i, TBBUTTONINFO* ptbb = NULL, BOOL fByIndex = TRUE);
|
|
|
|
static BOOL WINAPI BuildEnumProc(HWND hwnd, LPARAM lParam);
|
|
static BOOL WINAPI IsRudeEnumProc(HWND hwnd, LPARAM lParam);
|
|
static DWORD WINAPI MinimizeAllThreadProc(LPVOID lpv);
|
|
void _OpenTheme();
|
|
|
|
virtual LRESULT v_WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
|
|
|
|
int _GetGroupSize(int iIndexGroup);
|
|
int _GetGroupIndex(int iIndexApp);
|
|
DWORD _GetGroupAge(int iIndexGroup);
|
|
int _GetGroupIndexFromExeName(WCHAR* szExeName);
|
|
|
|
BOOL _IsHidden(int i);
|
|
void _GetItemTitle(int iIndex, WCHAR* pszTitle, int cbTitle, BOOL fCustom);
|
|
void _RefreshSettings();
|
|
void _LoadSettings();
|
|
void _Glom(int iIndexGroup, BOOL fGlom);
|
|
void _HideGroup(int iIndexGroup, BOOL fHide);
|
|
BOOL _AutoGlomGroup(BOOL fGlom, int iOpenSlots);
|
|
void _DeleteTaskItem(int index, BOOL fDeletePTI);
|
|
void _RealityCheckGroup(PTASKITEM pti);
|
|
HRESULT _CreatePopupMenu(POINTL* ppt, RECTL* prcl);
|
|
void _AddItemToDropDown(int iIndex);
|
|
void _RemoveItemFromDropDown(int iIndex);
|
|
void _RefreshItemFromDropDown(int iIndex, int iNewIndex, BOOL fRefresh);
|
|
void _ClosePopupMenus();
|
|
void _HandleDropDown(int index);
|
|
void _UpdateProgramCount();
|
|
BOOL _AddToTaskbar(PTASKITEM pti, int indexTaskbar, BOOL fVisible, BOOL fForceGetIcon);
|
|
BOOL _InsertItem(HWND hwndTask, PTASKITEM ptiOveride = NULL, BOOL fForceGetIcon = FALSE);
|
|
void _DeleteItem(HWND hWnd, int index = -1);
|
|
void _AttachTaskShortcut(PTASKITEM pti, LPCTSTR pszExeName);
|
|
void _ReattachTaskShortcut();
|
|
void _BuildTaskList(CDPA<TASKITEM>* pDPA);
|
|
|
|
// *** Async-Animation
|
|
BOOL _fAnimate;
|
|
CDSA<ANIMATIONITEMINFO> _dsaAII;
|
|
|
|
// animation methods
|
|
BOOL _AnimateItems(int iIndex, BOOL fExpand, BOOL fGlomAnimation);
|
|
void _AsyncAnimateItems();
|
|
void _ResizeAnimationItems();
|
|
int _CheckAnimationSize();
|
|
void _SizeNonAnimatingItems();
|
|
|
|
// animation helpers
|
|
void _UpdateAnimationIndices();
|
|
void _UpdateAnimationIndicesSlow();
|
|
int _FindItem(PTASKITEM pti);
|
|
void _RemoveItemFromAnimationList(PTASKITEM ptiRemove);
|
|
void _SetAnimationState(PANIMATIONITEMINFO paii, BOOL fExpand, BOOL fGlomAnimation);
|
|
int _GetAnimationInsertPos(int iIndex);
|
|
void _SetAnimationItemWidth(PANIMATIONITEMINFO paii, int cxStep);
|
|
int _GetAnimationDistLeft(PANIMATIONITEMINFO paii, int iNormalWidth);
|
|
void _FinishAnimation(PANIMATIONITEMINFO paii);
|
|
int _GetAnimationWidth();
|
|
int _GetAnimationStep();
|
|
DWORD _GetStepTime(int iStep);
|
|
int _GetCurButtonHeight();
|
|
|
|
void _SetThreadPriority(int iPriority, DWORD dwWakeupTime);
|
|
void _RestoreThreadPriority();
|
|
|
|
BOOL _IsHorizontal() { return !(_dwViewMode & DBIF_VIEWMODE_VERTICAL); }
|
|
|
|
BOOL _fGlom;
|
|
int _iGroupSize;
|
|
CToolBarCtrl _tb;
|
|
UINT WM_ShellHook;
|
|
int _iSysMenuCount;
|
|
int _iIndexActiveAtLDown;
|
|
HWND _hwndSysMenu;
|
|
HWND _hwndLastRude;
|
|
HWND _hwndPrevFocus;
|
|
HWND _hwndReplacing;
|
|
BOOL _fIgnoreTaskbarActivate;
|
|
BOOL _fFlashing;
|
|
BOOL _fDenyHotItemChange;
|
|
CTray* _ptray;
|
|
HFONT _hfontSave;
|
|
int _iTextSpace;
|
|
DWORD _dwPos;
|
|
DWORD _dwViewMode;
|
|
HFONT _hfontCapNormal;
|
|
HFONT _hfontCapBold;
|
|
HTHEME _hTheme;
|
|
int _iOldPriority;
|
|
int _iNewPriority;
|
|
|
|
ULONG _cRef;
|
|
|
|
// Drag & drop stuff
|
|
int _iDropItem;
|
|
DWORD _dwTriggerStart;
|
|
DWORD _dwTriggerDelay;
|
|
|
|
// Variables for the ASYNC popup menu
|
|
IShellMenu2* _psmPopup;
|
|
IMenuPopup* _pmpPopup;
|
|
IMenuBand* _pmbPopup;
|
|
int _iIndexPopup;
|
|
int _iIndexLastPopup;
|
|
CMenu _menuPopup;
|
|
|
|
IImageList* _pimlSHIL;
|
|
|
|
// Rarely-used stuff
|
|
ULONG _uShortcutInvokeNotify;
|
|
UINT _uCDHardError;
|
|
|
|
|
|
CTaskBand();
|
|
~CTaskBand();
|
|
HRESULT Init(CTray* ptray);
|
|
|
|
HRESULT _BandInfoChanged();
|
|
|
|
DWORD _dwBandID;
|
|
|
|
IUnknown * _punkSite;
|
|
|
|
friend HRESULT CTaskBand_CreateInstance(IUnknown* punkOuter, IUnknown** ppunk);
|
|
friend class CTaskBandSMC;
|
|
};
|
|
|
|
#endif // __cplusplus
|
|
|
|
#endif //TASKBAND_H_
|