From baae7c4950b2231d2d25799aacea4096fc1e53e4 Mon Sep 17 00:00:00 2001
From: Juergen Schmied <juergen.schmied@metronet.de>
Date: Fri, 11 Dec 1998 11:06:50 +0000
Subject: [PATCH] Bugfix in PathCombine32[A|W]. View menu in explorer and on
 right mouse button is working now.

---
 dlls/shell32/shell32_main.h |   1 +
 dlls/shell32/shellpath.c    |  20 +++--
 dlls/shell32/shlview.c      | 174 +++++++++++++++++-------------------
 3 files changed, 96 insertions(+), 99 deletions(-)

diff --git a/dlls/shell32/shell32_main.h b/dlls/shell32/shell32_main.h
index e270f0522dd..850e28d9f2a 100644
--- a/dlls/shell32/shell32_main.h
+++ b/dlls/shell32/shell32_main.h
@@ -39,6 +39,7 @@ extern HICON32	WINAPI SIC_GetIcon (LPSTR sSourceFile, DWORD dwSourceIndex, BOOL3
 
 /* Classes Root */
 extern BOOL32 WINAPI HCR_MapTypeToValue ( LPSTR szExtension, LPSTR szFileType, DWORD len);
+extern BOOL32 WINAPI HCR_GetExecuteCommand ( LPCSTR szClass, LPCSTR szVerb, LPSTR szDest, DWORD len );
 
 HGLOBAL32	WINAPI SHAllocShared(LPVOID psrc, DWORD size, DWORD procID);
 LPVOID		WINAPI SHLockShared(HANDLE32 hmem, DWORD procID);
diff --git a/dlls/shell32/shellpath.c b/dlls/shell32/shellpath.c
index 90908ee5210..85ab2c53265 100644
--- a/dlls/shell32/shellpath.c
+++ b/dlls/shell32/shellpath.c
@@ -305,10 +305,12 @@ LPSTR WINAPI PathCombine32A(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile)
 	if (PathIsRoot32A(lpszFile))
 	{ strcpy(szDest,lpszFile);
 	}
-	strcpy(sTemp,lpszDir);
-	PathAddBackslash32A(sTemp);
-	strcat(sTemp,lpszFile);
-	strcpy(szDest,sTemp);
+	else
+	{ strcpy(sTemp,lpszDir);
+	  PathAddBackslash32A(sTemp);
+	  strcat(sTemp,lpszFile);
+	  strcpy(szDest,sTemp);
+	}
 	return szDest;
 }
 LPWSTR WINAPI PathCombine32W(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile) 
@@ -326,10 +328,12 @@ LPWSTR WINAPI PathCombine32W(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile)
 	if (PathIsRoot32W(lpszFile))
 	{ lstrcpy32W(szDest,lpszFile);
 	}
-	lstrcpy32W(sTemp,lpszDir);
-	PathAddBackslash32W(sTemp);
-	lstrcat32W(sTemp,lpszFile);
-	lstrcpy32W(szDest,sTemp);
+	else
+	{ lstrcpy32W(sTemp,lpszDir);
+	  PathAddBackslash32W(sTemp);
+	  lstrcat32W(sTemp,lpszFile);
+	  lstrcpy32W(szDest,sTemp);
+	}
 	return szDest;
 }
 LPVOID WINAPI PathCombine32AW(LPVOID szDest, LPCVOID lpszDir, LPCVOID lpszFile) 
diff --git a/dlls/shell32/shlview.c b/dlls/shell32/shlview.c
index bbe2eab6cac..3aadc737603 100644
--- a/dlls/shell32/shlview.c
+++ b/dlls/shell32/shlview.c
@@ -97,6 +97,9 @@ typedef struct
    BYTE  bStyle;
 } MYTOOLINFO, *LPMYTOOLINFO;
 
