ReactOS 0.4.15-dev-7906-g1b85a5f
CMenuFocusManager Class Reference

#include <CMenuFocusManager.h>

Inheritance diagram for CMenuFocusManager:
Collaboration diagram for CMenuFocusManager:

Classes

struct  StackEntry
 

Public Member Functions

HRESULT PushMenuBar (CMenuBand *mb)
 
HRESULT PushMenuPopup (CMenuBand *mb)
 
HRESULT PushTrackedPopup (HMENU popup)
 
HRESULT PopMenuBar (CMenuBand *mb)
 
HRESULT PopMenuPopup (CMenuBand *mb)
 
HRESULT PopTrackedPopup (HMENU popup)
 
- Public Member Functions inherited from ATL::CComObjectRootEx< CComMultiThreadModelNoCS >
 ~CComObjectRootEx ()
 
ULONG InternalAddRef ()
 
ULONG InternalRelease ()
 
void Lock ()
 
void Unlock ()
 
HRESULT _AtlInitialConstruct ()
 
- Public Member Functions inherited from ATL::CComObjectRootBase
 CComObjectRootBase ()
 
 ~CComObjectRootBase ()
 
void SetVoid (void *)
 
HRESULT _AtlFinalConstruct ()
 
HRESULT FinalConstruct ()
 
void InternalFinalConstructAddRef ()
 
void InternalFinalConstructRelease ()
 
void FinalRelease ()
 

Static Public Member Functions

static CMenuFocusManagerAcquireManager ()
 
static void ReleaseManager (CMenuFocusManager *obj)
 
- Static Public Member Functions inherited from ATL::CComObjectRootBase
static void WINAPI ObjectMain (bool)
 
static const struct _ATL_CATMAP_ENTRYGetCategoryMap ()
 
static HRESULT WINAPI InternalQueryInterface (void *pThis, const _ATL_INTMAP_ENTRY *pEntries, REFIID iid, void **ppvObject)
 

Protected Member Functions

 CMenuFocusManager ()
 
 ~CMenuFocusManager ()
 

Private Types

enum  StackEntryType { NoEntry , MenuBarEntry , MenuPopupEntry , TrackedMenuEntry }
 

Private Member Functions

HRESULT PushToArray (StackEntryType type, CMenuBand *mb, HMENU hmenu)
 
HRESULT PopFromArray (StackEntryType *pType, CMenuBand **pMb, HMENU *pHmenu)
 
LRESULT GetMsgHook (INT nCode, WPARAM wParam, LPARAM lParam)
 
LRESULT MsgFilterHook (INT nCode, WPARAM wParam, LPARAM lParam)
 
HRESULT PlaceHooks ()
 
HRESULT RemoveHooks ()
 
HRESULT UpdateFocus ()
 
HRESULT IsTrackedWindow (HWND hWnd, StackEntry **pentry=NULL)
 
HRESULT IsTrackedWindowOrParent (HWND hWnd)
 
void DisableMouseTrack (HWND parent, BOOL disableThis)
 
void SetMenuCapture (HWND child)
 
LRESULT ProcessMouseMove (MSG *msg)
 
LRESULT ProcessMouseDown (MSG *msg, BOOL isLButton)
 
LRESULT ProcessMouseUp (MSG *msg, BOOL isLButton)
 

Static Private Member Functions

static CMenuFocusManagerGetManager ()
 
static LRESULT CALLBACK s_MsgFilterHook (INT nCode, WPARAM wParam, LPARAM lParam)
 
static LRESULT CALLBACK s_GetMsgHook (INT nCode, WPARAM wParam, LPARAM lParam)
 

Private Attributes

StackEntrym_current
 
StackEntrym_parent
 
StackEntrym_menuBar
 
HHOOK m_hMsgFilterHook
 
HHOOK m_hGetMsgHook
 
DWORD m_threadId
 
BOOL m_mouseTrackDisabled
 
POINT m_ptPrev
 
HWND m_captureHwnd
 
HWND m_hwndUnderMouse
 
StackEntrym_entryUnderMouse
 
HMENU m_selectedMenu
 
INT m_selectedItem
 
DWORD m_selectedItemFlags
 
BOOL m_movedSinceDown
 
HWND m_windowAtDown
 
HWND m_PreviousForeground
 
StackEntry m_bandStack [MAX_RECURSE]
 
int m_bandCount
 
int m_menuDepth
 

Static Private Attributes

static DWORD TlsIndex = 0
 

Additional Inherited Members

- Public Attributes inherited from ATL::CComObjectRootBase
LONG m_dwRef
 

Detailed Description

Definition at line 24 of file CMenuFocusManager.h.

Member Enumeration Documentation

◆ StackEntryType

Enumerator
NoEntry 
MenuBarEntry 
MenuPopupEntry 
TrackedMenuEntry 

Definition at line 33 of file CMenuFocusManager.h.

Constructor & Destructor Documentation

◆ CMenuFocusManager()

CMenuFocusManager::CMenuFocusManager ( )
protected

Definition at line 176 of file CMenuFocusManager.cpp.

176 :
178 m_parent(NULL),
182 m_captureHwnd(0),
191 m_bandCount(0),
192 m_menuDepth(0)
193{
194 m_ptPrev.x = 0;
195 m_ptPrev.y = 0;
197}
StackEntry * m_entryUnderMouse
StackEntry * m_current
StackEntry * m_parent
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
long y
Definition: polytest.cpp:48
long x
Definition: polytest.cpp:48
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:459

◆ ~CMenuFocusManager()

CMenuFocusManager::~CMenuFocusManager ( )
protected

