From d6d1830a27a89f542c33cbc85234b292ddc4e39a Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Tue, 12 Mar 2024 15:58:22 +0900 Subject: [PATCH] [SHELL32] Start Menu: Enhance context menu (#6606) Improve Start Menu usability. JIRA issue: CORE-19477 - Add CSIDLFromID helper function. - Return a context menu interface at CShellMenuCallback::OnGetContextMenu. FIXME: CSIDL_CONTROLS, CSIDL_NETWORK, and CSIDL_PRINTERS context menu wrongly open My Computer. --- dll/win32/shell32/shellmenu/CStartMenu.cpp | 75 +++++++++++++++++++--- 1 file changed, 67 insertions(+), 8 deletions(-) diff --git a/dll/win32/shell32/shellmenu/CStartMenu.cpp b/dll/win32/shell32/shellmenu/CStartMenu.cpp index 85d61e9f3f7..356267047b8 100644 --- a/dll/win32/shell32/shellmenu/CStartMenu.cpp +++ b/dll/win32/shell32/shellmenu/CStartMenu.cpp @@ -247,10 +247,43 @@ class CShellMenuCallback : if (FAILED_UNEXPECTEDLY(hr)) return hr; - hr = psfDestop->BindToObject(pidlStartMenu, NULL, IID_PPV_ARG(IShellFolder, &psfStartMenu)); + hr = E_FAIL; + switch (psmd->uId) + { + case IDM_PROGRAMS: + { + hr = AddStartMenuItems(pShellMenu, CSIDL_PROGRAMS, SMSET_TOP, m_psfPrograms); + break; + } + case IDM_FAVORITES: + case IDM_MYDOCUMENTS: + case IDM_MYPICTURES: + case IDM_CONTROLPANEL: + case IDM_NETWORKCONNECTIONS: + case IDM_PRINTERSANDFAXES: + { + hr = AddStartMenuItems(pShellMenu, CSIDLFromID(psmd->uId), SMSET_TOP); + break; + } + case IDM_DOCUMENTS: + { + HMENU hMenu = CreateRecentMenu(); + if (hMenu == NULL) + ERR("CreateRecentMenu failed\n"); + + hr = pShellMenu->SetMenu(hMenu, NULL, SMSET_BOTTOM); if (FAILED_UNEXPECTEDLY(hr)) return hr; + + hr = AddStartMenuItems(pShellMenu, CSIDL_RECENT, SMSET_BOTTOM); + break; } + case IDM_SETTINGS: + { + MENUITEMINFOW mii = { sizeof(mii), MIIM_SUBMENU }; + if (GetMenuItemInfoW(psmd->hmenu, psmd->uId, FALSE, &mii)) + { + UpdateSettingsMenu(mii.hSubMenu); hr = pShellMenu->SetShellFolder(psfStartMenu, NULL, NULL, dwFlags); if (FAILED_UNEXPECTEDLY(hr)) @@ -271,17 +304,43 @@ class CShellMenuCallback : return pShellMenu->QueryInterface(iid, pv); } - HRESULT OnGetContextMenu(LPSMDATA psmd, REFIID iid, void ** pv) + INT CSIDLFromID(UINT uId) const { - if (psmd->uId == IDM_PROGRAMS || - psmd->uId == IDM_CONTROLPANEL || - psmd->uId == IDM_NETWORKCONNECTIONS || - psmd->uId == IDM_PRINTERSANDFAXES) + switch (uId) { - //UNIMPLEMENTED + case IDM_PROGRAMS: return CSIDL_PROGRAMS; + case IDM_FAVORITES: return CSIDL_FAVORITES; + case IDM_DOCUMENTS: return CSIDL_RECENT; + case IDM_MYDOCUMENTS: return CSIDL_MYDOCUMENTS; + case IDM_MYPICTURES: return CSIDL_MYPICTURES; + case IDM_CONTROLPANEL: return CSIDL_CONTROLS; + case IDM_NETWORKCONNECTIONS: return CSIDL_NETWORK; + case IDM_PRINTERSANDFAXES: return CSIDL_PRINTERS; + default: return 0; } + } - return S_FALSE; + HRESULT OnGetContextMenu(LPSMDATA psmd, REFIID iid, void ** pv) + { + INT csidl = CSIDLFromID(psmd->uId); + if (!csidl) + return S_FALSE; + + TRACE("csidl: 0x%X\n", csidl); + + if (csidl == CSIDL_CONTROLS || csidl == CSIDL_NETWORK || csidl == CSIDL_PRINTERS) + FIXME("This CSIDL %d wrongly opens My Computer. CORE-19477\n", csidl); + + CComHeapPtr pidl; + SHGetSpecialFolderLocation(NULL, csidl, &pidl); + + CComPtr pSF; + LPCITEMIDLIST pidlChild = NULL; + HRESULT hr = SHBindToParent(pidl, IID_IShellFolder, (void**)&pSF, &pidlChild); + if (FAILED(hr)) + return hr; + + return pSF->GetUIObjectOf(NULL, 1, &pidlChild, IID_IContextMenu, NULL, pv); } HRESULT OnGetObject(LPSMDATA psmd, REFIID iid, void ** pv)