launch display properties dialog via desktop context menu
Modified: trunk/reactos/lib/shell32/shell32_main.h
Modified: trunk/reactos/lib/shell32/shfldr_desktop.c
Modified: trunk/reactos/lib/shell32/shlview.c
Modified: trunk/reactos/lib/shell32/shv_bg_cmenu.c

Modified: trunk/reactos/lib/shell32/shell32_main.h
--- trunk/reactos/lib/shell32/shell32_main.h	2005-03-13 15:30:29 UTC (rev 14011)
+++ trunk/reactos/lib/shell32/shell32_main.h	2005-03-13 15:43:02 UTC (rev 14012)
@@ -81,7 +81,7 @@
 
 LPCLASSFACTORY	IClassFactory_Constructor(REFCLSID);
 IContextMenu2 *	ISvItemCm_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST pidl, LPCITEMIDLIST *aPidls, UINT uItemCount);
-IContextMenu2 *	ISvBgCm_Constructor(LPSHELLFOLDER pSFParent);
+IContextMenu2 *	ISvBgCm_Constructor(LPSHELLFOLDER pSFParent, BOOL bDesktop);
 LPSHELLVIEW	IShellView_Constructor(LPSHELLFOLDER);
 
 HRESULT WINAPI IFSFolder_Constructor(IUnknown * pUnkOuter, REFIID riid, LPVOID * ppv);

Modified: trunk/reactos/lib/shell32/shfldr_desktop.c
--- trunk/reactos/lib/shell32/shfldr_desktop.c	2005-03-13 15:30:29 UTC (rev 14011)
+++ trunk/reactos/lib/shell32/shfldr_desktop.c	2005-03-13 15:43:02 UTC (rev 14012)
@@ -473,32 +473,48 @@
     if (ppvOut) {
 	*ppvOut = NULL;
 
-	if (IsEqualIID (riid, &IID_IContextMenu)) {
-	    pObj = (LPUNKNOWN) ISvItemCm_Constructor ((IShellFolder *) iface, This->pidlRoot, apidl, cidl);
-	    hr = S_OK;
-	} else if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1)) {
-	    pObj = (LPUNKNOWN) IDataObject_Constructor (hwndOwner, This->pidlRoot, apidl, cidl);
-	    hr = S_OK;
-	} else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1)) {
-	    pidl = ILCombine (This->pidlRoot, apidl[0]);
-	    pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl);
-	    SHFree (pidl);
-	    hr = S_OK;
-	} else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1)) {
-	    pidl = ILCombine (This->pidlRoot, apidl[0]);
-	    pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl);
-	    SHFree (pidl);
-	    hr = S_OK;
-	} else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1)) {
-	    hr = IShellFolder_QueryInterface (iface, &IID_IDropTarget, (LPVOID *) & pObj);
-	} else if ((IsEqualIID(riid,&IID_IShellLinkW) || IsEqualIID(riid,&IID_IShellLinkA))
-				&& (cidl == 1)) {
-	    pidl = ILCombine (This->pidlRoot, apidl[0]);
-	    hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj);
-	    SHFree (pidl);
-	} else {
-	    hr = E_NOINTERFACE;
-	}
+    if (IsEqualIID (riid, &IID_IDataObject) && (cidl >= 1))
+    {
+        pObj = (LPUNKNOWN) IDataObject_Constructor( hwndOwner,
+                                                  This->pidlRoot, apidl, cidl);
+        hr = S_OK;
+    }
+    else if ((IsEqualIID(riid,&IID_IShellLinkW) ||
+              IsEqualIID(riid,&IID_IShellLinkA)) && (cidl == 1))
+    {
+        pidl = ILCombine (This->pidlRoot, apidl[0]);
+        hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj);
+        SHFree (pidl);
+    }
+    else if (IsEqualIID (riid, &IID_IContextMenu))
+    {
+        if (cidl > 0)
+            pObj = (LPUNKNOWN) ISvItemCm_Constructor( (IShellFolder *) iface, This->pidlRoot, apidl, cidl);
+        else
+            pObj = (LPUNKNOWN) ISvBgCm_Constructor( (IShellFolder *) iface, TRUE);
+        hr = S_OK;
+    }
+    else if (IsEqualIID (riid, &IID_IExtractIconA) && (cidl == 1))
+    {
+        pidl = ILCombine (This->pidlRoot, apidl[0]);
+        pObj = (LPUNKNOWN) IExtractIconA_Constructor (pidl);
+        SHFree (pidl);
+        hr = S_OK;
+    }
+    else if (IsEqualIID (riid, &IID_IExtractIconW) && (cidl == 1))
+    {
+        pidl = ILCombine (This->pidlRoot, apidl[0]);
+        pObj = (LPUNKNOWN) IExtractIconW_Constructor (pidl);
+        SHFree (pidl);
+        hr = S_OK;
+    }
+    else if (IsEqualIID (riid, &IID_IDropTarget) && (cidl >= 1))
+    {
+        hr = IShellFolder_QueryInterface (iface,
+                                          &IID_IDropTarget, (LPVOID *) & pObj);
+    }
+    else
+        hr = E_NOINTERFACE;
 
 	if (SUCCEEDED(hr) && !pObj)
 	    hr = E_OUTOFMEMORY;

