shell32: Have the system context menus respect idCmdFirst.
This commit is contained in:
parent
b56dc9a6f7
commit
2e5e7dbeba
|
@ -42,10 +42,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
const IContextMenu2Vtbl *lpVtbl;
|
const IContextMenu2Vtbl *lpVtbl;
|
||||||
IShellFolder* pSFParent;
|
IShellFolder* pSFParent;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
BOOL bDesktop;
|
BOOL bDesktop;
|
||||||
|
UINT verb_offset;
|
||||||
} BgCmImpl;
|
} BgCmImpl;
|
||||||
|
|
||||||
|
|
||||||
|
@ -157,6 +158,7 @@ static HRESULT WINAPI ISVBgCm_fnQueryContextMenu(
|
||||||
TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",
|
TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",
|
||||||
This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
|
This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
|
||||||
|
|
||||||
|
This->verb_offset=idCmdFirst;
|
||||||
|
|
||||||
hMyMenu = LoadMenuA(shell32_hInstance, "MENU_002");
|
hMyMenu = LoadMenuA(shell32_hInstance, "MENU_002");
|
||||||
if (uFlags & CMF_DEFAULTONLY)
|
if (uFlags & CMF_DEFAULTONLY)
|
||||||
|
@ -175,7 +177,7 @@ static HRESULT WINAPI ISVBgCm_fnQueryContextMenu(
|
||||||
{
|
{
|
||||||
idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu,
|
idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu,
|
||||||
idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS);
|
idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS);
|
||||||
hr = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, idMax-idCmdFirst+1);
|
hr = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, idMax-idCmdFirst);
|
||||||
}
|
}
|
||||||
DestroyMenu(hMyMenu);
|
DestroyMenu(hMyMenu);
|
||||||
|
|
||||||
|
@ -358,7 +360,7 @@ static HRESULT WINAPI ISVBgCm_fnInvokeCommand(
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
switch(LOWORD(lpcmi->lpVerb))
|
switch(LOWORD(lpcmi->lpVerb)-This->verb_offset)
|
||||||
{
|
{
|
||||||
case FCIDM_SHVIEW_REFRESH:
|
case FCIDM_SHVIEW_REFRESH:
|
||||||
if (lpSV) IShellView_Refresh(lpSV);
|
if (lpSV) IShellView_Refresh(lpSV);
|
||||||
|
|
|
@ -47,13 +47,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
|
||||||
*/
|
*/
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
IContextMenu2 IContextMenu2_iface;
|
IContextMenu2 IContextMenu2_iface;
|
||||||
LONG ref;
|
LONG ref;
|
||||||
IShellFolder* pSFParent;
|
IShellFolder* pSFParent;
|
||||||
LPITEMIDLIST pidl; /* root pidl */
|
LPITEMIDLIST pidl; /* root pidl */
|
||||||
LPITEMIDLIST *apidl; /* array of child pidls */
|
LPITEMIDLIST *apidl; /* array of child pidls */
|
||||||
UINT cidl;
|
UINT cidl;
|
||||||
BOOL bAllValues;
|
BOOL bAllValues;
|
||||||
|
UINT verb_offset;
|
||||||
} ItemCmImpl;
|
} ItemCmImpl;
|
||||||
|
|
||||||
static inline ItemCmImpl *impl_from_IContextMenu2(IContextMenu2 *iface)
|
static inline ItemCmImpl *impl_from_IContextMenu2(IContextMenu2 *iface)
|
||||||
|
@ -223,27 +224,26 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
|
||||||
UINT idCmdLast,
|
UINT idCmdLast,
|
||||||
UINT uFlags)
|
UINT uFlags)
|
||||||
{
|
{
|
||||||
ItemCmImpl *This = impl_from_IContextMenu2(iface);
|
ItemCmImpl *This = impl_from_IContextMenu2(iface);
|
||||||
INT uIDMax;
|
INT uIDMax;
|
||||||
|
|
||||||
TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
|
TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
|
||||||
|
|
||||||
if (idCmdFirst != 0)
|
This->verb_offset=idCmdFirst;
|
||||||
FIXME("We should use idCmdFirst=%d and idCmdLast=%d for command ids\n", idCmdFirst, idCmdLast);
|
|
||||||
|
|
||||||
if(!(CMF_DEFAULTONLY & uFlags) && This->cidl>0)
|
if(!(CMF_DEFAULTONLY & uFlags) && This->cidl>0)
|
||||||
{
|
{
|
||||||
HMENU hmenures = LoadMenuW(shell32_hInstance, MAKEINTRESOURCEW(MENU_SHV_FILE));
|
HMENU hmenures = LoadMenuW(shell32_hInstance, MAKEINTRESOURCEW(MENU_SHV_FILE));
|
||||||
|
|
||||||
if(uFlags & CMF_EXPLORE)
|
if(uFlags & CMF_EXPLORE)
|
||||||
RemoveMenu(hmenures, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND);
|
RemoveMenu(hmenures, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND);
|
||||||
|
|
||||||
uIDMax = Shell_MergeMenus(hmenu, GetSubMenu(hmenures, 0), indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS);
|
uIDMax = Shell_MergeMenus(hmenu, GetSubMenu(hmenures, 0), indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS);
|
||||||
|
|
||||||
DestroyMenu(hmenures);
|
DestroyMenu(hmenures);
|
||||||
|
|
||||||
if(This->bAllValues)
|
if(This->bAllValues)
|
||||||
{
|
{
|
||||||
MENUITEMINFOW mi;
|
MENUITEMINFOW mi;
|
||||||
WCHAR str[255];
|
WCHAR str[255];
|
||||||
mi.cbSize = sizeof(mi);
|
mi.cbSize = sizeof(mi);
|
||||||
|
@ -253,18 +253,18 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
|
||||||
GetMenuItemInfoW(hmenu, FCIDM_SHVIEW_EXPLORE, MF_BYCOMMAND, &mi);
|
GetMenuItemInfoW(hmenu, FCIDM_SHVIEW_EXPLORE, MF_BYCOMMAND, &mi);
|
||||||
RemoveMenu(hmenu, FCIDM_SHVIEW_EXPLORE, MF_BYCOMMAND);
|
RemoveMenu(hmenu, FCIDM_SHVIEW_EXPLORE, MF_BYCOMMAND);
|
||||||
_InsertMenuItemW(hmenu, (uFlags & CMF_EXPLORE) ? 1 : 2, MF_BYPOSITION, FCIDM_SHVIEW_EXPLORE, MFT_STRING, str, MFS_ENABLED);
|
_InsertMenuItemW(hmenu, (uFlags & CMF_EXPLORE) ? 1 : 2, MF_BYPOSITION, FCIDM_SHVIEW_EXPLORE, MFT_STRING, str, MFS_ENABLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetMenuDefaultItem(hmenu, 0, MF_BYPOSITION);
|
SetMenuDefaultItem(hmenu, 0, MF_BYPOSITION);
|
||||||
|
|
||||||
if(uFlags & ~CMF_CANRENAME)
|
if(uFlags & ~CMF_CANRENAME)
|
||||||
RemoveMenu(hmenu, FCIDM_SHVIEW_RENAME, MF_BYCOMMAND);
|
RemoveMenu(hmenu, FCIDM_SHVIEW_RENAME, MF_BYCOMMAND);
|
||||||
else
|
else
|
||||||
EnableMenuItem(hmenu, FCIDM_SHVIEW_RENAME, MF_BYCOMMAND | ISvItemCm_CanRenameItems(This) ? MFS_ENABLED : MFS_DISABLED);
|
EnableMenuItem(hmenu, FCIDM_SHVIEW_RENAME, MF_BYCOMMAND | ISvItemCm_CanRenameItems(This) ? MFS_ENABLED : MFS_DISABLED);
|
||||||
|
|
||||||
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, uIDMax);
|
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, uIDMax-idCmdFirst);
|
||||||
}
|
}
|
||||||
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);
|
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
|
@ -520,7 +520,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand(
|
||||||
|
|
||||||
if (HIWORD(lpcmi->lpVerb) == 0)
|
if (HIWORD(lpcmi->lpVerb) == 0)
|
||||||
{
|
{
|
||||||
switch(LOWORD(lpcmi->lpVerb))
|
switch(LOWORD(lpcmi->lpVerb-This->verb_offset))
|
||||||
{
|
{
|
||||||
case FCIDM_SHVIEW_EXPLORE:
|
case FCIDM_SHVIEW_EXPLORE:
|
||||||
TRACE("Verb FCIDM_SHVIEW_EXPLORE\n");
|
TRACE("Verb FCIDM_SHVIEW_EXPLORE\n");
|
||||||
|
@ -551,7 +551,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand(
|
||||||
DoOpenProperties(This, lpcmi->hwnd);
|
DoOpenProperties(This, lpcmi->hwnd);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb));
|
FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb)-This->verb_offset);
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -595,9 +595,9 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString(
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GCS_VERBA:
|
case GCS_VERBA:
|
||||||
switch(idCommand)
|
switch(idCommand-This->verb_offset)
|
||||||
{
|
{
|
||||||
case FCIDM_SHVIEW_RENAME:
|
case FCIDM_SHVIEW_RENAME:
|
||||||
strcpy(lpszName, "rename");
|
strcpy(lpszName, "rename");
|
||||||
hr = NOERROR;
|
hr = NOERROR;
|
||||||
break;
|
break;
|
||||||
|
@ -607,8 +607,9 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString(
|
||||||
/* NT 4.0 with IE 3.0x or no IE will always call This with GCS_VERBW. In This
|
/* NT 4.0 with IE 3.0x or no IE will always call This with GCS_VERBW. In This
|
||||||
case, you need to do the lstrcpyW to the pointer passed.*/
|
case, you need to do the lstrcpyW to the pointer passed.*/
|
||||||
case GCS_VERBW:
|
case GCS_VERBW:
|
||||||
switch(idCommand)
|
switch(idCommand-This->verb_offset)
|
||||||
{ case FCIDM_SHVIEW_RENAME:
|
{
|
||||||
|
case FCIDM_SHVIEW_RENAME:
|
||||||
MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen );
|
MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen );
|
||||||
hr = NOERROR;
|
hr = NOERROR;
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in New Issue