Definition at line 199 of file CMenuFocusManager.cpp.

200{
201}

Member Function Documentation

◆ AcquireManager()

CMenuFocusManager * CMenuFocusManager::AcquireManager ( )
static

Definition at line 97 of file CMenuFocusManager.cpp.

98{
100
101 if (!TlsIndex)
102 {
104 return NULL;
105 }
106
107 obj = GetManager();
108
109 if (!obj)
110 {
111 obj = new CComObject<CMenuFocusManager>();
113 }
114
115 obj->AddRef();
116
117 return obj;
118}
static CMenuFocusManager * GetManager()
static DWORD TlsIndex
DWORD WINAPI TlsAlloc(VOID)
Definition: thread.c:1100
BOOL WINAPI TlsSetValue(IN DWORD Index, IN LPVOID Value)
Definition: thread.c:1276
#define TLS_OUT_OF_INDEXES
Definition: winbase.h:549

Referenced by CMenuBand::CMenuBand().

◆ DisableMouseTrack()

void CMenuFocusManager::DisableMouseTrack ( HWND  parent,
BOOL  disableThis 
)
private

Definition at line 204 of file CMenuFocusManager.cpp.

205{
206 BOOL bDisable = FALSE;
207 BOOL lastDisable = FALSE;
208
209 int i = m_bandCount;
210 while (--i >= 0)
211 {
212 StackEntry& entry = m_bandStack[i];
213
214 if (entry.type != TrackedMenuEntry)
215 {
216 HWND hwnd;
217 HRESULT hr = entry.mb->_GetTopLevelWindow(&hwnd);
219 break;
220
221 if (hwnd == parent)
222 {
223 lastDisable = disableThis;
224 entry.mb->_DisableMouseTrack(disableThis);
225 bDisable = TRUE;
226 }
227 else
228 {
229 lastDisable = bDisable;
230 entry.mb->_DisableMouseTrack(bDisable);
231 }
232 }
233 }
234 m_mouseTrackDisabled = lastDisable;
235}
StackEntry m_bandStack[MAX_RECURSE]
#define TRUE
Definition: types.h:120
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
r parent
Definition: btrfs.c:3010
unsigned int BOOL
Definition: ntddk_ex.h:94
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
uint32_t entry
Definition: isohybrid.c:63
HRESULT hr
Definition: shlfolder.c:183
_In_ LONG _In_ HWND hwnd
Definition: winddi.h:4023

Referenced by GetMsgHook(), ProcessMouseMove(), and UpdateFocus().

◆ GetManager()

CMenuFocusManager * CMenuFocusManager::GetManager ( )
staticprivate

Definition at line 91 of file CMenuFocusManager.cpp.

92{
93 return reinterpret_cast<CMenuFocusManager *>(TlsGetValue(TlsIndex));
94}
LPVOID WINAPI TlsGetValue(IN DWORD Index)
Definition: thread.c:1240

Referenced by AcquireManager(), s_GetMsgHook(), and s_MsgFilterHook().

◆ GetMsgHook()

LRESULT CMenuFocusManager::GetMsgHook ( INT  nCode,
WPARAM  wParam,
LPARAM  lParam 
)
private

Definition at line 557 of file CMenuFocusManager.cpp.

