From dcbd65feca7c9c410ef8fea26779cfe5070b4196 Mon Sep 17 00:00:00 2001 From: David Quintana Date: Sun, 23 Feb 2014 00:15:27 +0000 Subject: [PATCH] [RSHELL] * CMenuDeskBar: Actually use the Popup flags to decide on the relative position of the submenus. CORE-7886 svn path=/branches/shell-experiments/; revision=62296 --- base/shell/rshell/CMenuBand.cpp | 13 ++++++------ base/shell/rshell/CMenuDeskBar.cpp | 32 +++++++++++++++++++++++------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/base/shell/rshell/CMenuBand.cpp b/base/shell/rshell/CMenuBand.cpp index 7641ad075aa..c3408ddce31 100644 --- a/base/shell/rshell/CMenuBand.cpp +++ b/base/shell/rshell/CMenuBand.cpp @@ -727,7 +727,7 @@ HRESULT CMenuToolbarBase::PopupSubMenu(UINT index, IShellMenu* childShellMenu) ClientToScreen(m_hwnd, &a); ClientToScreen(m_hwnd, &b); - POINTL pt = { b.x, b.y }; + POINTL pt = { b.x, a.y }; RECTL rcl = { a.x, a.y, b.x, b.y }; // maybe-TODO: fetch client area of deskbar? @@ -1580,6 +1580,8 @@ HRESULT STDMETHODCALLTYPE CMenuBand::GetBandInfo( pdbi->dwMask = DBIM_MINSIZE | DBIM_MAXSIZE | DBIM_INTEGRAL | DBIM_ACTUAL | DBIM_TITLE | DBIM_MODEFLAGS | DBIM_BKCOLOR; } +#define MIN_WIDTH 220 + if (pdbi->dwMask & DBIM_MINSIZE) { SIZE sizeStatic = { 0 }; @@ -1588,7 +1590,7 @@ HRESULT STDMETHODCALLTYPE CMenuBand::GetBandInfo( if (hwndStatic) SendMessageW(hwndStatic, TB_GETIDEALSIZE, TRUE, reinterpret_cast(&sizeStatic)); if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETIDEALSIZE, TRUE, reinterpret_cast(&sizeShlFld)); - pdbi->ptMinSize.x = 0; + pdbi->ptMinSize.x = MIN_WIDTH; pdbi->ptMinSize.y = sizeStatic.cy + sizeShlFld.cy; } if (pdbi->dwMask & DBIM_MAXSIZE) @@ -1599,10 +1601,7 @@ HRESULT STDMETHODCALLTYPE CMenuBand::GetBandInfo( if (hwndStatic) SendMessageW(hwndStatic, TB_GETMAXSIZE, 0, reinterpret_cast(&sizeStatic)); if (hwndShlFld) SendMessageW(hwndShlFld, TB_GETMAXSIZE, 0, reinterpret_cast(&sizeShlFld)); - sizeStatic.cx += 64; - sizeShlFld.cx += 64; - - pdbi->ptMaxSize.x = max(sizeStatic.cx, sizeShlFld.cx); // ignored + pdbi->ptMaxSize.x = max(MIN_WIDTH, max(sizeStatic.cx, sizeShlFld.cx)); // ignored pdbi->ptMaxSize.y = sizeStatic.cy + sizeShlFld.cy; } if (pdbi->dwMask & DBIM_INTEGRAL) @@ -2242,7 +2241,7 @@ HRESULT CMenuBand::_OnPopupSubMenu(IMenuPopup * popup, POINTL * pAt, RECTL * pEx if (popup) { IUnknown_SetSite(popup, m_subMenuParent); - popup->Popup(pAt, pExclude, MPPF_TOP | MPPF_RIGHT); + popup->Popup(pAt, pExclude, MPPF_RIGHT); } return S_OK; } diff --git a/base/shell/rshell/CMenuDeskBar.cpp b/base/shell/rshell/CMenuDeskBar.cpp index 2ffed5dd70c..8deaedf8f33 100644 --- a/base/shell/rshell/CMenuDeskBar.cpp +++ b/base/shell/rshell/CMenuDeskBar.cpp @@ -399,8 +399,6 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBar::Popup(POINTL *ppt, RECTL *prcExclude, MP return hr; ::AdjustWindowRect(&rc, ::GetWindowLong(m_hWnd, GWL_STYLE), FALSE); - rc.right -= rc.left; - rc.bottom -= rc.top; if (m_Banner != NULL) { @@ -409,16 +407,36 @@ HRESULT STDMETHODCALLTYPE CMenuDeskBar::Popup(POINTL *ppt, RECTL *prcExclude, MP rc.right += bm.bmWidth; } - int x = ppt->x; - int y = ppt->y - rc.bottom; - int cx = rc.right; - int cy = rc.bottom; + int x, y, cx, cy; RECT rcWorkArea; SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0); - int waHeight = rcWorkArea.bottom - rcWorkArea.top; + switch (dwFlags & MPPF_POS_MASK) + { + case MPPF_LEFT: + case MPPF_TOP: + x = ppt->x - rc.right; + cx = rc.right - rc.left; + break; + default: + x = ppt->x; + cx = rc.right - rc.left; + break; + } + + if (dwFlags & MPPF_BOTTOM) + { + y = ppt->y - rc.bottom; + cy = rc.bottom - rc.top; + } + else + { + y = ppt->y + rc.top; + cy = rc.bottom - rc.top; + } + if (y < rcWorkArea.top) { y = rcWorkArea.top;