From 38ad1ca394d17e43492f2ac85f0194e976537541 Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Sun, 22 Jun 2025 19:20:12 +0200 Subject: [PATCH] [SHELL32][BROWSEUI] Make externally available FCIDM WM_COMMANDs work correctly (#8150) --- dll/win32/browseui/shellbrowser.cpp | 64 +++++++++++++------ dll/win32/shell32/CDefView.cpp | 54 ++++++---------- dll/win32/shell32/CDefaultContextMenu.cpp | 2 +- .../shell32/shelldesktop/CDesktopBrowser.cpp | 14 +++- dll/win32/shell32/shresdef.h | 19 +++--- sdk/include/psdk/shlobj.h | 3 - sdk/include/reactos/shlobj_undoc.h | 33 ++++++++++ 7 files changed, 119 insertions(+), 70 deletions(-) diff --git a/dll/win32/browseui/shellbrowser.cpp b/dll/win32/browseui/shellbrowser.cpp index d4283c4da87..07718df108a 100644 --- a/dll/win32/browseui/shellbrowser.cpp +++ b/dll/win32/browseui/shellbrowser.cpp @@ -654,6 +654,7 @@ public: LRESULT OnGoTravel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); LRESULT OnRefresh(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); LRESULT OnExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); + LRESULT OnToggleExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled); LRESULT RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); LRESULT OnCabinetStateChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled); LRESULT OnSettingsChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); @@ -706,10 +707,10 @@ public: COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR, OnToggleLinksBandVisible) COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS, OnToggleTextLabels) COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE, OnToolbarCustomize) - COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH, OnExplorerBar) - COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS, OnExplorerBar) - COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY, OnExplorerBar) - COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES, OnExplorerBar) + COMMAND_ID_HANDLER(IDM_EXPLORERBAR_SEARCH, OnToggleExplorerBar) + COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FOLDERS, OnToggleExplorerBar) + COMMAND_ID_HANDLER(IDM_EXPLORERBAR_HISTORY, OnToggleExplorerBar) + COMMAND_ID_HANDLER(IDM_EXPLORERBAR_FAVORITES, OnToggleExplorerBar) COMMAND_ID_HANDLER(IDM_BACKSPACE, OnBackspace) COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET, IDM_GOTO_TRAVEL_LASTTARGET, OnGoTravel) COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM, IDM_EXPLORERBAND_ENDCUSTOM, OnExplorerBar) @@ -2857,7 +2858,7 @@ HRESULT STDMETHODCALLTYPE CShellBrowser::OnCreate(struct tagCREATESTRUCTW *pcs) LRESULT STDMETHODCALLTYPE CShellBrowser::OnCommand(WPARAM wParam, LPARAM lParam) { - return 0; + return SendMessage(WM_COMMAND, wParam, lParam); } HRESULT STDMETHODCALLTYPE CShellBrowser::OnDestroy() @@ -3919,6 +3920,7 @@ LRESULT CShellBrowser::OnClose(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &b LRESULT CShellBrowser::OnFolderOptions(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) { + C_ASSERT(FCIDM_SHBROWSER_OPTIONS == IDM_TOOLS_FOLDEROPTIONS && FCIDM_SHBROWSER_OPTIONS == 0xA123); HRESULT hResult = DoFolderOptions(); if (FAILED(hResult)) TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult); @@ -4102,6 +4104,7 @@ LRESULT CShellBrowser::OnToolbarCustomize(WORD wNotifyCode, WORD wID, HWND hWndC LRESULT CShellBrowser::OnRefresh(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) { + C_ASSERT(FCIDM_CABINET_REFRESH == IDM_VIEW_REFRESH && FCIDM_CABINET_REFRESH == 0xA220); if (fCurrentShellView) fCurrentShellView->Refresh(); return 0; @@ -4125,29 +4128,48 @@ LRESULT CShellBrowser::OnExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, B bHandled = TRUE; return 1; } + return 0; +} + +LRESULT CShellBrowser::OnToggleExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) +{ + UINT sbci = 0; switch (wID) { - case IDM_EXPLORERBAR_SEARCH: - ShowBand(CLSID_FileSearchBand, true); - break; - case IDM_EXPLORERBAR_FOLDERS: - ShowBand(CLSID_ExplorerBand, true); - break; - case IDM_EXPLORERBAR_HISTORY: - ShowBand(CLSID_SH_HistBand, true); - break; - case IDM_EXPLORERBAR_FAVORITES: - ShowBand(CLSID_SH_FavBand, true); - break; - default: - WARN("Unknown id %x\n", wID); + case IDM_EXPLORERBAR_SEARCH: sbci = 0x1c; break; + case IDM_EXPLORERBAR_FAVORITES: sbci = 0x1e; break; + case IDM_EXPLORERBAR_HISTORY: sbci = 0x1d; break; + case IDM_EXPLORERBAR_FOLDERS: sbci = SBCMDID_EXPLORERBARFOLDERS; break; + default: WARN("Unknown id %x\n", wID); } - bHandled = TRUE; - return 1; + if (sbci) + { + this->Exec(&CGID_Explorer, sbci, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL); + bHandled = TRUE; + } + return TRUE; } LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) { + CComHeapPtr pidl; + switch (LOWORD(wParam)) + { + case FCIDM_SHBROWSER_REFRESH: + wParam = FCIDM_SHVIEW_REFRESH; + break; + case FCIDM_SHBROWSER_FINDFILES: + return OnCommand(IDM_EXPLORERBAR_SEARCH, 0); + case FCIDM_CABINET_NT5_GOTO_DRIVES: + if (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &pidl))) + BrowseObject(pidl, SBSP_ABSOLUTE | SBSP_SAMEBROWSER | SBSP_ACTIVATE_NOFOCUS); + return 0; +#if 0 // TODO: Toggle entire itbar(rebar) after LPTOOLBARITEM->fShow support is added + case FCIDM_CABINET_TOGGLEITBAR: + break; +#endif + } + if (HIWORD(wParam) == 0 && LOWORD(wParam) < FCIDM_SHVIEWLAST && fCurrentShellViewWindow != NULL) return SendMessage(fCurrentShellViewWindow, uMsg, wParam, lParam); return 0; diff --git a/dll/win32/shell32/CDefView.cpp b/dll/win32/shell32/CDefView.cpp index 7fdf61c5c65..2d34f1f53d3 100644 --- a/dll/win32/shell32/CDefView.cpp +++ b/dll/win32/shell32/CDefView.cpp @@ -2566,25 +2566,14 @@ LRESULT CDefView::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand switch (dwCmdID) { - case FCIDM_SHVIEW_SMALLICON: - m_FolderSettings.ViewMode = FVM_SMALLICON; - m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_SMALLICON); - CheckToolbar(); - break; - case FCIDM_SHVIEW_BIGICON: - m_FolderSettings.ViewMode = FVM_ICON; - m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_ICON); - CheckToolbar(); - break; - case FCIDM_SHVIEW_LISTVIEW: - m_FolderSettings.ViewMode = FVM_LIST; - m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_LIST); - CheckToolbar(); - break; - case FCIDM_SHVIEW_REPORTVIEW: - m_FolderSettings.ViewMode = FVM_DETAILS; - m_ListView.ModifyStyle(LVS_TYPEMASK, LVS_REPORT); - CheckToolbar(); + case FCIDM_SHVIEW_BIGICON: C_ASSERT(FCIDM_SHVIEW_BIGICON == 0x7029); + case FCIDM_SHVIEW_SMALLICON: C_ASSERT(FCIDM_SHVIEW_SMALLICON == 0x702A); + case FCIDM_SHVIEW_LISTVIEW: C_ASSERT(FCIDM_SHVIEW_LISTVIEW == 0x702B); + case FCIDM_SHVIEW_REPORTVIEW: C_ASSERT(FCIDM_SHVIEW_REPORTVIEW == 0x702C); + case 0x702D: + case FCIDM_SHVIEW_TILEVIEW: C_ASSERT(FCIDM_SHVIEW_TILEVIEW == 0x702E); + case 0x702F: + SetCurrentViewMode(dwCmdID - FCIDM_SHVIEW_BIGICON + 1); break; case FCIDM_SHVIEW_SNAPTOGRID: m_ListView.Arrange(LVA_SNAPTOGRID); @@ -2610,6 +2599,9 @@ LRESULT CDefView::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand for (int i=0; i < nCount; i++) m_ListView.SetItemState(i, m_ListView.GetItemState(i, LVIS_SELECTED) ^ LVIS_SELECTED, LVIS_SELECTED); break; + case FCIDM_SHVIEW_DESELECTALL: + m_ListView.SetItemState(-1, 0, LVIS_SELECTED); + break; case FCIDM_SHVIEW_REFRESH: Refresh(); break; @@ -2621,8 +2613,8 @@ LRESULT CDefView::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHand if (SHRestricted(REST_NOVIEWCONTEXTMENU)) return 0; return OnExplorerCommand(dwCmdID, TRUE); - case FCIDM_SHVIEW_COPYTO: - case FCIDM_SHVIEW_MOVETO: + case FCIDM_SHVIEW_COPYTO: C_ASSERT(FCIDM_SHVIEW_COPYTO == 0x701e); + case FCIDM_SHVIEW_MOVETO: C_ASSERT(FCIDM_SHVIEW_MOVETO == 0x701f); _DoCopyToMoveToFolder(dwCmdID == FCIDM_SHVIEW_COPYTO); return 0; case FCIDM_SHVIEW_INSERT: @@ -3636,24 +3628,14 @@ HRESULT STDMETHODCALLTYPE CDefView::SetCurrentViewMode(UINT ViewMode) means. */ switch (ViewMode) { - case FVM_ICON: - dwStyle = LVS_ICON; - break; - case FVM_DETAILS: - dwStyle = LVS_REPORT; - break; - case FVM_SMALLICON: - dwStyle = LVS_SMALLICON; - break; - case FVM_LIST: - dwStyle = LVS_LIST; - break; + case FVM_ICON: dwStyle = LVS_ICON; break; + case FVM_SMALLICON: dwStyle = LVS_SMALLICON; break; + case FVM_LIST: dwStyle = LVS_LIST; break; + case FVM_DETAILS: dwStyle = LVS_REPORT; break; default: - { FIXME("ViewMode %d not implemented\n", ViewMode); dwStyle = LVS_LIST; break; - } } m_ListView.ModifyStyle(LVS_TYPEMASK, dwStyle); @@ -3661,7 +3643,7 @@ HRESULT STDMETHODCALLTYPE CDefView::SetCurrentViewMode(UINT ViewMode) /* This will not necessarily be the actual mode set above. This mimics the behavior of Windows XP. */ m_FolderSettings.ViewMode = ViewMode; - + CheckToolbar(); return S_OK; } diff --git a/dll/win32/shell32/CDefaultContextMenu.cpp b/dll/win32/shell32/CDefaultContextMenu.cpp index 2f361901745..36b605efd53 100644 --- a/dll/win32/shell32/CDefaultContextMenu.cpp +++ b/dll/win32/shell32/CDefaultContextMenu.cpp @@ -1015,7 +1015,7 @@ CDefaultContextMenu::QueryContextMenu( return MAKE_HRESULT(SEVERITY_SUCCESS, 0, cIds); /* Add the default part of the menu */ - HMENU hmenuDefault = LoadMenuW(_AtlBaseModule.GetResourceInstance(), L"MENU_SHV_FILE"); + HMENU hmenuDefault = LoadMenuW(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCEW(MENU_SHV_FILE)); /* Remove uneeded entries */ if (!(rfg & SFGAO_CANMOVE)) diff --git a/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp b/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp index e443a233e03..2583a0697dc 100644 --- a/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp +++ b/dll/win32/shell32/shelldesktop/CDesktopBrowser.cpp @@ -33,6 +33,15 @@ WINE_DEFAULT_DEBUG_CHANNEL(desktop); static const WCHAR szProgmanClassName[] = L"Progman"; static const WCHAR szProgmanWindowName[] = L"Program Manager"; +static BOOL IsDesktopBrowserForwardShellViewCmd(WORD Cmd) +{ + // Note: The normal CShellBrowser forwards the entire FCIDM_SHVIEWFIRST..LAST range, we do not. + // Note: Windows allows FCIDM_SHVIEW_SHOWINGROUPS but we don't support it nor does it make sense. + return (FCIDM_SHVIEW_CREATELINK <= Cmd && Cmd <= FCIDM_SHVIEW_DESELECTALL) || + (FCIDM_SHVIEW_ARRANGE_AUTO <= Cmd && Cmd <= FCIDM_SHVIEW_ARRANGE_AUTOGRID) || + (Cmd == FCIDM_SHVIEW_REFRESH); +} + class CDesktopBrowser : public CWindowImpl, public CComObjectRootEx, @@ -399,8 +408,11 @@ LRESULT CDesktopBrowser::OnCommand(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL if (m_ShellView) m_ShellView->Refresh(); break; + default: + if (IsDesktopBrowserForwardShellViewCmd(LOWORD(wParam)) && m_hWndShellView) + return SendMessageW(m_hWndShellView, uMsg, wParam, lParam); + break; } - return 0; } diff --git a/dll/win32/shell32/shresdef.h b/dll/win32/shell32/shresdef.h index 4c5e25cda0e..c6b618a580b 100644 --- a/dll/win32/shell32/shresdef.h +++ b/dll/win32/shell32/shresdef.h @@ -856,7 +856,9 @@ /* Shell view commands */ #define FCIDM_SHVIEW_ARRANGE 0x7001 #define FCIDM_SHVIEW_VIEW 0x7002 +#define FCIDM_SHVIEW_CREATELINK 0x7010 #define FCIDM_SHVIEW_DELETE 0x7011 +#define FCIDM_SHVIEW_RENAME 0x7012 #define FCIDM_SHVIEW_PROPERTIES 0x7013 #define FCIDM_SHVIEW_CUT 0x7018 #define FCIDM_SHVIEW_COPY 0x7019 @@ -868,24 +870,23 @@ #define FCIDM_SHVIEW_SELECTALL 0x7021 #define FCIDM_SHVIEW_INVERTSELECTION 0x7022 -#define FCIDM_SHVIEW_BIGICON 0x7029 //FIXME -#define FCIDM_SHVIEW_SMALLICON 0x702A //FIXME -#define FCIDM_SHVIEW_LISTVIEW 0x702B //FIXME -#define FCIDM_SHVIEW_REPORTVIEW 0x702C //FIXME +#define FCIDM_SHVIEW_BIGICON 0x7029 +#define FCIDM_SHVIEW_SMALLICON 0x702A +#define FCIDM_SHVIEW_LISTVIEW 0x702B +#define FCIDM_SHVIEW_REPORTVIEW 0x702C +#define FCIDM_SHVIEW_TILEVIEW 0x702E /* 0x7030-0x703f are used by the shellbrowser */ #define FCIDM_SHVIEW_AUTOARRANGE 0x7031 #define FCIDM_SHVIEW_SNAPTOGRID 0x7032 #define FCIDM_SHVIEW_ALIGNTOGRID 0x7033 #define FCIDM_SHVIEW_HELP 0x7041 -#define FCIDM_SHVIEW_RENAME 0x7050 -#define FCIDM_SHVIEW_CREATELINK 0x7051 #define FCIDM_SHVIEW_NEWLINK 0x7052 #define FCIDM_SHVIEW_NEWFOLDER 0x7053 -#define FCIDM_SHVIEW_REFRESH 0x7100 /* FIXME */ #define FCIDM_SHVIEW_EXPLORE 0x7101 /* FIXME */ #define FCIDM_SHVIEW_OPEN 0x7102 /* FIXME */ +#define FCIDM_SHVIEW_REFRESH 0x7103 #define FCIDM_TB_UPFOLDER 0xA001 #define FCIDM_TB_NEWFOLDER 0xA002 @@ -893,6 +894,7 @@ #define FCIDM_TB_REPORTVIEW 0xA004 #define FCIDM_TB_DESKTOP 0xA005 /* FIXME */ +#define MENU_SHV_FILE 210 #define IDM_UNDO (FCIDM_SHVIEW_UNDO - 0x7000) #define IDM_CUT (FCIDM_SHVIEW_CUT - 0x7000) #define IDM_COPY (FCIDM_SHVIEW_COPY - 0x7000) @@ -900,9 +902,10 @@ #define IDM_CREATELINK (FCIDM_SHVIEW_CREATELINK - 0x7000) #define IDM_DELETE (FCIDM_SHVIEW_DELETE - 0x7000) #define IDM_RENAME (FCIDM_SHVIEW_RENAME - 0x7000) -#define IDM_PROPERTIES (FCIDM_SHVIEW_PROPERTIES - 0x7000) #define IDM_COPYTO (FCIDM_SHVIEW_COPYTO - 0x7000) #define IDM_MOVETO (FCIDM_SHVIEW_MOVETO - 0x7000) +#define MENU_SHV_FILEPROPERTIES 211 +#define IDM_PROPERTIES (FCIDM_SHVIEW_PROPERTIES - 0x7000) #define IDM_DRAGFILE 0xce #define IDM_COPYHERE 0x7 diff --git a/sdk/include/psdk/shlobj.h b/sdk/include/psdk/shlobj.h index 530b9c07f9b..33368f1fbb1 100644 --- a/sdk/include/psdk/shlobj.h +++ b/sdk/include/psdk/shlobj.h @@ -610,12 +610,9 @@ typedef struct #define FCIDM_SHVIEW_ALIGNTOGRID 0x7033 #define FCIDM_SHVIEW_HELP 0x7041 -#define FCIDM_SHVIEW_RENAME 0x7050 -#define FCIDM_SHVIEW_CREATELINK 0x7051 #define FCIDM_SHVIEW_NEWLINK 0x7052 #define FCIDM_SHVIEW_NEWFOLDER 0x7053 -#define FCIDM_SHVIEW_REFRESH 0x7100 /* FIXME */ #define FCIDM_SHVIEW_EXPLORE 0x7101 /* FIXME */ #define FCIDM_SHVIEW_OPEN 0x7102 /* FIXME */ diff --git a/sdk/include/reactos/shlobj_undoc.h b/sdk/include/reactos/shlobj_undoc.h index 2eed29a7a71..22d0c067513 100644 --- a/sdk/include/reactos/shlobj_undoc.h +++ b/sdk/include/reactos/shlobj_undoc.h @@ -47,6 +47,39 @@ struct persistState ULONG pidlSize; }; +/**************************************************************************** + * IShellView/IShellBrowser/CabinetWClass WM_COMMAND identifiers + */ +#define FCIDM_SHVIEW_CREATELINK 0x7010 +#define FCIDM_SHVIEW_DELETE 0x7011 +#define FCIDM_SHVIEW_RENAME 0x7012 +#define FCIDM_SHVIEW_PROPERTIES 0x7013 +#define FCIDM_SHVIEW_CUT 0x7018 +#define FCIDM_SHVIEW_COPY 0x7019 +#define FCIDM_SHVIEW_INSERT 0x701A +#define FCIDM_SHVIEW_UNDO 0x701B +#define FCIDM_SHVIEW_INSERTLINK 0x701C +#define FCIDM_SHVIEW_COPYTO 0x701E +#define FCIDM_SHVIEW_MOVETO 0x701F +#define FCIDM_SHVIEW_SELECTALL 0x7021 +#define FCIDM_SHVIEW_INVERTSELECTION 0x7022 +#define FCIDM_SHVIEW_DESELECTALL 0x7023 +#define FCIDM_SHVIEW_ARRANGE_AUTO 0x7051 // IShellFolderView::AutoArrange +#define FCIDM_SHVIEW_ARRANGE_GRID 0x7052 // IShellFolderView::ArrangeGrid => LVA_SNAPTOGRID +#define FCIDM_SHVIEW_SHOWDESKTOPICONS 0x7053 +#define FCIDM_SHVIEW_ARRANGE_AUTOGRID 0x7054 +#define FCIDM_SHVIEW_REFRESH 0x7103 +#define FCIDM_SHVIEW_SHOWINGROUPS 0x7601 +#define FCIDM_SHBROWSER_REFRESH 0xA065 +#define FCIDM_SHBROWSER_MAPNETDRIVE 0xA081 +#define FCIDM_SHBROWSER_UNMAPNETDRIVE 0xA082 +#define FCIDM_SHBROWSER_FINDFILES 0xA085 +#define FCIDM_SHBROWSER_OPTIONS 0xA123 +#define FCIDM_CABINET_NT5_GOTO_DRIVES 0xA132 +#define FCIDM_CABINET_TOGGLEITBAR 0xA201 +#define FCIDM_CABINET_TOGGLESTATUSBAR 0xA202 +#define FCIDM_CABINET_REFRESH 0xA220 + /***************************************************************************** * CGID_Explorer (IShellBrowser OLECMD IDs) */