Jay Yang : shell32: Have the system context menus respect idCmdFirst.
Alexandre Julliard
julliard at winehq.org
Tue Aug 2 14:18:27 CDT 2011
Module: wine
Branch: master
Commit: 2e5e7dbeba77b6cd8b58132b72d9f4b030f39845
URL: http://source.winehq.org/git/wine.git/?a=commit;h=2e5e7dbeba77b6cd8b58132b72d9f4b030f39845
Author: Jay Yang <jkelleyy at gmail.com>
Date: Mon Aug 1 17:47:43 2011 -0400
shell32: Have the system context menus respect idCmdFirst.
---
dlls/shell32/shv_bg_cmenu.c | 14 +++++----
dlls/shell32/shv_item_cmenu.c | 67 +++++++++++++++++++++--------------------
2 files changed, 42 insertions(+), 39 deletions(-)
diff --git a/dlls/shell32/shv_bg_cmenu.c b/dlls/shell32/shv_bg_cmenu.c
index 7f59b6d..5b1b434 100644
--- a/dlls/shell32/shv_bg_cmenu.c
+++ b/dlls/shell32/shv_bg_cmenu.c
@@ -42,10 +42,11 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
*/
typedef struct
{
- const IContextMenu2Vtbl *lpVtbl;
- IShellFolder* pSFParent;
- LONG ref;
- BOOL bDesktop;
+ const IContextMenu2Vtbl *lpVtbl;
+ IShellFolder* pSFParent;
+ LONG ref;
+ BOOL bDesktop;
+ UINT verb_offset;
} BgCmImpl;
@@ -157,6 +158,7 @@ static HRESULT WINAPI ISVBgCm_fnQueryContextMenu(
TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",
This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
+ This->verb_offset=idCmdFirst;
hMyMenu = LoadMenuA(shell32_hInstance, "MENU_002");
if (uFlags & CMF_DEFAULTONLY)
@@ -175,7 +177,7 @@ static HRESULT WINAPI ISVBgCm_fnQueryContextMenu(
{
idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu,
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);
@@ -358,7 +360,7 @@ static HRESULT WINAPI ISVBgCm_fnInvokeCommand(
}
else
{
- switch(LOWORD(lpcmi->lpVerb))
+ switch(LOWORD(lpcmi->lpVerb)-This->verb_offset)
{
case FCIDM_SHVIEW_REFRESH:
if (lpSV) IShellView_Refresh(lpSV);
diff --git a/dlls/shell32/shv_item_cmenu.c b/dlls/shell32/shv_item_cmenu.c
index 62c4c7f..2dd8cd6 100644
--- a/dlls/shell32/shv_item_cmenu.c
+++ b/dlls/shell32/shv_item_cmenu.c
@@ -47,13 +47,14 @@ WINE_DEFAULT_DEBUG_CHANNEL(shell);
*/
typedef struct
{
- IContextMenu2 IContextMenu2_iface;
- LONG ref;
- IShellFolder* pSFParent;
- LPITEMIDLIST pidl; /* root pidl */
- LPITEMIDLIST *apidl; /* array of child pidls */
- UINT cidl;
- BOOL bAllValues;
+ IContextMenu2 IContextMenu2_iface;
+ LONG ref;
+ IShellFolder* pSFParent;
+ LPITEMIDLIST pidl; /* root pidl */
+ LPITEMIDLIST *apidl; /* array of child pidls */
+ UINT cidl;
+ BOOL bAllValues;
+ UINT verb_offset;
} ItemCmImpl;
static inline ItemCmImpl *impl_from_IContextMenu2(IContextMenu2 *iface)
@@ -223,27 +224,26 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
UINT idCmdLast,
UINT uFlags)
{
- ItemCmImpl *This = impl_from_IContextMenu2(iface);
- INT uIDMax;
+ ItemCmImpl *This = impl_from_IContextMenu2(iface);
+ 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)
- FIXME("We should use idCmdFirst=%d and idCmdLast=%d for command ids\n", idCmdFirst, idCmdLast);
+ This->verb_offset=idCmdFirst;
- if(!(CMF_DEFAULTONLY & uFlags) && This->cidl>0)
- {
- HMENU hmenures = LoadMenuW(shell32_hInstance, MAKEINTRESOURCEW(MENU_SHV_FILE));
+ if(!(CMF_DEFAULTONLY & uFlags) && This->cidl>0)
+ {
+ HMENU hmenures = LoadMenuW(shell32_hInstance, MAKEINTRESOURCEW(MENU_SHV_FILE));
- if(uFlags & CMF_EXPLORE)
+ if(uFlags & CMF_EXPLORE)
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;
WCHAR str[255];
mi.cbSize = sizeof(mi);
@@ -253,18 +253,18 @@ static HRESULT WINAPI ISvItemCm_fnQueryContextMenu(
GetMenuItemInfoW(hmenu, FCIDM_SHVIEW_EXPLORE, MF_BYCOMMAND, &mi);
RemoveMenu(hmenu, FCIDM_SHVIEW_EXPLORE, MF_BYCOMMAND);
_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);
- else
+ else
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, 0);
+ return MAKE_HRESULT(SEVERITY_SUCCESS, 0, uIDMax-idCmdFirst);
+ }
+ return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0);
}
/**************************************************************************
@@ -520,7 +520,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand(
if (HIWORD(lpcmi->lpVerb) == 0)
{
- switch(LOWORD(lpcmi->lpVerb))
+ switch(LOWORD(lpcmi->lpVerb-This->verb_offset))
{
case FCIDM_SHVIEW_EXPLORE:
TRACE("Verb FCIDM_SHVIEW_EXPLORE\n");
@@ -551,7 +551,7 @@ static HRESULT WINAPI ISvItemCm_fnInvokeCommand(
DoOpenProperties(This, lpcmi->hwnd);
break;
default:
- FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb));
+ FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb)-This->verb_offset);
return E_INVALIDARG;
}
}
@@ -595,9 +595,9 @@ static HRESULT WINAPI ISvItemCm_fnGetCommandString(
break;
case GCS_VERBA:
- switch(idCommand)
+ switch(idCommand-This->verb_offset)
{
- case FCIDM_SHVIEW_RENAME:
+ case FCIDM_SHVIEW_RENAME:
strcpy(lpszName, "rename");
hr = NOERROR;
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
case, you need to do the lstrcpyW to the pointer passed.*/
case GCS_VERBW:
- switch(idCommand)
- { case FCIDM_SHVIEW_RENAME:
+ switch(idCommand-This->verb_offset)
+ {
+ case FCIDM_SHVIEW_RENAME:
MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen );
hr = NOERROR;
break;
More information about the wine-cvs
mailing list