Modified: trunk/reactos/lib/shell32/shlview.c
--- trunk/reactos/lib/shell32/shlview.c	2005-03-13 15:30:29 UTC (rev 14011)
+++ trunk/reactos/lib/shell32/shlview.c	2005-03-13 15:43:02 UTC (rev 14012)
@@ -988,7 +988,7 @@
 	{
 	  hMenu = CreatePopupMenu();
 
-	  pCM = ISvBgCm_Constructor(This->pSFParent);
+	  pCM = ISvBgCm_Constructor(This->pSFParent, FALSE);
 	  IContextMenu2_QueryContextMenu(pCM, hMenu, 0, FCIDM_SHVIEWFIRST, FCIDM_SHVIEWLAST, 0);
 
 	  uCommand = TrackPopupMenu( hMenu, TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,This->hWnd,NULL);
@@ -1977,7 +1977,7 @@
 	switch(uItem)
 	{
 	  case SVGIO_BACKGROUND:
-	    *ppvOut = ISvBgCm_Constructor(This->pSFParent);
+	    *ppvOut = ISvBgCm_Constructor(This->pSFParent, FALSE);
 	    break;
 
 	  case SVGIO_SELECTION:

Modified: trunk/reactos/lib/shell32/shv_bg_cmenu.c
--- trunk/reactos/lib/shell32/shv_bg_cmenu.c	2005-03-13 15:30:29 UTC (rev 14011)
+++ trunk/reactos/lib/shell32/shv_bg_cmenu.c	2005-03-13 15:43:02 UTC (rev 14012)
@@ -46,6 +46,7 @@
 	IContextMenu2Vtbl *lpVtbl;
 	IShellFolder*	pSFParent;
 	DWORD		ref;
+	BOOL		bDesktop;
 } BgCmImpl;
 
 
@@ -54,7 +55,7 @@
 /**************************************************************************
 *   ISVBgCm_Constructor()
 */
-IContextMenu2 *ISvBgCm_Constructor(IShellFolder*	pSFParent)
+IContextMenu2 *ISvBgCm_Constructor(IShellFolder* pSFParent, BOOL bDesktop)
 {
 	BgCmImpl* cm;
 
@@ -62,6 +63,7 @@
 	cm->lpVtbl = &cmvt;
 	cm->ref = 1;
 	cm->pSFParent = pSFParent;
+	cm->bDesktop = bDesktop;
 	if(pSFParent) IShellFolder_AddRef(pSFParent);
 
 	TRACE("(%p)->()\n",cm);
@@ -362,12 +364,22 @@
 	      case FCIDM_SHVIEW_NEWFOLDER:
 	        DoNewFolder(iface, lpSV);
 		break;
+
 	      case FCIDM_SHVIEW_INSERT:
 	        DoPaste(iface);
 	        break;
+
+	      case FCIDM_SHVIEW_PROPERTIES:
+		if (This->bDesktop) {
+		    ShellExecuteA(lpcmi->hwnd, "open", "rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL, NULL, SW_SHOWNORMAL);
+		} else {
+		    FIXME("launch item properties dialog\n");
+		}
+		break;
+
 	      default:
 	        /* if it's a id just pass it to the parent shv */
-	        SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0),0 );
+	        if (hWndSV) SendMessageA(hWndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0),0 );
 		break;
 	    }
 	  }