From: David Quintana Date: Wed, 9 Jul 2014 00:42:05 +0000 (+0000) Subject: [RSHELL] X-Git-Tag: backups/shell-experiments@75904~201 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=0ffe346179aebdb01d7aee6534bba3094afe0e2c [RSHELL] * CFocusManager: Try to fix some weird behaviour. * CMergedFolder: Downgrade some prints to TRACEs, and implement a couple methods needed by some debugging code. * Activate merged folders by default. TODO: implement the filtering of the "Programs" submenu, and use it for the real Programs menu item. [SHELL32] * defcontextmenu.cpp: Make a copy of the apidl array before storing it for later, since it may be a pointer to the stack which may not be available later. Fixes the merged folders not working on clicks and context menu. * shlmenu.cpp: While debugging, I made Shell_MergeMenus closer to WINE's. svn path=/branches/shell-experiments/; revision=63702 --- diff --git a/base/shell/rshell/CMenuFocusManager.cpp b/base/shell/rshell/CMenuFocusManager.cpp index 602a3a5c519..1d556fc32f8 100644 --- a/base/shell/rshell/CMenuFocusManager.cpp +++ b/base/shell/rshell/CMenuFocusManager.cpp @@ -319,7 +319,7 @@ LRESULT CMenuFocusManager::ProcessMouseMove(MSG* msg) } BOOL isTracking = FALSE; - if (entry) + if (entry && (entry->type == MenuBarEntry || m_current->type != TrackedMenuEntry)) { ScreenToClient(child, &pt); iHitTestResult = SendMessageW(child, TB_HITTEST, 0, (LPARAM) &pt); @@ -485,9 +485,23 @@ LRESULT CMenuFocusManager::MsgFilterHook(INT nCode, WPARAM hookWParam, LPARAM ho if (hoveringMenuBar) { m_menuBar->mb->_DisableMouseTrack(TRUE); + if (m_current->type == TrackedMenuEntry) + { + SendMessage(m_parent->hwnd, WM_CANCELMODE, 0, 0); + msg->message = WM_NULL; + } } } break; + case WM_NCLBUTTONUP: + case WM_LBUTTONUP: + case WM_NCRBUTTONUP: + case WM_RBUTTONUP: + if (m_current && m_current->type != TrackedMenuEntry) + { + msg->message = WM_NULL; + } + break; case WM_MOUSEMOVE: callNext = ProcessMouseMove(msg); break; diff --git a/base/shell/rshell/CMenuToolbars.cpp b/base/shell/rshell/CMenuToolbars.cpp index 60ee65cca99..4b723706926 100644 --- a/base/shell/rshell/CMenuToolbars.cpp +++ b/base/shell/rshell/CMenuToolbars.cpp @@ -63,7 +63,7 @@ HRESULT CMenuToolbarBase::OnWinEvent(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM return OnPagerCalcSize(reinterpret_cast(hdr)); case TBN_DROPDOWN: - return OnCommand(reinterpret_cast(hdr)->iItem, 0, theResult); + return ProcessClick(reinterpret_cast(hdr)->iItem); case TBN_HOTITEMCHANGE: //return OnHotItemChange(reinterpret_cast(hdr), theResult); @@ -798,11 +798,10 @@ HRESULT CMenuToolbarBase::TrackContextMenu(IContextMenu* contextMenu, POINT pt) return m_menuBand->_TrackContextMenu(contextMenu, pt.x, pt.y); } -HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult) +HRESULT CMenuToolbarBase::ProcessClick(INT iItem) { if (m_disableMouseTrack) { - *theResult = 1; TRACE("Item click prevented by DisableMouseTrack\n"); return S_OK; } @@ -814,10 +813,6 @@ HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theRe return S_FALSE; } - *theResult = 0; - - INT iItem = (INT)wParam; - if (PopupItem(iItem, FALSE) == S_OK) { TRACE("PopupItem returned S_OK\n"); @@ -829,28 +824,26 @@ HRESULT CMenuToolbarBase::OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theRe return m_menuBand->_MenuItemHotTrack(MPOS_EXECUTE); } -HRESULT CMenuToolbarBase::MenuBarMouseDown(INT item) +HRESULT CMenuToolbarBase::MenuBarMouseDown(INT iIndex) { - LRESULT theResult; TBBUTTON btn; if (m_initFlags & SMINIT_VERTICAL) return S_OK; - SendMessage(m_hwndToolbar, TB_GETBUTTON, item, reinterpret_cast(&btn)); - return OnCommand(btn.idCommand, 0, &theResult); + ::SendMessageW(m_hwndToolbar, TB_GETBUTTON, iIndex, reinterpret_cast(&btn)); + return ProcessClick(btn.idCommand); } -HRESULT CMenuToolbarBase::MenuBarMouseUp(INT item) +HRESULT CMenuToolbarBase::MenuBarMouseUp(INT iIndex) { - LRESULT theResult; TBBUTTON btn; if (!(m_initFlags & SMINIT_VERTICAL)) return S_OK; - SendMessage(m_hwndToolbar, TB_GETBUTTON, item, reinterpret_cast(&btn)); - return OnCommand(btn.idCommand, 0, &theResult); + ::SendMessageW(m_hwndToolbar, TB_GETBUTTON, iIndex, reinterpret_cast(&btn)); + return ProcessClick(btn.idCommand); } HRESULT CMenuToolbarBase::ExecuteItem(INT iItem) diff --git a/base/shell/rshell/CMenuToolbars.h b/base/shell/rshell/CMenuToolbars.h index 87ef81749e6..ad9db719add 100644 --- a/base/shell/rshell/CMenuToolbars.h +++ b/base/shell/rshell/CMenuToolbars.h @@ -97,8 +97,9 @@ public: HRESULT KillPopupTimer(); - HRESULT MenuBarMouseDown(INT item); - HRESULT MenuBarMouseUp(INT item); + HRESULT MenuBarMouseDown(INT iIndex); + HRESULT MenuBarMouseUp(INT iIndex); + HRESULT ProcessClick(INT iItem); protected: virtual HRESULT OnDeletingButton(const NMTOOLBAR * tb) = 0; @@ -119,7 +120,6 @@ protected: private: HRESULT UpdateImageLists(); - HRESULT OnCommand(WPARAM wParam, LPARAM lParam, LRESULT *theResult); HRESULT OnPagerCalcSize(LPNMPGCALCSIZE csize); HRESULT OnPopupTimer(DWORD timerId); HRESULT OnContextMenu(NMMOUSE * rclick); diff --git a/base/shell/rshell/CMergedFolder.cpp b/base/shell/rshell/CMergedFolder.cpp index 2e1669049f0..73731b83081 100644 --- a/base/shell/rshell/CMergedFolder.cpp +++ b/base/shell/rshell/CMergedFolder.cpp @@ -394,7 +394,7 @@ HRESULT STDMETHODCALLTYPE CMergedFolder::EnumObjects( SHCONTF grfFlags, IEnumIDList **ppenumIDList) { - DbgPrint("EnumObjects\n"); + TRACE("EnumObjects\n"); HRESULT hr = m_EnumSource->QueryInterface(IID_PPV_ARG(IEnumIDList, ppenumIDList)); if (FAILED_UNEXPECTEDLY(hr)) return hr; @@ -410,7 +410,7 @@ HRESULT STDMETHODCALLTYPE CMergedFolder::BindToObject( LocalPidlInfo info; HRESULT hr; - DbgPrint("BindToObject\n"); + TRACE("BindToObject\n"); hr = m_EnumSource->FindPidlInList(pidl, &info); if (FAILED_UNEXPECTEDLY(hr)) @@ -451,7 +451,7 @@ HRESULT STDMETHODCALLTYPE CMergedFolder::CompareIDs( LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { - DbgPrint("CompareIDs\n"); + TRACE("CompareIDs\n"); return m_UserLocal->CompareIDs(lParam, pidl1, pidl2); } @@ -472,7 +472,7 @@ HRESULT STDMETHODCALLTYPE CMergedFolder::GetAttributesOf( LocalPidlInfo info; HRESULT hr; - DbgPrint("GetAttributesOf\n"); + TRACE("GetAttributesOf\n"); for (int i = 0; i < (int)cidl; i++) { @@ -506,7 +506,7 @@ HRESULT STDMETHODCALLTYPE CMergedFolder::GetUIObjectOf( LocalPidlInfo info; HRESULT hr; - DbgPrint("GetUIObjectOf\n"); + TRACE("GetUIObjectOf\n"); for (int i = 0; i < (int)cidl; i++) { @@ -542,7 +542,7 @@ HRESULT STDMETHODCALLTYPE CMergedFolder::GetDisplayNameOf( LocalPidlInfo info; HRESULT hr; - DbgPrint("GetDisplayNameOf\n"); + TRACE("GetDisplayNameOf\n"); hr = m_EnumSource->FindPidlInList(pidl, &info); if (FAILED_UNEXPECTEDLY(hr)) @@ -625,8 +625,24 @@ HRESULT STDMETHODCALLTYPE CMergedFolder::GetDetailsEx( const SHCOLUMNID *pscid, VARIANT *pv) { - UNIMPLEMENTED; - return E_NOTIMPL; + LocalPidlInfo info; + HRESULT hr; + + TRACE("GetDetailsEx\n"); + + hr = m_EnumSource->FindPidlInList(pidl, &info); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + CComPtr parent2; + hr = info.parent->QueryInterface(IID_PPV_ARG(IShellFolder2, &parent2)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + hr = parent2->GetDetailsEx(info.pidl, pscid, pv); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + return S_OK; } HRESULT STDMETHODCALLTYPE CMergedFolder::GetDetailsOf( @@ -634,8 +650,25 @@ HRESULT STDMETHODCALLTYPE CMergedFolder::GetDetailsOf( UINT iColumn, SHELLDETAILS *psd) { - UNIMPLEMENTED; - return E_NOTIMPL; + LocalPidlInfo info; + HRESULT hr; + + TRACE("GetDetailsOf\n"); + + hr = m_EnumSource->FindPidlInList(pidl, &info); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + CComPtr parent2; + hr = info.parent->QueryInterface(IID_PPV_ARG(IShellFolder2, &parent2)); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + hr = parent2->GetDetailsOf(info.pidl, iColumn, psd); + + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + return S_OK; } HRESULT STDMETHODCALLTYPE CMergedFolder::MapColumnToSCID( diff --git a/base/shell/rshell/precomp.h b/base/shell/rshell/precomp.h index 575154f9c73..17ffaaff057 100644 --- a/base/shell/rshell/precomp.h +++ b/base/shell/rshell/precomp.h @@ -26,7 +26,7 @@ #define WRAP_MENUBAND 0 #define WRAP_TRAYPRIV 0 -#define MERGE_FOLDERS 0 +#define MERGE_FOLDERS 1 #include #include diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index ceea44fdf92..e79f8b8692c 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -3425,8 +3425,14 @@ DWORD WINAPI BrowserThreadProc(LPVOID lpThreadParameter) { HRESULT hr; IEThreadParamBlock * parameters = (IEThreadParamBlock *) lpThreadParameter; + INITCOMMONCONTROLSEX iccex = + { + sizeof(iccex), + 0xFFFF /* everything! */ + }; OleInitialize(NULL); + InitCommonControlsEx(&iccex); ATLTRY(hr = ExplorerMessageLoop(parameters)); diff --git a/dll/win32/shell32/defcontextmenu.cpp b/dll/win32/shell32/defcontextmenu.cpp index be2e8ebf5e2..839f1191d4b 100644 --- a/dll/win32/shell32/defcontextmenu.cpp +++ b/dll/win32/shell32/defcontextmenu.cpp @@ -1672,13 +1672,21 @@ CDefFolderMenu_Create2( const HKEY *ahkeyClsKeys, IContextMenu **ppcm) { + // FIXME: This needs to be freed somewhere (like in the destructor of the context menu) + LPCITEMIDLIST *apidl2 = (LPCITEMIDLIST *) SHAlloc(sizeof(LPCITEMIDLIST) * cidl); + + for (int i = 0; i < cidl; i++) + { + apidl2[i] = apidl[i]; + } + DEFCONTEXTMENU pdcm; pdcm.hwnd = hwnd; pdcm.pcmcb = NULL; pdcm.pidlFolder = pidlFolder; pdcm.psf = psf; pdcm.cidl = cidl; - pdcm.apidl = apidl; + pdcm.apidl = apidl2; pdcm.punkAssociationInfo = NULL; pdcm.cKeys = nKeys; pdcm.aKeys = ahkeyClsKeys; diff --git a/dll/win32/shell32/shlmenu.cpp b/dll/win32/shell32/shlmenu.cpp index 19b6ca0e4fc..9ef53291217 100644 --- a/dll/win32/shell32/shlmenu.cpp +++ b/dll/win32/shell32/shlmenu.cpp @@ -20,6 +20,8 @@ #include "precomp.h" +WINE_DEFAULT_DEBUG_CHANNEL(shellmenu); + #ifdef FM_SEPARATOR #undef FM_SEPARATOR #endif @@ -56,8 +58,6 @@ static BOOL bAbortInit; #define CCH_MAXITEMTEXT 256 -WINE_DEFAULT_DEBUG_CHANNEL(shell); - static LPFMINFO FM_GetMenuInfo(HMENU hmenu) { MENUINFO MenuInfo; @@ -857,6 +857,8 @@ UINT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAd return uIDMax; nItem = GetMenuItemCount(hmDst); + if (nItem == -1) + return uIDMax; if (uInsert >= (UINT)nItem) /* insert position inside menu? */ { @@ -900,16 +902,18 @@ UINT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAd /* This is a separator; don't put two of them in a row */ if (bAlreadySeparated) continue; + bAlreadySeparated = TRUE; } else if (miiSrc.hSubMenu) { - if ((uFlags & MM_SUBMENUSHAVEIDS) != 0 && miiSrc.wID != (UINT)miiSrc.hSubMenu) + if (uFlags & MM_SUBMENUSHAVEIDS) { miiSrc.wID += uIDAdjust; /* add uIDAdjust to the ID */ - if (miiSrc.wID > uIDAdjustMax) /* skip ID's higher uIDAdjustMax */ + if (miiSrc.wID > uIDAdjustMax) /* skip IDs higher than uIDAdjustMax */ continue; + if (uIDMax <= miiSrc.wID) /* remember the highest ID */ uIDMax = miiSrc.wID + 1; } @@ -934,9 +938,9 @@ UINT WINAPI Shell_MergeMenus (HMENU hmDst, HMENU hmSrc, UINT uInsert, UINT uIDAd { miiSrc.wID += uIDAdjust; /* add uIDAdjust to the ID */ - if (miiSrc.wID > uIDAdjustMax) /* skip ID's higher uIDAdjustMax */{ + if (miiSrc.wID > uIDAdjustMax) /* skip IDs higher than uIDAdjustMax */ continue; - } + if (uIDMax <= miiSrc.wID) /* remember the highest ID */ uIDMax = miiSrc.wID + 1;