558{
559 BOOL isLButton = FALSE;
560 if (nCode < 0)
561 return CallNextHookEx(m_hGetMsgHook, nCode, hookWParam, hookLParam);
562
563 if (nCode == HC_ACTION)
564 {
565 BOOL callNext = TRUE;
566 MSG* msg = reinterpret_cast<MSG*>(hookLParam);
567 POINT pt = msg->pt;
568
569 switch (msg->message)
570 {
572 if (m_captureHwnd)
573 {
574 TRACE("Capture lost.\n");
576 }
577 break;
578
579 case WM_NCLBUTTONDOWN:
580 case WM_LBUTTONDBLCLK:
581 case WM_LBUTTONDOWN:
582 isLButton = TRUE;
583 TRACE("LB\n");
584
586 {
587 POINT pt = msg->pt;
589 BOOL hoveringMenuBar = m_menuBar->mb->IsWindowOwner(child) == S_OK;
590 if (hoveringMenuBar)
591 {
592 m_current->mb->_MenuItemSelect(MPOS_FULLCANCEL);
593 break;
594 }
595 }
596
598 {
600
602 {
603 m_current->mb->_MenuItemSelect(MPOS_FULLCANCEL);
604 break;
605 }
606 }
607
608 ProcessMouseDown(msg, isLButton);
609
610 break;
611 case WM_NCRBUTTONUP:
612 case WM_RBUTTONUP:
613 ProcessMouseUp(msg, isLButton);
614 break;
615 case WM_NCLBUTTONUP:
616 case WM_LBUTTONUP:
617 isLButton = TRUE;
618 ProcessMouseUp(msg, isLButton);
619 break;
620 case WM_MOUSEMOVE:
621 callNext = ProcessMouseMove(msg);
622 break;
623 case WM_MOUSELEAVE:
624 callNext = ProcessMouseMove(msg);
625 //callNext = ProcessMouseLeave(msg);
626 break;
627 case WM_SYSKEYDOWN:
628 case WM_KEYDOWN:
630 {
632 switch (msg->wParam)
633 {
634 case VK_ESCAPE:
635 case VK_MENU:
636 case VK_LMENU:
637 case VK_RMENU:
638 m_current->mb->_MenuItemSelect(MPOS_FULLCANCEL);
639 break;
640 case VK_RETURN:
641 m_current->mb->_MenuItemSelect(MPOS_EXECUTE);
642 break;
643 case VK_LEFT:
645 break;
646 case VK_RIGHT:
648 break;
649 case VK_UP:
651 break;
652 case VK_DOWN:
654 break;
655 }
656 msg->message = WM_NULL;
657 msg->lParam = 0;
658 msg->wParam = 0;
659 }
660 break;
661 }
662
663 if (!callNext)
664 return 1;
665 }
666
667 return CallNextHookEx(m_hGetMsgHook, nCode, hookWParam, hookLParam);
668}
#define msg(x)
Definition: auth_time.c:54
STDMETHOD() IsWindowOwner(HWND hWnd) override
Definition: CMenuBand.cpp:757
HRESULT _MenuItemSelect(DWORD changeType)
Definition: CMenuBand.cpp:953
LRESULT ProcessMouseMove(MSG *msg)
HRESULT IsTrackedWindowOrParent(HWND hWnd)
LRESULT ProcessMouseUp(MSG *msg, BOOL isLButton)
void DisableMouseTrack(HWND parent, BOOL disableThis)
LRESULT ProcessMouseDown(MSG *msg, BOOL isLButton)
StackEntry * m_menuBar
#define pt(x, y)
Definition: drawing.c:79
#define S_OK
Definition: intsafe.h:52
static HWND child
Definition: cursoricon.c:298
#define WM_MOUSELEAVE
Definition: commctrl.h:4975
#define TRACE(s)
Definition: solgame.cpp:4
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
#define WM_CAPTURECHANGED
Definition: winuser.h:1808
#define WM_LBUTTONDBLCLK
Definition: winuser.h:1778
#define HC_ACTION
Definition: winuser.h:48
#define WM_RBUTTONUP
Definition: winuser.h:1780
#define VK_UP
Definition: winuser.h:2225
#define WM_MOUSEMOVE
Definition: winuser.h:1775
#define WM_LBUTTONDOWN
Definition: winuser.h:1776
#define VK_RETURN
Definition: winuser.h:2201
#define VK_RMENU
Definition: winuser.h:2287
#define WM_NULL
Definition: winuser.h:1607
#define WM_LBUTTONUP
Definition: winuser.h:1777
LRESULT WINAPI CallNextHookEx(_In_opt_ HHOOK, _In_ int, _In_ WPARAM, _In_ LPARAM)
#define VK_LEFT
Definition: winuser.h:2224
#define VK_RIGHT
Definition: winuser.h:2226
#define WM_NCLBUTTONUP
Definition: winuser.h:1693
#define VK_DOWN
Definition: winuser.h:2227
HWND WINAPI WindowFromPoint(_In_ POINT)
#define WM_NCRBUTTONUP
Definition: winuser.h:1696
#define WM_KEYDOWN
Definition: winuser.h:1715
#define VK_ESCAPE
Definition: winuser.h:2214
#define WM_SYSKEYDOWN
Definition: winuser.h:1719
#define WM_NCLBUTTONDOWN
Definition: winuser.h:1692
#define VK_LMENU
Definition: winuser.h:2286
#define VK_MENU
Definition: winuser.h:2204

Referenced by s_GetMsgHook().

◆ IsTrackedWindow()

HRESULT CMenuFocusManager::IsTrackedWindow ( HWND  hWnd,
StackEntry **  pentry = NULL 
)
private

Definition at line 257 of file CMenuFocusManager.cpp.

258{
259 if (pentry)
260 *pentry = NULL;
261
262 for (int i = m_bandCount; --i >= 0;)
263 {
264 StackEntry& entry = m_bandStack[i];
265
266 if (entry.type != TrackedMenuEntry)
267 {
268 HRESULT hr = entry.mb->IsWindowOwner(hWnd);
270 return hr;
271 if (hr == S_OK)
272 {
273 if (pentry)
274 *pentry = &entry;
275 return S_OK;
276 }
277 }
278 }
279
280 return S_FALSE;
281}
HWND hWnd
Definition: settings.c:17
#define S_FALSE
Definition: winerror.h:2357

Referenced by ProcessMouseDown(), ProcessMouseMove(), and ProcessMouseUp().

◆ IsTrackedWindowOrParent()

HRESULT CMenuFocusManager::IsTrackedWindowOrParent ( HWND  hWnd)
private

Definition at line 283 of file CMenuFocusManager.cpp.

284{
285 for (int i = m_bandCount; --i >= 0;)
286 {
287 StackEntry& entry = m_bandStack[i];
288
289 if (entry.type != TrackedMenuEntry)
290 {
291 HRESULT hr = entry.mb->IsWindowOwner(hWnd);
293 return hr;
294 if (hr == S_OK)
295 return S_OK;
296 if (entry.mb->_IsPopup() == S_OK)
297 {
298 CComPtr<IUnknown> site;
299 CComPtr<IOleWindow> pw;
300 hr = entry.mb->GetSite(IID_PPV_ARG(IUnknown, &site));
302 continue;
303 hr = IUnknown_QueryService(site, SID_SMenuBandParent, IID_PPV_ARG(IOleWindow, &pw));
305 continue;
306
307 HWND hParent;
308 if (pw->GetWindow(&hParent) == S_OK && hParent == hWnd)
309 return S_OK;
310 }
311 }
312 }
313
314 return S_FALSE;
315}
HRESULT WINAPI IUnknown_QueryService(IUnknown *, REFGUID, REFIID, LPVOID *)
Definition: ordinal.c:1497
static IActiveScriptSite * site
Definition: script.c:149
#define IID_PPV_ARG(Itype, ppType)

Referenced by GetMsgHook().

◆ MsgFilterHook()

