support for owner drawn context menus on the desktop
Modified: trunk/reactos/subsys/system/explorer/desktop/desktop.cpp
Modified: trunk/reactos/subsys/system/explorer/desktop/desktop.h

Modified: trunk/reactos/subsys/system/explorer/desktop/desktop.cpp
--- trunk/reactos/subsys/system/explorer/desktop/desktop.cpp	2005-02-06 10:23:29 UTC (rev 13432)
+++ trunk/reactos/subsys/system/explorer/desktop/desktop.cpp	2005-02-06 10:38:51 UTC (rev 13433)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2003, 2004 Martin Fuchs
+ * Copyright 2003, 2004, 2005 Martin Fuchs
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -473,6 +473,11 @@
  :	super(hwnd),
 	_pShellView(pShellView)
 {
+	_pctxmenu2 = NULL;
+#ifndef __MINGW32__	// IContextMenu3 missing in MinGW (as of 6.2.2005)
+	_pctxmenu3 = NULL;
+#endif
+
 	_hwndListView = ::GetNextWindow(hwnd, GW_CHILD);
 
 	SetWindowStyle(_hwndListView, GetWindowStyle(_hwndListView)&~LVS_ALIGNMASK);//|LVS_ALIGNTOP|LVS_AUTOARRANGE);
@@ -541,6 +546,36 @@
 	  case PM_DISPLAY_VERSION:
 		return SendMessage(_hwndListView, nmsg, wparam, lparam);
 
+#ifndef __MINGW32__	// IContextMenu3 missing in MinGW (as of 6.2.2005)
+	  case WM_MENUCHAR:	// only supported by IContextMenu3
+	   if (_pctxmenu3) {
+		   LRESULT lResult = 0;
+
+		   _pctxmenu3->HandleMenuMsg2(nmsg, wparam, lparam, &lResult);
+
+		   return lResult;
+	   }
+	   break;
+#endif
+
+	  case WM_DRAWITEM:
+	  case WM_MEASUREITEM:
+		if (wparam)
+		  break; // If wParam != 0 then the message is not menu-related.
+
+		// fall through
+
+	  case WM_INITMENUPOPUP:
+#ifndef __MINGW32__	// IContextMenu3 missing in MinGW (as of 6.2.2005)
+		if (_pctxmenu3)
+		   _pctxmenu3->HandleMenuMsg(nmsg, wparam, lparam);
+		else
+#endif
+		if (_pctxmenu2)
+		   _pctxmenu2->HandleMenuMsg(nmsg, wparam, lparam);
+
+		return nmsg==WM_INITMENUPOPUP? 0: TRUE;	// Inform caller that we handled WM_INITPOPUPMENU by ourself.
+
 	  default:
 		return super::WndProc(nmsg, wparam, lparam);
 	}
@@ -599,11 +634,29 @@
 
 HRESULT DesktopShellView::DoDesktopContextMenu(int x, int y)
 {
+	IContextMenu* pcm1;
 	IContextMenu* pcm;
 
-	HRESULT hr = DesktopFolder()->GetUIObjectOf(_hwnd, 0, NULL, IID_IContextMenu, NULL, (LPVOID*)&pcm);
+	HRESULT hr = DesktopFolder()->GetUIObjectOf(_hwnd, 0, NULL, IID_IContextMenu, NULL, (LPVOID*)&pcm1);
 
 	if (SUCCEEDED(hr)) {
+		 // Get the higher version context menu interfaces.
+		_pctxmenu2 = NULL;
+#ifndef __MINGW32__	// IContextMenu3 missing in MinGW (as of 6.2.2005)
+		_pctxmenu3 = NULL;
+
+		if (pcm1->QueryInterface(IID_IContextMenu3, (void**)&pcm) == NOERROR)
+			_pctxmenu3 = (LPCONTEXTMENU3)pcm;
+		else
+#endif
+		if (pcm1->QueryInterface (IID_IContextMenu2, (void**)&pcm) == NOERROR)
+			_pctxmenu2 = (LPCONTEXTMENU2)pcm;
+
+		if (pcm)
+			pcm1->Release();
+		else
+			pcm = pcm1;
+
 		HMENU hmenu = CreatePopupMenu();
 
 		if (hmenu) {
@@ -615,6 +668,11 @@
 
 				UINT idCmd = TrackPopupMenu(hmenu, TPM_LEFTALIGN|TPM_RETURNCMD|TPM_RIGHTBUTTON, x, y, 0, _hwnd, NULL);
 
+				_pctxmenu2 = NULL;
+#ifndef __MINGW32__	// IContextMenu3 missing in MinGW (as of 6.2.2005)
+				_pctxmenu3 = NULL;
+#endif
+
 				if (idCmd == FCIDM_SHVIEWLAST-1) {
 					explorer_about(_hwnd);
 				} else if (idCmd) {

Modified: trunk/reactos/subsys/system/explorer/desktop/desktop.h
--- trunk/reactos/subsys/system/explorer/desktop/desktop.h	2005-02-06 10:23:29 UTC (rev 13432)
+++ trunk/reactos/subsys/system/explorer/desktop/desktop.h	2005-02-06 10:38:51 UTC (rev 13433)
@@ -187,4 +187,9 @@
 	DesktopDropTarget* _pDropTarget;
 	HWND	_hwndListView;
 	int		_icon_algo;
+
+	IContextMenu2*	_pctxmenu2;
+#ifndef __MINGW32__	// IContextMenu3 missing in MinGW (as of 6.2.2005)
+	IContextMenu3*	_pctxmenu3;
+#endif
 };