[SHELL32][BROWSEUI] Make externally available FCIDM WM_COMMANDs work correctly (#8150)

This commit is contained in:
Whindmar Saksit 2025-06-22 19:20:12 +02:00 committed by GitHub
parent 02ad6b17ed
commit 38ad1ca394
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 119 additions and 70 deletions

View file

@ -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);
}
if (sbci)
{
this->Exec(&CGID_Explorer, sbci, OLECMDEXECOPT_DONTPROMPTUSER, NULL, NULL);
bHandled = TRUE;
return 1;
}
return TRUE;
}
LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
{
CComHeapPtr<ITEMIDLIST> 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;

View file

@ -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,32 +3628,22 @@ 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);
/* 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;
}

View file

@ -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))

View file

@ -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<CDesktopBrowser, CWindow, CFrameWinTraits>,
public CComObjectRootEx<CComMultiThreadModelNoCS>,
@ -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;
}

View file

@ -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

View file

@ -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 */

View file

@ -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)
*/