Skip to content

Commit fc6330a

Browse files
authored
[SHDOCVW] Don't show create shortcut context menu item in Explorer tree (reactos#7735)
1 parent 4a0f0dd commit fc6330a

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

dll/win32/shdocvw/CNSCBand.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -992,6 +992,7 @@ LRESULT CNSCBand::OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &b
992992
hr = contextMenu->QueryContextMenu(menuTemp, 0, idCmdFirst, FCIDM_SHVIEWLAST, cmf);
993993
if (FAILED_UNEXPECTEDLY(hr))
994994
return 0;
995+
SHELL_RemoveVerb(contextMenu, idCmdFirst, menuTemp, L"link");
995996

996997
enum { flags = TPM_LEFTALIGN | TPM_RETURNCMD | TPM_LEFTBUTTON | TPM_RIGHTBUTTON };
997998
UINT uCommand = ::TrackPopupMenu(menuTemp, flags, pt.x, pt.y, 0, m_hWnd, NULL);

dll/win32/shdocvw/utility.cpp

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,25 @@
1010
#include <wine/debug.h>
1111
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
1212

13-
#ifndef SHCIDS_CANONICALONLY
14-
#define SHCIDS_CANONICALONLY 0x10000000L
15-
#endif
13+
static inline INT_PTR
14+
GetMenuItemIdByPos(HMENU hMenu, UINT Pos)
15+
{
16+
MENUITEMINFOW mii;
17+
mii.cbSize = FIELD_OFFSET(MENUITEMINFOW, hbmpItem); /* USER32 version agnostic */
18+
mii.fMask = MIIM_ID; /* GetMenuItemID does not handle sub-menus, this does */
19+
mii.cch = 0;
20+
return GetMenuItemInfoW(hMenu, Pos, TRUE, &mii) ? mii.wID : -1;
21+
}
22+
23+
static inline BOOL
24+
IsMenuSeparator(HMENU hMenu, UINT Pos)
25+
{
26+
MENUITEMINFOW mii;
27+
mii.cbSize = FIELD_OFFSET(MENUITEMINFOW, hbmpItem); /* USER32 version agnostic */
28+
mii.fMask = MIIM_FTYPE;
29+
mii.cch = 0;
30+
return GetMenuItemInfoW(hMenu, Pos, TRUE, &mii) && (mii.fType & MFT_SEPARATOR);
31+
}
1632

1733
EXTERN_C HRESULT
1834
SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl)
@@ -71,6 +87,36 @@ SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb)
7187
return FALSE;
7288
}
7389

90+
static int
91+
SHELL_FindVerbPos(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
92+
{
93+
for (UINT i = 0, c = GetMenuItemCount(hMenu); i < c; ++i)
94+
{
95+
INT_PTR id = GetMenuItemIdByPos(hMenu, i);
96+
if (id != -1 && SHELL_IsVerb(pcm, id - idCmdFirst, Verb))
97+
return i;
98+
}
99+
return -1;
100+
}
101+
102+
EXTERN_C VOID
103+
SHELL_RemoveVerb(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb)
104+
{
105+
int nPos = SHELL_FindVerbPos(pcm, idCmdFirst, hMenu, Verb);
106+
if (nPos < 0)
107+
return;
108+
int nCount = GetMenuItemCount(hMenu);
109+
BOOL bSepBefore = nPos && IsMenuSeparator(hMenu, nPos - 1);
110+
BOOL bSepAfter = IsMenuSeparator(hMenu, nPos + 1);
111+
if (DeleteMenu(hMenu, nPos, MF_BYPOSITION))
112+
{
113+
if ((bSepBefore && bSepAfter) || (bSepAfter && nPos == 0))
114+
DeleteMenu(hMenu, nPos, MF_BYPOSITION);
115+
else if (bSepBefore && nPos + 1 == nCount)
116+
DeleteMenu(hMenu, nPos - 1, MF_BYPOSITION);
117+
}
118+
}
119+
74120
EXTERN_C BOOL
75121
_ILIsDesktop(LPCITEMIDLIST pidl)
76122
{

dll/win32/shdocvw/utility.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,6 @@
1010
EXTERN_C HRESULT SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl);
1111
EXTERN_C BOOL SHELL_IsEqualAbsoluteID(PCIDLIST_ABSOLUTE a, PCIDLIST_ABSOLUTE b);
1212
EXTERN_C BOOL SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb);
13+
EXTERN_C VOID SHELL_RemoveVerb(IContextMenu *pcm, UINT idCmdFirst, HMENU hMenu, LPCWSTR Verb);
1314
EXTERN_C BOOL _ILIsDesktop(LPCITEMIDLIST pidl);
15+

0 commit comments

Comments
 (0)