|
10 | 10 | #include <wine/debug.h> |
11 | 11 | WINE_DEFAULT_DEBUG_CHANNEL(shdocvw); |
12 | 12 |
|
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 | +} |
16 | 32 |
|
17 | 33 | EXTERN_C HRESULT |
18 | 34 | SHELL_GetIDListFromObject(IUnknown *punk, PIDLIST_ABSOLUTE *ppidl) |
@@ -71,6 +87,36 @@ SHELL_IsVerb(IContextMenu *pcm, UINT_PTR idCmd, LPCWSTR Verb) |
71 | 87 | return FALSE; |
72 | 88 | } |
73 | 89 |
|
| 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 | + |
74 | 120 | EXTERN_C BOOL |
75 | 121 | _ILIsDesktop(LPCITEMIDLIST pidl) |
76 | 122 | { |
|
0 commit comments