LRESULT CMenuFocusManager::MsgFilterHook ( INT  nCode,
WPARAM  wParam,
LPARAM  lParam 
)
private

Definition at line 491 of file CMenuFocusManager.cpp.

492{
493 if (nCode < 0)
494 return CallNextHookEx(m_hMsgFilterHook, nCode, hookWParam, hookLParam);
495
496 if (nCode == MSGF_MENU)
497 {
498 BOOL callNext = TRUE;
499 MSG* msg = reinterpret_cast<MSG*>(hookLParam);
500
501 switch (msg->message)
502 {
503 case WM_LBUTTONDOWN:
504 case WM_RBUTTONDOWN:
506 {
507 POINT pt = msg->pt;
509 BOOL hoveringMenuBar = m_menuBar->mb->IsWindowOwner(child) == S_OK;
510 if (hoveringMenuBar)
511 {
513 }
514 }
515 break;
516 case WM_MOUSEMOVE:
517 callNext = ProcessMouseMove(msg);
518 break;
519 case WM_INITMENUPOPUP:
520 TRACE("WM_INITMENUPOPUP %p %p\n", msg->wParam, msg->lParam);
521 m_selectedMenu = reinterpret_cast<HMENU>(msg->lParam);
522 m_selectedItem = -1;
524 break;
525 case WM_MENUSELECT:
526 TRACE("WM_MENUSELECT %p %p\n", msg->wParam, msg->lParam);
527 m_selectedMenu = reinterpret_cast<HMENU>(msg->lParam);
529 m_selectedItemFlags = HIWORD(msg->wParam);
530 break;
531 case WM_KEYDOWN:
532 switch (msg->wParam)
533 {
534 case VK_LEFT:
536 {
538 }
539 break;
540 case VK_RIGHT:
542 {
544 }
545 break;
546 }
547 break;
548 }
549
550 if (!callNext)
551 return 1;
552 }
553
554 return CallNextHookEx(m_hMsgFilterHook, nCode, hookWParam, hookLParam);
555}
HRESULT _BeforeCancelPopup()
Definition: CMenuBand.cpp:1100
static const CLSID *static CLSID *static const GUID VARIANT VARIANT *static IServiceProvider DWORD *static HMENU
Definition: ordinal.c:63
#define HIWORD(l)
Definition: typedefs.h:247
#define GET_X_LPARAM(lp)
Definition: windowsx.h:299
#define MF_POPUP
Definition: winuser.h:136
#define WM_RBUTTONDOWN
Definition: winuser.h:1779
#define WM_INITMENUPOPUP
Definition: winuser.h:1746
#define MSGF_MENU
Definition: winuser.h:1175
#define WM_MENUSELECT
Definition: winuser.h:1747

Referenced by s_MsgFilterHook().

◆ PlaceHooks()

HRESULT CMenuFocusManager::PlaceHooks ( )
private

Definition at line 670 of file CMenuFocusManager.cpp.

671{
672 if (m_hGetMsgHook)
673 {
674 WARN("GETMESSAGE hook already placed!\n");
675 return S_OK;
676 }
678 {
679 WARN("MSGFILTER hook already placed!\n");
680 return S_OK;
681 }
683 {
684 TRACE("Entering MSGFILTER hook...\n");
686 }
687 else
688 {
689 TRACE("Entering GETMESSAGE hook...\n");
691 }
692 return S_OK;
693}
#define WARN(fmt,...)
Definition: debug.h:112
static LRESULT CALLBACK s_MsgFilterHook(INT nCode, WPARAM wParam, LPARAM lParam)
static LRESULT CALLBACK s_GetMsgHook(INT nCode, WPARAM wParam, LPARAM lParam)
#define WH_MSGFILTER
Definition: winuser.h:29
#define SetWindowsHookEx
Definition: winuser.h:5856
#define WH_GETMESSAGE
Definition: winuser.h:33

Referenced by UpdateFocus().

◆ PopFromArray()

HRESULT CMenuFocusManager::PopFromArray ( StackEntryType pType,
CMenuBand **  pMb,
HMENU pHmenu 
)
private

Definition at line 152 of file CMenuFocusManager.cpp.

153{
154 if (pType) *pType = NoEntry;
155 if (pMb) *pMb = NULL;
156 if (pHmenu) *pHmenu = NULL;
157
158 if (m_bandCount <= 0)
159 return S_FALSE;
160
161 m_bandCount--;
162
163 if (pType) *pType = m_bandStack[m_bandCount].type;
164 if (*pType == TrackedMenuEntry)
165 {
166 if (pHmenu) *pHmenu = m_bandStack[m_bandCount].hmenu;
167 }
168 else
169 {
170 if (pMb) *pMb = m_bandStack[m_bandCount].mb;
171 }
172
173 return S_OK;
174}

Referenced by PopMenuBar(), PopMenuPopup(), and PopTrackedPopup().

◆ PopMenuBar()

HRESULT CMenuFocusManager::PopMenuBar ( CMenuBand mb)

Definition at line 924 of file CMenuFocusManager.cpp.

925{
927 CMenuBand * mbc;
928 HRESULT hr;
929
930 TRACE("PopMenuBar %p\n", mb);
931
933 {
935 }
936
937 hr = PopFromArray(&type, &mbc, NULL);
939 {
940 UpdateFocus();
941 return hr;
942 }
943
945 if (type != MenuBarEntry)
946 return E_FAIL;
947
948 if (!mbc)
949 return E_FAIL;
950
951 mbc->_SetParentBand(NULL);
952
953 mbc->Release();
954
955 hr = UpdateFocus();
957 return hr;
958
959 if (m_current)
960 {
963 }
964
965 return S_OK;
966}
#define _ASSERT(x)
HRESULT _SetChildBand(CMenuBand *child)
Definition: CMenuBand.cpp:603
HRESULT PopFromArray(StackEntryType *pType, CMenuBand **pMb, HMENU *pHmenu)
#define E_FAIL
Definition: ddrawi.h:102
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
char mbc

