From 78790baf2e631607b131424df3399f2bb886c743 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Tue, 22 Apr 2014 17:44:19 +0000 Subject: [PATCH] [RSHELL] * Almost working keyboard navigation on horizontal menu bar. It does not yet switch between menus when a submenu of the shell menu is currently open and you press [right]. CORE-7586 svn path=/branches/shell-experiments/; revision=62891 --- base/shell/rshell/CMenuBand.cpp | 10 +++++----- base/shell/rshell/CMenuFocusManager.cpp | 8 ++++---- base/shell/rshell/CMenuToolbars.cpp | 13 +++++++------ base/shell/rshell/CMenuToolbars.h | 2 +- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/base/shell/rshell/CMenuBand.cpp b/base/shell/rshell/CMenuBand.cpp index ded18a1cac2..75142556a91 100644 --- a/base/shell/rshell/CMenuBand.cpp +++ b/base/shell/rshell/CMenuBand.cpp @@ -715,23 +715,23 @@ HRESULT CMenuBand::_TrackContextMenu(IContextMenu * contextMenu, INT x, INT y) if (popup == NULL) return E_FAIL; - DbgPrint("Before Query\n"); + TRACE("Before Query\n"); hr = contextMenu->QueryContextMenu(popup, 0, 0, UINT_MAX, CMF_NORMAL); if (FAILED_UNEXPECTEDLY(hr)) { - DbgPrint("Query failed\n"); + TRACE("Query failed\n"); DestroyMenu(popup); return hr; } HWND hwnd = m_menuOwner ? m_menuOwner : m_topLevelWindow; - DbgPrint("Before Tracking\n"); + TRACE("Before Tracking\n"); uCommand = ::TrackPopupMenuEx(popup, TPM_RETURNCMD, x, y, hwnd, NULL); if (uCommand != 0) { - DbgPrint("Before InvokeCommand\n"); + TRACE("Before InvokeCommand\n"); CMINVOKECOMMANDINFO cmi = { 0 }; cmi.cbSize = sizeof(cmi); cmi.lpVerb = MAKEINTRESOURCEA(uCommand); @@ -740,7 +740,7 @@ HRESULT CMenuBand::_TrackContextMenu(IContextMenu * contextMenu, INT x, INT y) } else { - DbgPrint("TrackPopupMenu failed. Code=%d, LastError=%d\n", uCommand, GetLastError()); + TRACE("TrackPopupMenu failed. Code=%d, LastError=%d\n", uCommand, GetLastError()); hr = S_FALSE; } diff --git a/base/shell/rshell/CMenuFocusManager.cpp b/base/shell/rshell/CMenuFocusManager.cpp index 5018ef81809..1ed206944ba 100644 --- a/base/shell/rshell/CMenuFocusManager.cpp +++ b/base/shell/rshell/CMenuFocusManager.cpp @@ -288,7 +288,7 @@ LRESULT CMenuFocusManager::ProcessMouseMove(MSG* msg) DisableMouseTrack(NULL, FALSE); if (isTracking && iHitTestResult>=0 && m_current->type == TrackedMenuEntry) SendMessage(entry->hwnd, WM_CANCELMODE, 0, 0); - PostMessage(child, WM_USER_CHANGETRACKEDITEM, iHitTestResult, isTracking); + PostMessage(child, WM_USER_CHANGETRACKEDITEM, iHitTestResult, MAKELPARAM(isTracking, TRUE)); if (m_current->type == TrackedMenuEntry) return FALSE; } @@ -359,13 +359,13 @@ LRESULT CMenuFocusManager::MsgFilterHook(INT nCode, WPARAM hookWParam, LPARAM ho callNext = ProcessMouseMove(msg); break; case WM_INITMENUPOPUP: - DbgPrint("WM_INITMENUPOPUP %p %p\n", msg->wParam, msg->lParam); + TRACE("WM_INITMENUPOPUP %p %p\n", msg->wParam, msg->lParam); m_selectedMenu = reinterpret_cast(msg->lParam); m_selectedItem = -1; m_selectedItemFlags = 0; break; case WM_MENUSELECT: - DbgPrint("WM_MENUSELECT %p %p\n", msg->wParam, msg->lParam); + TRACE("WM_MENUSELECT %p %p\n", msg->wParam, msg->lParam); m_selectedMenu = reinterpret_cast(msg->lParam); m_selectedItem = GET_X_LPARAM(msg->wParam); m_selectedItemFlags = HIWORD(msg->wParam); @@ -621,7 +621,7 @@ HRESULT CMenuFocusManager::PushTrackedPopup(HMENU popup) if (FAILED_UNEXPECTEDLY(hr)) return hr; - DbgPrint("PushTrackedPopup %p\n", popup); + TRACE("PushTrackedPopup %p\n", popup); m_selectedMenu = popup; m_selectedItem = -1; m_selectedItemFlags = 0; diff --git a/base/shell/rshell/CMenuToolbars.cpp b/base/shell/rshell/CMenuToolbars.cpp index 9368e5a3f69..f6c90af4bd5 100644 --- a/base/shell/rshell/CMenuToolbars.cpp +++ b/base/shell/rshell/CMenuToolbars.cpp @@ -131,7 +131,7 @@ LRESULT CMenuToolbarBase::SubclassProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPAR return IsTrackedItem(wParam); case WM_USER_CHANGETRACKEDITEM: m_SubclassOld(hWnd, uMsg, wParam, lParam); - return ChangeTrackedItem(wParam, lParam); + return ChangeTrackedItem(wParam, LOWORD(lParam), HIWORD(lParam)); case WM_COMMAND: OnWinEvent(hWnd, uMsg, wParam, lParam, &lr); @@ -604,6 +604,7 @@ HRESULT CMenuToolbarBase::ChangeHotItem(CMenuToolbarBase * toolbar, INT item, DW SendMessage(m_hwndToolbar, TB_SETHOTITEM, (WPARAM) -1, 0); } + TRACE("Hot item changed from %p %p, to %p %p\n", m_hotBar, m_hotItem, toolbar, item); m_hotBar = toolbar; m_hotItem = item; @@ -690,7 +691,7 @@ HRESULT CMenuToolbarBase::IsTrackedItem(INT index) return S_FALSE; } -HRESULT CMenuToolbarBase::ChangeTrackedItem(INT index, BOOL wasTracking) +HRESULT CMenuToolbarBase::ChangeTrackedItem(INT index, BOOL wasTracking, BOOL mouse) { TBBUTTON btn; @@ -703,9 +704,9 @@ HRESULT CMenuToolbarBase::ChangeTrackedItem(INT index, BOOL wasTracking) if (!SendMessage(m_hwndToolbar, TB_GETBUTTON, index, reinterpret_cast(&btn))) return E_FAIL; - DbgPrint("ChangeTrackedItem %d, %d\n", index, wasTracking); + TRACE("ChangeTrackedItem %d, %d\n", index, wasTracking); m_isTrackingPopup = wasTracking; - return m_menuBand->_ChangeHotItem(this, btn.idCommand, HICF_MOUSE); + return m_menuBand->_ChangeHotItem(this, btn.idCommand, mouse ? HICF_MOUSE : 0); } HRESULT CMenuToolbarBase::PopupSubMenu(UINT iItem, UINT index, IShellMenu* childShellMenu) @@ -912,13 +913,13 @@ HRESULT CMenuToolbarBase::KeyboardItemChange(DWORD dwSelectType) { if (prev != btn.idCommand) { - DbgPrint("Setting Hot item to %d\n", index); + TRACE("Setting Hot item to %d\n", index); if (!(m_initFlags & SMINIT_VERTICAL) && m_isTrackingPopup) { HWND tlw; m_menuBand->_GetTopLevelWindow(&tlw); SendMessage(tlw, WM_CANCELMODE, 0, 0); - PostMessage(m_hwndToolbar, WM_USER_CHANGETRACKEDITEM, index, m_isTrackingPopup); + PostMessage(m_hwndToolbar, WM_USER_CHANGETRACKEDITEM, index, MAKELPARAM(m_isTrackingPopup, FALSE)); } else m_menuBand->_ChangeHotItem(this, btn.idCommand, 0); diff --git a/base/shell/rshell/CMenuToolbars.h b/base/shell/rshell/CMenuToolbars.h index a35d95a03e3..65b132b24ce 100644 --- a/base/shell/rshell/CMenuToolbars.h +++ b/base/shell/rshell/CMenuToolbars.h @@ -78,7 +78,7 @@ public: HRESULT KeyboardItemChange(DWORD changeType); HRESULT IsTrackedItem(INT index); - HRESULT ChangeTrackedItem(INT index, BOOL wasTracking); + HRESULT ChangeTrackedItem(INT index, BOOL wasTracking, BOOL mouse); HRESULT GetSizes(SIZE* pMinSize, SIZE* pMaxSize, SIZE* pIntegralSize); HRESULT SetPosSize(int x, int y, int cx, int cy);