257 lines
9.4 KiB
C++
257 lines
9.4 KiB
C++
#ifndef _DESKHOST_H_
|
|
#define _DESKHOST_H_
|
|
|
|
#include <exdisp.h>
|
|
#include <mshtml.h>
|
|
#include "dpa.h"
|
|
#include "../startmnu.h"
|
|
#include <cowsite.h>
|
|
|
|
#define WC_DV2 TEXT("DV2ControlHost")
|
|
|
|
// These are in WM_APP range because IsDialogMessage uses
|
|
// the WM_USER range and we used to use IsDialogMessage to get our focus
|
|
// management right.
|
|
|
|
#define DHM_DISMISS (WM_APP+0)
|
|
|
|
#define DesktopHost_Dismiss(hwnd) SendMessage(hwnd, DHM_DISMISS, 0, 0)
|
|
|
|
EXTERN_C HBITMAP CreateMirroredBitmap(HBITMAP hbm);
|
|
|
|
class CPopupMenu
|
|
{
|
|
CPopupMenu() : _cRef(1) { }
|
|
~CPopupMenu();
|
|
|
|
public:
|
|
friend HRESULT CPopupMenu_CreateInstance(IShellMenu *psm,
|
|
IUnknown *punkSite,
|
|
HWND hwnd,
|
|
CPopupMenu **ppmOut);
|
|
|
|
void AddRef() { _cRef++; }
|
|
void Release() { if (--_cRef == 0) delete this; }
|
|
|
|
BOOL IsSame(IShellMenu *psm)
|
|
{
|
|
return SHIsSameObject(_psm, psm);
|
|
}
|
|
|
|
// Wrapped method calls
|
|
|
|
HRESULT Invalidate()
|
|
{ return _psm->InvalidateItem(NULL, SMINV_REFRESH); }
|
|
|
|
HRESULT TranslateMenuMessage(MSG *pmsg, LRESULT *plRet)
|
|
{ return _pmb->TranslateMenuMessage(pmsg, plRet); }
|
|
|
|
HRESULT OnSelect(DWORD dwSelectType)
|
|
{ return _pmp->OnSelect(dwSelectType); }
|
|
|
|
HRESULT IsMenuMessage(MSG *pmsg)
|
|
{ return _pmb->IsMenuMessage(pmsg); }
|
|
|
|
HRESULT Popup(RECT *prcExclude, DWORD dwFlags);
|
|
|
|
private:
|
|
HRESULT Initialize(IShellMenu *psm, IUnknown *punkSite, HWND hwnd);
|
|
|
|
private:
|
|
LONG _cRef;
|
|
|
|
IMenuPopup * _pmp;
|
|
IMenuBand * _pmb;
|
|
IShellMenu * _psm;
|
|
};
|
|
|
|
class CDesktopHost
|
|
: public CUnknown
|
|
, public IMenuPopup
|
|
, public IMenuBand
|
|
, public ITrayPriv2
|
|
, public IServiceProvider
|
|
, public IOleCommandTarget
|
|
, public CObjectWithSite
|
|
{
|
|
friend class CDeskHostShellMenuCallback;
|
|
|
|
private:
|
|
|
|
enum {
|
|
IDT_MENUCHANGESEL = 1,
|
|
};
|
|
|
|
enum {
|
|
NEWAPP_OFFER_COUNT = 3, // offer up to 3 times
|
|
};
|
|
|
|
private:
|
|
HWND _hwnd; // window handle
|
|
|
|
HTHEME _hTheme;
|
|
|
|
HWND _hwndChildFocus; // which child last had focus?
|
|
|
|
IMenuPopup * _pmpTracking; // The popup menu we are tracking
|
|
IMenuBand * _pmbTracking; // The menuband we are tracking
|
|
LPARAM _itemTracking; // The item that owns the current popup menu
|
|
HWND _hwndTracking; // The child window that owns _itemTracking
|
|
LPARAM _itemAltTracking; // The item the user has hot-tracked to while viewing a different item's popup menu
|
|
HWND _hwndAltTracking; // The child window that owns _itemAltTracking
|
|
|
|
CPopupMenu * _ppmPrograms; // Cached Programs menu
|
|
CPopupMenu * _ppmTracking; // The one that is currently popped up
|
|
|
|
HWND _hwndNewHandler; // Which window knows which apps are new?
|
|
|
|
RECT _rcDesired; // The layout gets to specify a desired size
|
|
RECT _rcActual; // And then the components can request additional resizing
|
|
|
|
int _iOfferNewApps; // number of times we should suggest to the
|
|
// user that they look at the app that was installed
|
|
UINT _wmDragCancel; // user dragged an item off of a submenu
|
|
BOOL _fOfferedNewApps; // did we offer new apps this time?
|
|
BOOL _fOpen; // Is the menu open for business?
|
|
BOOL _fMenuBlocked; // Is menu mode temporarily blocked?
|
|
BOOL _fMouseEntered; // Is the mouse inside our window?
|
|
BOOL _fAutoCascade; // Should we auto-open on hover?
|
|
BOOL _fClipped; // Did we have to pitch some items to fit on screen?
|
|
BOOL _fWarnedClipped; // Has the user been warned that it's been clipped?
|
|
BOOL _fDismissOnlyPopup; // Are we only dismissing the popup?
|
|
|
|
HWND _hwndLastMouse; // HWND that received last mousemove message
|
|
LPARAM _lParamLastMouse; // LPARAM of last mousemove message
|
|
|
|
HWND _hwndClipBalloon; // HWND of "you've been clipped!" balloon tip
|
|
|
|
IFadeTask * _ptFader; // For cool selection fading
|
|
|
|
SIZE _sizWindowPrev; // previous size of window when we popped up
|
|
|
|
STARTPANELMETRICS _spm; // start panel metrics
|
|
|
|
HBITMAP _hbmCachedSnapshot; // This bitmap reflects the current look of the start menu, ready to show!
|
|
|
|
public:
|
|
// *** IUnknown ***
|
|
STDMETHODIMP QueryInterface(REFIID riid, void** ppvObj);
|
|
STDMETHODIMP_(ULONG) AddRef(void) { return CUnknown::AddRef(); }
|
|
STDMETHODIMP_(ULONG) Release(void) { return CUnknown::Release(); }
|
|
|
|
// *** IOleWindow methods ***
|
|
STDMETHODIMP GetWindow(HWND * phwnd) { *phwnd = _hwnd; return S_OK; }
|
|
STDMETHODIMP ContextSensitiveHelp(BOOL bEnterMode) { return E_NOTIMPL; }
|
|
|
|
// *** IDeskBar methods ***
|
|
STDMETHODIMP SetClient(IUnknown* punk) { return E_NOTIMPL; };
|
|
STDMETHODIMP GetClient(IUnknown** ppunkClient) { return E_NOTIMPL; }
|
|
STDMETHODIMP OnPosRectChangeDB (LPRECT prc) { return E_NOTIMPL; }
|
|
|
|
// *** IMenuPopup methods ***
|
|
STDMETHODIMP Popup(POINTL *ppt, RECTL *prcExclude, DWORD dwFlags);
|
|
STDMETHODIMP OnSelect(DWORD dwSelectType);
|
|
STDMETHODIMP SetSubMenu(IMenuPopup* pmp, BOOL fSet) { return E_NOTIMPL; }
|
|
|
|
// *** IMenuBand methods ***
|
|
STDMETHODIMP IsMenuMessage(MSG *pmsg);
|
|
STDMETHODIMP TranslateMenuMessage(MSG *pmsg, LRESULT *plres);
|
|
|
|
// *** ITrayPriv methods ***
|
|
STDMETHODIMP ExecItem(IShellFolder *psf, LPCITEMIDLIST pidl) { return E_NOTIMPL; }
|
|
STDMETHODIMP GetFindCM(HMENU hmenu, UINT idFirst, UINT idLast, IContextMenu **ppcmFind) { return E_NOTIMPL; }
|
|
STDMETHODIMP GetStaticStartMenu(HMENU* phmenu) { return E_NOTIMPL; }
|
|
|
|
// *** ITrayPriv2 methods ***
|
|
STDMETHODIMP ModifySMInfo(IN LPSMDATA psmd, IN OUT SMINFO *psminfo);
|
|
|
|
// *** IServiceProvider ***
|
|
STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObj);
|
|
|
|
// *** IOleCommandTarget ***
|
|
STDMETHODIMP QueryStatus(const GUID * pguidCmdGroup,
|
|
ULONG cCmds, OLECMD rgCmds[], OLECMDTEXT *pcmdtext);
|
|
STDMETHODIMP Exec(const GUID * pguidCmdGroup,
|
|
DWORD nCmdID, DWORD nCmdexecopt,
|
|
VARIANTARG *pvarargIn, VARIANTARG *pvarargOut);
|
|
|
|
// *** IObjectWithSite ***
|
|
STDMETHODIMP SetSite(IUnknown *punkSite);
|
|
|
|
public:
|
|
HRESULT Initialize();
|
|
HRESULT Build();
|
|
|
|
private:
|
|
HWND _Create();
|
|
HRESULT _Popup(POINT *ppt, RECT *prcExclude, DWORD dwFlags);
|
|
|
|
private:
|
|
|
|
~CDesktopHost();
|
|
|
|
static LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
|
|
|
|
// Window Messages
|
|
void OnCreate(HWND hwnd);
|
|
void OnDestroy();
|
|
void OnPaint(HDC hdc, BOOL bBackground);
|
|
void OnSetFocus(HWND hwndLose);
|
|
void OnContextMenu(LPARAM lParam);
|
|
void _OnDismiss(BOOL bDestroy);
|
|
void _OnMenuChangeSel();
|
|
LRESULT OnHaveNewItems(NMHDR *pnm);
|
|
LRESULT OnCommandInvoked(NMHDR *pnm);
|
|
LRESULT OnFilterOptions(NMHDR *pnm);
|
|
LRESULT OnTrackShellMenu(NMHDR *pnm);
|
|
void OnSeenNewItems();
|
|
LRESULT OnNeedRepaint();
|
|
HRESULT TranslatePopupMenuMessage(MSG *pmsg, LRESULT *plres);
|
|
|
|
// Other helpers
|
|
BOOL Register();
|
|
void LoadPanelMetrics();
|
|
void LoadResourceInt(UINT ids, LONG *pl);
|
|
BOOL AddWin32Controls();
|
|
|
|
BOOL _TryShowBuffered();
|
|
|
|
void _DismissTrackShellMenu();
|
|
void _CleanupTrackShellMenu(); // release + UI-related goo
|
|
|
|
void _DismissMenuPopup();
|
|
BOOL _IsDialogMessage(MSG *pmsg);
|
|
BOOL _DlgNavigateArrow(HWND hwndStart, MSG *pmsg);
|
|
BOOL _DlgNavigateChar(HWND hwndStart, MSG *pmsg);
|
|
HWND _FindNextDlgChar(HWND hwndStart, SMNDIALOGMESSAGE *pnmdm, UINT snmdm);
|
|
void _EnableKeyboardCues();
|
|
void _MaybeOfferNewApps();
|
|
BOOL _ShouldIgnoreFocusChange(HWND hwndFocusRecipient);
|
|
void _FilterMouseMove(MSG *pmsg, HWND hwndTarget);
|
|
void _FilterMouseLeave(MSG *pmsg, HWND hwndTarget);
|
|
void _FilterMouseHover(MSG *pmsg, HWND hwndTarget);
|
|
void _RemoveSelection();
|
|
void _SubclassTrackShellMenu(IShellMenu *psm);
|
|
HRESULT _MenuMouseFilter(LPSMDATA psmd, BOOL fRemove, LPMSG pmsg);
|
|
|
|
typedef HWND (WINAPI *GETNEXTDLGITEM)(HWND, HWND, BOOL);
|
|
HWND _DlgFindItem(HWND hwndStart, SMNDIALOGMESSAGE *pnmdm, UINT smndm,
|
|
GETNEXTDLGITEM GetNextDlgItem, UINT fl);
|
|
|
|
LRESULT _FindChildItem(HWND hwnd, SMNDIALOGMESSAGE *pnmdm, UINT smndm);
|
|
|
|
void _ReadPaneSizeFromTheme(SMPANEDATA *psmpd);
|
|
|
|
void _ComputeActualSize(MONITORINFO *pminfo, LPCRECT prcExclude);
|
|
void _ChoosePopupPosition(POINT *ppt, LPCRECT prcExclude, LPRECT prcWindow);
|
|
void _ReapplyRegion();
|
|
void _SaveChildFocus();
|
|
HWND _RestoreChildFocus();
|
|
|
|
void _MaybeShowClipBalloon();
|
|
void _DestroyClipBalloon();
|
|
};
|
|
|
|
|
|
#endif
|