Referenced by CMenuBand::ShowDW().

◆ PopMenuPopup()

HRESULT CMenuFocusManager::PopMenuPopup ( CMenuBand mb)

Definition at line 969 of file CMenuFocusManager.cpp.

970{
972 CMenuBand * mbc;
973 HRESULT hr;
974
975 TRACE("PopMenuPopup %p\n", mb);
976
978 {
980 }
981
982 m_menuDepth--;
983
984 hr = PopFromArray(&type, &mbc, NULL);
986 {
987 UpdateFocus();
988 return hr;
989 }
990
992 if (type != MenuPopupEntry)
993 return E_FAIL;
994
995 if (!mbc)
996 return E_FAIL;
997
998 mbc->_SetParentBand(NULL);
999
1000 mbc->Release();
1001
1002 hr = UpdateFocus();
1004 return hr;
1005
1006 if (m_current)
1007 {
1010 }
1011
1012 return S_OK;
1013}

Referenced by CMenuBand::ShowDW().

◆ PopTrackedPopup()

HRESULT CMenuFocusManager::PopTrackedPopup ( HMENU  popup)

Definition at line 1016 of file CMenuFocusManager.cpp.

1017{
1019 HMENU hmenu;
1020 HRESULT hr;
1021
1022 TRACE("PopTrackedPopup %p\n", popup);
1023
1024 hr = PopFromArray(&type, NULL, &hmenu);
1026 {
1027 UpdateFocus();
1028 return hr;
1029 }
1030
1032 if (type != TrackedMenuEntry)
1033 return E_FAIL;
1034
1035 if (hmenu != popup)
1036 return E_FAIL;
1037
1038 hr = UpdateFocus();
1040 return hr;
1041
1042 return S_OK;
1043}
static HMENU hmenu
Definition: win.c:66

Referenced by CMenuBand::_TrackContextMenu(), and CMenuBand::_TrackSubMenu().

◆ ProcessMouseDown()

LRESULT CMenuFocusManager::ProcessMouseDown ( MSG msg,
BOOL  isLButton 
)
private

Definition at line 399 of file CMenuFocusManager.cpp.

400{
401 HWND child;
402 int iHitTestResult = -1;
403
404 TRACE("ProcessMouseDown %d %d %d\n", msg->message, msg->wParam, msg->lParam);
405
406 // Don't do anything if another window is capturing the mouse.
407 HWND cCapture = ::GetCapture();
408 if (cCapture && cCapture != m_captureHwnd && m_current->type != TrackedMenuEntry)
409 {
410 TRACE("Foreign capture active.\n");
411 return TRUE;
412 }
413
414 POINT pt = msg->pt;
415
417
418 StackEntry * entry = NULL;
420 {
421 TRACE("Foreign window detected.\n");
422 return TRUE;
423 }
424
425 if (entry->type == MenuBarEntry)
426 {
427 if (entry != m_current)
428 {
429 TRACE("Menubar with popup active.\n");
430 return TRUE;
431 }
432 }
433
434 if (entry)
435 {
437 iHitTestResult = SendMessageW(child, TB_HITTEST, 0, (LPARAM) &pt);
438
439 if (iHitTestResult >= 0)
440 {
441 TRACE("MouseDown send %d\n", iHitTestResult);
442 entry->mb->_MenuBarMouseDown(child, iHitTestResult, isLButton);
443 }
444 }
445
446 msg->message = WM_NULL;
447
450
451 TRACE("MouseDown end\n");
452
453 return TRUE;
454}
HRESULT IsTrackedWindow(HWND hWnd, StackEntry **pentry=NULL)
#define TB_HITTEST
Definition: commctrl.h:1268
LONG_PTR LPARAM
Definition: windef.h:208
HWND WINAPI GetCapture(void)
Definition: message.c:2881
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI ScreenToClient(_In_ HWND, _Inout_ LPPOINT)

Referenced by GetMsgHook().

◆ ProcessMouseMove()

LRESULT CMenuFocusManager::ProcessMouseMove ( MSG msg)
private

Definition at line 317 of file CMenuFocusManager.cpp.