+extern 	LPCVOID _Resource_Men_MENU_001_0_data;
+extern 	LPCVOID _Resource_Men_MENU_002_0_data;
+
 MYTOOLINFO g_Tools[] = 
 { {IDM_VIEW_FILES, 0, IDS_TB_VIEW_FILES, IDS_MI_VIEW_FILES, 0, TBSTATE_ENABLED, TBSTYLE_BUTTON},
   {-1, 0, 0, 0, 0, 0, 0}   
@@ -495,12 +498,23 @@ void ShellView_MergeFileMenu(LPSHELLVIEW this, HMENU32 hSubMenu)
 /**************************************************************************
 * ShellView_MergeViewMenu()
 */   
+
 void ShellView_MergeViewMenu(LPSHELLVIEW this, HMENU32 hSubMenu)
-{	TRACE(shell,"(%p)->(submenu=0x%08x) stub\n",this,hSubMenu);
+{	MENUITEMINFO32A	mii;
+
+	TRACE(shell,"(%p)->(submenu=0x%08x)\n",this,hSubMenu);
+
 	if(hSubMenu)
 	{ /*add a separator at the correct position in the menu*/
 	  _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, 0, MFT_SEPARATOR, NULL, MFS_ENABLED);
-	  _InsertMenuItem(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, IDM_VIEW_FILES, MFT_STRING, TEXT("_View"), MFS_ENABLED);
+
+	  ZeroMemory(&mii, sizeof(mii));
+	  mii.cbSize = sizeof(mii);
+	  mii.fMask = MIIM_SUBMENU | MIIM_TYPE | MIIM_DATA;;
+          mii.fType = MFT_STRING;
+ 	  mii.dwTypeData = "View";
+	  mii.hSubMenu = LoadMenuIndirect32A(&_Resource_Men_MENU_001_0_data);
+	  InsertMenuItem32A(hSubMenu, FCIDM_MENU_VIEW_SEP_OPTIONS, FALSE, &mii);
 	}
 }
 /**************************************************************************
@@ -769,6 +783,52 @@ LRESULT ShellView_OnSettingChange(LPSHELLVIEW this, LPCSTR lpszSection)
 	}
 	return 0;
 }
+/**************************************************************************
+* ShellView_OnCommand()
+*/   
+LRESULT ShellView_OnCommand(LPSHELLVIEW this,DWORD dwCmdID, DWORD dwCmd, HWND32 hwndCmd)
+{	TRACE(shell,"(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",this, dwCmdID, dwCmd, hwndCmd);
+	switch(dwCmdID)
+	{ case IDM_VIEW_FILES:
+	    g_bViewKeys = ! g_bViewKeys;
+	    IShellView_Refresh(this);
+	    break;
+
+	  case IDM_VIEW_IDW:
+	    g_bShowIDW = ! g_bShowIDW;
+	    ShellView_AddRemoveDockingWindow(this, g_bShowIDW);
+	    break;
+   
+	  case IDM_MYFILEITEM:
+	    MessageBeep32(MB_OK);
+	    break;
+
+	  case FCIDM_SHVIEW_SMALLICON:
+	    this->FolderSettings.ViewMode = FVM_SMALLICON;
+	    SetStyle (this, LVS_SMALLICON, LVS_TYPEMASK);
+	    break;
+
+	  case FCIDM_SHVIEW_BIGICON:
+	    this->FolderSettings.ViewMode = FVM_ICON;
+	    SetStyle (this, LVS_ICON, LVS_TYPEMASK);
+	    break;
+
+	  case FCIDM_SHVIEW_LISTVIEW:
+	    this->FolderSettings.ViewMode = FVM_LIST;
+	    SetStyle (this, LVS_LIST, LVS_TYPEMASK);
+	    break;
+
+	  case FCIDM_SHVIEW_REPORTVIEW:
+	    this->FolderSettings.ViewMode = FVM_DETAILS;
+	    SetStyle (this, LVS_REPORT, LVS_TYPEMASK);
+	    break;
+
+	  default:
+	    FIXME(shell,"-- COMMAND unhandled\n");
+	}
+	return 0;
+}
+
 /**************************************************************************
 *   ShellView_GetSelections()
 *
@@ -823,13 +883,9 @@ void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault)
 
 	/* look, what's selected and create a context menu object of it*/
 	if(ShellView_GetSelections(this))
-	{ this->pSFParent->lpvtbl->fnGetUIObjectOf(	this->pSFParent,
-							this->hWndParent,
-							this->uSelected,
-							this->aSelectedItems,
-							(REFIID)&IID_IContextMenu,
-							NULL,
-							(LPVOID *)&pContextMenu);
+	{ this->pSFParent->lpvtbl->fnGetUIObjectOf( this->pSFParent, this->hWndParent, this->uSelected,
+						    this->aSelectedItems, (REFIID)&IID_IContextMenu,
+						    NULL, (LPVOID *)&pContextMenu);
    
 	  if(pContextMenu)
 	  { TRACE(shell,"-- pContextMenu\n");
@@ -850,8 +906,7 @@ void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault)
 	      { if( fDefault )
 	        { TRACE(shell,"-- get menu default command\n");
 
-	          uCommand = 0;
-	          nMenuIndex = 0;
+	          uCommand = nMenuIndex = 0;
        	          ZeroMemory(&mii, sizeof(mii));
 	          mii.cbSize = sizeof(mii);
 	          mii.fMask = MIIM_STATE | MIIM_ID;
@@ -867,102 +922,39 @@ void ShellView_DoContextMenu(LPSHELLVIEW this, WORD x, WORD y, BOOL32 fDefault)
 	        else
 	        { TRACE(shell,"-- track popup\n");
 	          uCommand = TrackPopupMenu32( hMenu,TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,this->hWnd,NULL);
-	        }
+	        }		
          
 	        if(uCommand > 0)
 	        { TRACE(shell,"-- uCommand=%u\n", uCommand);
-	          if (((uCommand-MENU_OFFSET) == IDM_EXPLORE) || ((uCommand-MENU_OFFSET)  == IDM_OPEN))
-		  { if (IsInCommDlg(this))			/* are we part of a commctrl? */
-		    { TRACE(shell,"-- dlg: OnDefaultCommand\n");
-		      OnDefaultCommand(this);
-		    }
-		    else					/* we are acting with a full featured IShellBrowser */
-		    { TRACE(shell,"-- explorer: BrowseObject pidl =%p\n", this->aSelectedItems[0]);
-		      /*wFlags = SBSP_SAMEBROWSER | SBSP_DEFMODE | SBSP_RELATIVE;
-		      IShellBrowser_BrowseObject(this->pShellBrowser, this->aSelectedItems[0], wFlags);*/
-		      {	int i = ILGetSize( this->aSelectedItems[0] );
-			char commandline[255];
-	                STARTUPINFO32A  startupinfo;
-			PROCESS_INFORMATION processinformation;
-			HGLOBAL32 hmem;
-
-	                ZeroMemory(&startupinfo,sizeof(STARTUPINFO32A));
-			startupinfo.cb = sizeof(STARTUPINFO32A);
-						
-		        hmem = SHAllocShared ( this->aSelectedItems[0], i, 0);
-			
-			sprintf (commandline, " /N,/IDList,:%li", (DWORD)SHLockShared(hmem,0));
-			CreateProcess32A("explorer.exe", commandline, NULL, NULL, FALSE, 0, 
-					NULL, NULL, &startupinfo, &processinformation);
-			SHUnlockShared(hmem);
-			
-		      }
-		    }
+	          if (IsInCommDlg(this) && (((uCommand-MENU_OFFSET)==IDM_EXPLORE) || ((uCommand-MENU_OFFSET)==IDM_OPEN)))
+		  { TRACE(shell,"-- dlg: OnDefaultCommand\n");
+		    OnDefaultCommand(this);
 		  }
 		  else
-		  { TRACE(shell,"-- invoke command\n");
-		    ZeroMemory(&cmi, sizeof(cmi));
-	            cmi.cbSize = sizeof(cmi);
-	            cmi.hwnd = this->hWndParent;
-	            cmi.lpVerb = (LPCSTR)MAKEINTRESOURCE32A(uCommand - MENU_OFFSET);
-		    pContextMenu->lpvtbl->fnInvokeCommand(pContextMenu, &cmi);
+		  { TRACE(shell,"-- explore -- invoke command\n");
+		      ZeroMemory(&cmi, sizeof(cmi));
+	              cmi.cbSize = sizeof(cmi);
+	              cmi.hwnd = this->hWndParent;
+	              cmi.lpVerb = (LPCSTR)MAKEINTRESOURCE32A(uCommand - MENU_OFFSET);
+		      pContextMenu->lpvtbl->fnInvokeCommand(pContextMenu, &cmi);
 		  }
 	        }
 	        DestroyMenu32(hMenu);
 	      }
 	    }
-	    pContextMenu->lpvtbl->fnRelease(pContextMenu);
+	    if (pContextMenu)
+	      pContextMenu->lpvtbl->fnRelease(pContextMenu);
 	  }
 	  SHFree(this->aSelectedItems);
 	  this->aSelectedItems=NULL;
 	  this->uSelected=0;
 	}
-}
-
-/**************************************************************************
-* ShellView_OnCommand()
-*/   
-LRESULT ShellView_OnCommand(LPSHELLVIEW this,DWORD dwCmdID, DWORD dwCmd, HWND32 hwndCmd)
-{	TRACE(shell,"(%p)->(0x%08lx 0x%08lx 0x%08x) stub\n",this, dwCmdID, dwCmd, hwndCmd);
-	switch(dwCmdID)
-	{ case IDM_VIEW_FILES:
-	    g_bViewKeys = ! g_bViewKeys;
-	    IShellView_Refresh(this);
-	    break;
-
-	  case IDM_VIEW_IDW:
-	    g_bShowIDW = ! g_bShowIDW;
-	    ShellView_AddRemoveDockingWindow(this, g_bShowIDW);
-	    break;
-   
-	  case IDM_MYFILEITEM:
-	    MessageBeep32(MB_OK);
-	    break;
-
-	  case FCIDM_SHVIEW_SMALLICON:
-	    this->FolderSettings.ViewMode = FVM_SMALLICON;
-	    SetStyle (this, LVS_SMALLICON, LVS_TYPEMASK);
-	    break;
-
-	  case FCIDM_SHVIEW_BIGICON:
-	    this->FolderSettings.ViewMode = FVM_ICON;
-	    SetStyle (this, LVS_ICON, LVS_TYPEMASK);
-	    break;
-
-	  case FCIDM_SHVIEW_LISTVIEW:
-	    this->FolderSettings.ViewMode = FVM_LIST;
-	    SetStyle (this, LVS_LIST, LVS_TYPEMASK);
-	    break;
-
-	  case FCIDM_SHVIEW_REPORTVIEW:
-	    this->FolderSettings.ViewMode = FVM_DETAILS;
-	    SetStyle (this, LVS_REPORT, LVS_TYPEMASK);
-	    break;
-
-	  default:
-	    FIXME(shell,"-- COMMAND unhandled\n");
+	else	/* background context menu */
+	{ hMenu = LoadMenuIndirect32A(&_Resource_Men_MENU_002_0_data);
+	  uCommand = TrackPopupMenu32( GetSubMenu32(hMenu,0),TPM_LEFTALIGN | TPM_RETURNCMD,x,y,0,this->hWnd,NULL);
+	  ShellView_OnCommand(this, uCommand, 0,0);
+	  DestroyMenu32(hMenu);
 	}
-	return 0;
 }
 
 /**************************************************************************
-- 
GitLab