Damjan Jovanovic : shell32: Implement some of the missing shellview IContextMenu command verbs.
Alexandre Julliard
julliard at winehq.org
Mon May 3 16:37:05 CDT 2021
Module: wine
Branch: master
Commit: 566454b9dcc89069b66b8634f685d175e528f26b
URL: https://source.winehq.org/git/wine.git/?a=commit;h=566454b9dcc89069b66b8634f685d175e528f26b
Author: Damjan Jovanovic <damjan.jov at gmail.com>
Date: Mon May 3 03:12:43 2021 +0200
shell32: Implement some of the missing shellview IContextMenu command verbs.
Signed-off-by: Damjan Jovanovic <damjan.jov at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/shell32/shlview_cmenu.c | 83 +++++++++++++++++++++++++++++++++---------
dlls/shell32/tests/shlfolder.c | 1 -
2 files changed, 65 insertions(+), 19 deletions(-)
diff --git a/dlls/shell32/shlview_cmenu.c b/dlls/shell32/shlview_cmenu.c
index e7c1cf16e10..bd58a448d17 100644
--- a/dlls/shell32/shlview_cmenu.c
+++ b/dlls/shell32/shlview_cmenu.c
@@ -828,6 +828,10 @@ static HRESULT WINAPI ItemMenu_InvokeCommand(
TRACE("Verb is %s\n",debugstr_a(lpcmi->lpVerb));
if (strcmp(lpcmi->lpVerb,"delete")==0)
DoDelete(This);
+ else if (strcmp(lpcmi->lpVerb,"copy")==0)
+ DoCopyOrCut(This, lpcmi->hwnd, FALSE);
+ else if (strcmp(lpcmi->lpVerb,"cut")==0)
+ DoCopyOrCut(This, lpcmi->hwnd, TRUE);
else if (strcmp(lpcmi->lpVerb,"properties")==0)
DoOpenProperties(This, lpcmi->hwnd);
else {
@@ -1256,6 +1260,10 @@ static HRESULT WINAPI BackgroundMenu_InvokeCommand(
{
if (hWnd) SendMessageA(hWnd, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW, 0), 0);
}
+ else if (!strcmp(lpcmi->lpVerb, "paste"))
+ {
+ DoPaste(This);
+ }
else
{
FIXME("please report: unknown verb %s\n", debugstr_a(lpcmi->lpVerb));
@@ -1306,27 +1314,66 @@ static HRESULT WINAPI BackgroundMenu_GetCommandString(
LPSTR lpszName,
UINT uMaxNameLen)
{
- ContextMenu *This = impl_from_IContextMenu3(iface);
+ static const WCHAR pasteW[] = {'p','a','s','t','e',0};
+ static const WCHAR propertiesW[] = {'p','r','o','p','e','r','t','i','e','s',0};
+ ContextMenu *This = impl_from_IContextMenu3(iface);
+ const WCHAR *cmdW = NULL;
+ HRESULT hr = E_FAIL;
- TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
+ TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen);
- /* test the existence of the menu items, the file dialog enables
- the buttons according to this */
- if (uFlags == GCS_VALIDATEA)
- {
- if(HIWORD(idCommand))
- {
- if (!strcmp((LPSTR)idCommand, CMDSTR_VIEWLISTA) ||
- !strcmp((LPSTR)idCommand, CMDSTR_VIEWDETAILSA) ||
- !strcmp((LPSTR)idCommand, CMDSTR_NEWFOLDERA))
- {
- return S_OK;
- }
- }
- }
+ switch (uFlags)
+ {
+ case GCS_HELPTEXTA:
+ case GCS_HELPTEXTW:
+ hr = E_NOTIMPL;
+ break;
+
+ case GCS_VERBA:
+ case GCS_VERBW:
+ switch (idCommand + FCIDM_BASE)
+ {
+ case FCIDM_SHVIEW_INSERT:
+ cmdW = pasteW;
+ break;
+ case FCIDM_SHVIEW_PROPERTIES:
+ cmdW = propertiesW;
+ break;
+ }
+
+ if (!cmdW)
+ {
+ hr = E_INVALIDARG;
+ break;
+ }
- FIXME("unknown command string\n");
- return E_FAIL;
+ if (uFlags == GCS_VERBA)
+ WideCharToMultiByte(CP_ACP, 0, cmdW, -1, lpszName, uMaxNameLen, NULL, NULL);
+ else
+ lstrcpynW((WCHAR *)lpszName, cmdW, uMaxNameLen);
+ TRACE("name %s\n", uFlags == GCS_VERBA ? debugstr_a(lpszName) : debugstr_w((WCHAR *)lpszName));
+ hr = S_OK;
+ break;
+
+ case GCS_VALIDATEA:
+ case GCS_VALIDATEW:
+ /* test the existence of the menu items, the file dialog enables
+ the buttons according to this */
+ if (HIWORD(idCommand))
+ {
+ if (!strcmp((LPSTR)idCommand, CMDSTR_VIEWLISTA) ||
+ !strcmp((LPSTR)idCommand, CMDSTR_VIEWDETAILSA) ||
+ !strcmp((LPSTR)idCommand, CMDSTR_NEWFOLDERA))
+ hr = S_OK;
+ else
+ {
+ FIXME("unknown command string %s\n", uFlags == GCS_VALIDATEA ? debugstr_a((LPSTR)idCommand) : debugstr_w((WCHAR*)idCommand));
+ hr = E_FAIL;
+ }
+ }
+ break;
+ }
+ return hr;
}
static const IContextMenu3Vtbl BackgroundContextMenuVtbl =
diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c
index cb238c959cd..51776f050ae 100644
--- a/dlls/shell32/tests/shlfolder.c
+++ b/dlls/shell32/tests/shlfolder.c
@@ -4381,7 +4381,6 @@ static void test_contextmenu(IContextMenu *menu, BOOL background)
ok(mii.wID >= 64 && mii.wID <= 64 + max_id,
"Expected between 64 and %d, got %d.\n", 64 + max_id, mii.wID);
hr = IContextMenu_GetCommandString(menu, mii.wID - 64, GCS_VERBA, 0, buf, sizeof(buf));
- todo_wine_if(background)
ok(hr == S_OK || hr == E_NOTIMPL || hr == E_INVALIDARG,
"Got unexpected hr %#x for ID %d, string %s.\n", hr, mii.wID, debugstr_a(mii.dwTypeData));
if (hr == S_OK)
More information about the wine-cvs
mailing list