318{
319 HWND child;
320 int iHitTestResult = -1;
321
322 POINT pt2 = { GET_X_LPARAM(msg->lParam), GET_Y_LPARAM(msg->lParam) };
323 ClientToScreen(msg->hwnd, &pt2);
324
325 POINT pt = msg->pt;
326
327 // Don't do anything if another window is capturing the mouse.
328 HWND cCapture = ::GetCapture();
329 if (cCapture && cCapture != m_captureHwnd && m_current->type != TrackedMenuEntry)
330 return TRUE;
331
333
334 m_ptPrev = pt;
335
337
338 StackEntry * entry = NULL;
340 {
341 TRACE("MouseMove\n");
342 }
343
344 BOOL isTracking = FALSE;
345 if (entry && (entry->type == MenuBarEntry || m_current->type != TrackedMenuEntry))
346 {
348 iHitTestResult = SendMessageW(child, TB_HITTEST, 0, (LPARAM) &pt);
349 isTracking = entry->mb->_IsTracking();
350
351 if (SendMessage(child, WM_USER_ISTRACKEDITEM, iHitTestResult, 0) == S_FALSE)
352 {
353 // The current tracked item has changed, notify the toolbar
354
355 TRACE("Hot item tracking detected a change (capture=%p / cCapture=%p)...\n", m_captureHwnd, cCapture);
357 if (isTracking && iHitTestResult >= 0 && m_current->type == TrackedMenuEntry)
358 SendMessage(entry->hwnd, WM_CANCELMODE, 0, 0);
359 PostMessage(child, WM_USER_CHANGETRACKEDITEM, iHitTestResult, MAKELPARAM(isTracking, TRUE));
361 return FALSE;
362 }
363 }
364
366 {
367 // Mouse moved away from a tracked window
369 {
371 }
372 }
373
374 if (m_hwndUnderMouse != child)
375 {
376 if (entry)
377 {
378 // Mouse moved to a tracked window
380 {
381 ScreenToClient(child, &pt2);
382 SendMessage(child, WM_MOUSEMOVE, msg->wParam, MAKELPARAM(pt2.x, pt2.y));
383 }
384 }
385
388 }
389
391 {
394 }
395
396 return TRUE;
397}
#define WM_USER_CHANGETRACKEDITEM
Definition: CMenuToolbars.h:26
#define WM_USER_ISTRACKEDITEM
Definition: CMenuToolbars.h:25
HRESULT _ChangeHotItem(CMenuToolbarBase *tb, INT id, DWORD dwFlags)
Definition: CMenuBand.cpp:879
#define HICF_MOUSE
Definition: commctrl.h:1326
#define GET_Y_LPARAM(lp)
Definition: windowsx.h:300
#define GA_ROOT
Definition: winuser.h:2789
#define MAKELPARAM(l, h)
Definition: winuser.h:4008
#define WM_CANCELMODE
Definition: winuser.h:1635
BOOL WINAPI ClientToScreen(_In_ HWND, _Inout_ LPPOINT)
#define SendMessage
Definition: winuser.h:5843
#define PostMessage
Definition: winuser.h:5832
HWND WINAPI GetAncestor(_In_ HWND, _In_ UINT)

Referenced by GetMsgHook(), and MsgFilterHook().

◆ ProcessMouseUp()

LRESULT CMenuFocusManager::ProcessMouseUp ( MSG msg,
BOOL  isLButton 
)
private

Definition at line 456 of file CMenuFocusManager.cpp.

457{
458 HWND child;
459 int iHitTestResult = -1;
460
461 TRACE("ProcessMouseUp %d %d %d\n", msg->message, msg->wParam, msg->lParam);
462
463 // Don't do anything if another window is capturing the mouse.
464 HWND cCapture = ::GetCapture();
465 if (cCapture && cCapture != m_captureHwnd && m_current->type != TrackedMenuEntry)
466 return TRUE;
467
468 POINT pt = msg->pt;
469
471
472 StackEntry * entry = NULL;
474 return TRUE;
475
476 if (entry)
477 {
479 iHitTestResult = SendMessageW(child, TB_HITTEST, 0, (LPARAM) &pt);
480
481 if (iHitTestResult >= 0)
482 {
483 TRACE("MouseUp send %d\n", iHitTestResult);
484 entry->mb->_MenuBarMouseUp(child, iHitTestResult, isLButton);
485 }
486 }
487
488 return TRUE;
489}

Referenced by GetMsgHook().

◆ PushMenuBar()

HRESULT CMenuFocusManager::PushMenuBar ( CMenuBand mb)

Definition at line 862 of file CMenuFocusManager.cpp.

863{
864 TRACE("PushMenuBar %p\n", mb);
865
866 mb->AddRef();
867
868 _ASSERT(m_bandCount == 0);
869
872 return hr;
873
874 return UpdateFocus();
875}
HRESULT PushToArray(StackEntryType type, CMenuBand *mb, HMENU hmenu)
ULONG AddRef()

Referenced by CMenuBand::ShowDW().

◆ PushMenuPopup()

HRESULT CMenuFocusManager::PushMenuPopup ( CMenuBand mb)

Definition at line 878 of file CMenuFocusManager.cpp.

879{
880 TRACE("PushTrackedPopup %p\n", mb);
881
882 mb->AddRef();
883
885
888 return hr;
889
890 hr = UpdateFocus();
891
892 m_menuDepth++;
893
895 {
898 }
899
900 return hr;
901}
HRESULT _SetParentBand(CMenuBand *parent)
Definition: CMenuBand.cpp:614

Referenced by CMenuBand::ShowDW().

◆ PushToArray()

HRESULT CMenuFocusManager::PushToArray ( StackEntryType  type,
CMenuBand mb,
HMENU  hmenu 
)
private

Definition at line 139 of file CMenuFocusManager.cpp.

140{
142 return E_OUTOFMEMORY;
143
147 m_bandCount++;
148
149 return S_OK;
150}
#define MAX_RECURSE
#define E_OUTOFMEMORY
Definition: ddrawi.h:100

Referenced by PushMenuBar(), PushMenuPopup(), and PushTrackedPopup().

◆ PushTrackedPopup()

HRESULT CMenuFocusManager::PushTrackedPopup ( HMENU  popup)

Definition at line 904 of file CMenuFocusManager.cpp.

905{
906 TRACE("PushTrackedPopup %p\n", popup);
907
908 _ASSERT(m_bandCount > 0);
910
913 return hr;
914
915 TRACE("PushTrackedPopup %p\n", popup);
916 m_selectedMenu = popup;
917 m_selectedItem = -1;
919
920 return UpdateFocus();
921}

Referenced by CMenuBand::_TrackContextMenu(), and CMenuBand::_TrackSubMenu().

◆ ReleaseManager()

void CMenuFocusManager::ReleaseManager ( CMenuFocusManager obj)
static

Definition at line 121 of file CMenuFocusManager.cpp.

122{
123 if (!obj->Release())
124 {
126 }
127}

Referenced by CMenuBand::~CMenuBand().

◆ RemoveHooks()

HRESULT CMenuFocusManager::RemoveHooks ( )
private

Definition at line 695 of file CMenuFocusManager.cpp.

696{
698 {
699 TRACE("Removing MSGFILTER hook...\n");
702 }
703 if (m_hGetMsgHook)
704 {
705 TRACE("Removing GETMESSAGE hook...\n");
708 }
709 return S_OK;
710}
BOOL WINAPI UnhookWindowsHookEx(_In_ HHOOK)

Referenced by UpdateFocus().

◆ s_GetMsgHook()

LRESULT CALLBACK CMenuFocusManager::s_GetMsgHook ( INT  nCode,
WPARAM  wParam,
LPARAM  lParam 
)
staticprivate

Definition at line 134 of file CMenuFocusManager.cpp.

135{
136 return GetManager()->GetMsgHook(nCode, wParam, lParam);
137}
LRESULT GetMsgHook(INT nCode, WPARAM wParam, LPARAM lParam)
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139

Referenced by PlaceHooks().

◆ s_MsgFilterHook()

LRESULT CALLBACK CMenuFocusManager::s_MsgFilterHook ( INT  nCode,
WPARAM  wParam,
LPARAM  lParam 
)
staticprivate

Definition at line 129 of file CMenuFocusManager.cpp.

130{
131 return GetManager()->MsgFilterHook(nCode, wParam, lParam);
132}
LRESULT MsgFilterHook(INT nCode, WPARAM wParam, LPARAM lParam)

Referenced by PlaceHooks().

◆ SetMenuCapture()

void CMenuFocusManager::SetMenuCapture ( HWND  child)
private

Definition at line 237 of file CMenuFocusManager.cpp.

238{
239 if (m_captureHwnd != child)
240 {
241 if (child)
242 {
245 TRACE("Capturing %p\n", child);
246 }
247 else
248 {
251 TRACE("Capture is now off\n");
252 }
253
254 }
255}
HWND WINAPI SetCapture(_In_ HWND hWnd)
BOOL WINAPI ReleaseCapture(void)
Definition: message.c:2890

Referenced by UpdateFocus().

◆ UpdateFocus()

HRESULT CMenuFocusManager::UpdateFocus ( )
private

Definition at line 713 of file CMenuFocusManager.cpp.

714{
715 HRESULT hr;
716 StackEntry * old = m_current;
717
718 TRACE("UpdateFocus\n");
719
720 // Assign the new current item
721 if (m_bandCount > 0)
723 else
724 m_current = NULL;
725
726 // Remove the menu capture if necesary
728 {
730 if (old && old->type == MenuPopupEntry && m_PreviousForeground)
731 {
734 }
735 }
736
737 // Obtain the top-level window for the new active menu
739 {
742 return hr;
743 }
744
745 // Refresh the parent pointer
746 if (m_bandCount >= 2)
747 {
750 }
751 else
752 {
753 m_parent = NULL;
754 }
755
756 // Refresh the menubar pointer, if applicable
757 if (m_bandCount >= 1 && m_bandStack[0].type == MenuBarEntry)
758 {
759 m_menuBar = &(m_bandStack[0]);
760 }
761 else
762 {
763 m_menuBar = NULL;
764 }
765
766 // Remove the old hooks if the menu type changed, or we don't have a menu anymore
767 if (old && (!m_current || old->type != m_current->type))
768 {
770 {
772 }
773
774 hr = RemoveHooks();
776 return hr;
777 }
778
779 // And place new ones if necessary
780 if (m_current && (!old || old->type != m_current->type))
781 {
782 hr = PlaceHooks();
784 return hr;
785 }
786
787 // Give the user a chance to move the mouse to the new menu
788 if (m_parent)
789 {
791 }
792
794 {
795 if (m_captureHwnd == NULL)
796 {
797 // We need to restore the capture after a non-shell submenu or context menu is shown
798 StackEntry * topMenu = m_bandStack;
799 if (topMenu->type == MenuBarEntry)
800 topMenu++;
801
802 // Get the top-level window from the top popup
803 CComPtr<IServiceProvider> bandSite;
804 CComPtr<IOleWindow> deskBar;
805 hr = topMenu->mb->GetSite(IID_PPV_ARG(IServiceProvider, &bandSite));
806 if (FAILED(hr))
807 goto NoCapture;
808 hr = bandSite->QueryService(SID_SMenuPopup, IID_PPV_ARG(IOleWindow, &deskBar));
809 if (FAILED(hr))
810 goto NoCapture;
811
812 CComPtr<IOleWindow> deskBarSite;
813 hr = IUnknown_GetSite(deskBar, IID_PPV_ARG(IOleWindow, &deskBarSite));
814 if (FAILED(hr))
815 goto NoCapture;
816
817 // FIXME: Find the correct place for this
818 HWND hWndOwner;
819 hr = deskBarSite->GetWindow(&hWndOwner);
820 if (FAILED(hr))
821 goto NoCapture;
822
824 if (m_PreviousForeground != hWndOwner)
825 ::SetForegroundWindow(hWndOwner);
826 else
828
829 // Get the HWND of the top-level window
830 HWND hWndSite;
831 hr = deskBar->GetWindow(&hWndSite);
832 if (FAILED(hr))
833 goto NoCapture;
834 SetMenuCapture(hWndSite);
835 }
836NoCapture:
837
839 {
840 if (old && old->type == TrackedMenuEntry)
841 {
842 // FIXME: Debugging code, probably not right
843 POINT pt2;
844 RECT rc2;
845 GetCursorPos(&pt2);
848 if (PtInRect(&rc2, pt2))
850 else
852 }
853 }
854 }
855
857
858 return S_OK;
859}
HRESULT _GetTopLevelWindow(HWND *topLevel)
Definition: CMenuBand.cpp:873
void SetMenuCapture(HWND child)
static const WCHAR rc2[]
Definition: oid.c:1216
HRESULT WINAPI IUnknown_GetSite(LPUNKNOWN lpUnknown, REFIID iid, PVOID *lppSite)
Definition: ordinal.c:2638
#define FAILED(hr)
Definition: intsafe.h:51
HWND WINAPI GetForegroundWindow(void)
Definition: ntwrapper.h:392
BOOL WINAPI SetForegroundWindow(_In_ HWND)
BOOL WINAPI GetCursorPos(_Out_ LPPOINT)
Definition: cursoricon.c:2670
BOOL WINAPI PtInRect(_In_ LPCRECT, _In_ POINT)
BOOL WINAPI GetClientRect(_In_ HWND, _Out_ LPRECT)

Referenced by PopMenuBar(), PopMenuPopup(), PopTrackedPopup(), PushMenuBar(), PushMenuPopup(), and PushTrackedPopup().

Member Data Documentation

◆ m_bandCount

int CMenuFocusManager::m_bandCount
private

◆ m_bandStack

StackEntry CMenuFocusManager::m_bandStack[MAX_RECURSE]
private

◆ m_captureHwnd

HWND CMenuFocusManager::m_captureHwnd
private

◆ m_current

◆ m_entryUnderMouse

StackEntry* CMenuFocusManager::m_entryUnderMouse
private

Definition at line 74 of file CMenuFocusManager.h.

Referenced by PopMenuBar(), PopMenuPopup(), and ProcessMouseMove().

◆ m_hGetMsgHook

HHOOK CMenuFocusManager::m_hGetMsgHook
private

Definition at line 64 of file CMenuFocusManager.h.

Referenced by GetMsgHook(), PlaceHooks(), and RemoveHooks().

◆ m_hMsgFilterHook

HHOOK CMenuFocusManager::m_hMsgFilterHook
private

Definition at line 63 of file CMenuFocusManager.h.

Referenced by MsgFilterHook(), PlaceHooks(), and RemoveHooks().

◆ m_hwndUnderMouse

HWND CMenuFocusManager::m_hwndUnderMouse
private

Definition at line 73 of file CMenuFocusManager.h.

Referenced by ProcessMouseMove().

◆ m_menuBar

StackEntry* CMenuFocusManager::m_menuBar
private

Definition at line 61 of file CMenuFocusManager.h.

Referenced by GetMsgHook(), MsgFilterHook(), and UpdateFocus().

◆ m_menuDepth

int CMenuFocusManager::m_menuDepth
private

Definition at line 89 of file CMenuFocusManager.h.

Referenced by PopMenuPopup(), and PushMenuPopup().

◆ m_mouseTrackDisabled

BOOL CMenuFocusManager::m_mouseTrackDisabled
private

Definition at line 67 of file CMenuFocusManager.h.

Referenced by DisableMouseTrack().

◆ m_movedSinceDown

BOOL CMenuFocusManager::m_movedSinceDown
private

Definition at line 80 of file CMenuFocusManager.h.

Referenced by ProcessMouseDown(), and ProcessMouseMove().

◆ m_parent

StackEntry* CMenuFocusManager::m_parent
private

Definition at line 60 of file CMenuFocusManager.h.

Referenced by MsgFilterHook(), PushMenuPopup(), and UpdateFocus().

◆ m_PreviousForeground

HWND CMenuFocusManager::m_PreviousForeground
private

Definition at line 83 of file CMenuFocusManager.h.

Referenced by UpdateFocus().

◆ m_ptPrev

POINT CMenuFocusManager::m_ptPrev
private

Definition at line 69 of file CMenuFocusManager.h.

Referenced by CMenuFocusManager(), and ProcessMouseMove().

◆ m_selectedItem

INT CMenuFocusManager::m_selectedItem
private

Definition at line 77 of file CMenuFocusManager.h.

Referenced by MsgFilterHook(), and PushTrackedPopup().

◆ m_selectedItemFlags

DWORD CMenuFocusManager::m_selectedItemFlags
private

Definition at line 78 of file CMenuFocusManager.h.

Referenced by MsgFilterHook(), and PushTrackedPopup().

◆ m_selectedMenu

HMENU CMenuFocusManager::m_selectedMenu
private

Definition at line 76 of file CMenuFocusManager.h.

Referenced by MsgFilterHook(), and PushTrackedPopup().

◆ m_threadId

DWORD CMenuFocusManager::m_threadId
private

Definition at line 65 of file CMenuFocusManager.h.

Referenced by CMenuFocusManager(), and PlaceHooks().

◆ m_windowAtDown

HWND CMenuFocusManager::m_windowAtDown
private

Definition at line 81 of file CMenuFocusManager.h.

Referenced by ProcessMouseDown().

◆ TlsIndex

DWORD CMenuFocusManager::TlsIndex = 0
staticprivate

Definition at line 29 of file CMenuFocusManager.h.

Referenced by AcquireManager(), GetManager(), and ReleaseManager().


The documentation for this class was generated from the following files: