From a0ec7d507f61c1ac1718e0928fe5a7eb76f83adf Mon Sep 17 00:00:00 2001 From: David Quintana Date: Wed, 29 Oct 2014 11:52:45 +0000 Subject: [PATCH] [RSHELL] * Fix assumption that the USER folder will always exist and only the COMMON folder may be missing. Allows the Start Menu to work in livecd. [BROWSEUI] * Apply the same fix to the Favorites folder, although the LiveCD does not currently have the folder so it will not work regardless. svn path=/branches/shell-experiments/; revision=65098 --- base/shell/rshell/CStartMenu.cpp | 34 +++++++++++++++++++++----- dll/win32/browseui/internettoolbar.cpp | 25 +++++++++++++++---- 2 files changed, 48 insertions(+), 11 deletions(-) diff --git a/base/shell/rshell/CStartMenu.cpp b/base/shell/rshell/CStartMenu.cpp index 79c7864a5d2..9019aec99c5 100644 --- a/base/shell/rshell/CStartMenu.cpp +++ b/base/shell/rshell/CStartMenu.cpp @@ -21,6 +21,8 @@ #include "CMergedFolder.h" +WINE_DEFAULT_DEBUG_CHANNEL(CStartMenu); + // TODO: declare these GUIDs and interfaces in the right place (whatever that may be) IID IID_IAugmentedShellFolder = { 0x91EA3F8C, 0xC99B, 0x11D0, { 0x98, 0x15, 0x00, 0xC0, 0x4F, 0xD9, 0x19, 0x72 } }; IID IID_IAugmentedShellFolder2 = { 0x8DB3B3F4, 0x6CFE, 0x11D1, { 0x8A, 0xE9, 0x00, 0xC0, 0x4F, 0xD9, 0x18, 0xD0 } }; @@ -336,15 +338,30 @@ static HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu) hr = SHGetSpecialFolderLocation(NULL, CSIDL_STARTMENU, &pidlUserStartMenu); if (FAILED(hr)) - return hr; - - if (FAILED(SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_STARTMENU, &pidlCommonStartMenu))) { + WARN("Failed to get the USER start menu folder. Trying to run with just the COMMON one.\n"); + + hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_STARTMENU, &pidlCommonStartMenu); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + TRACE("COMMON start menu obtained.\n"); + hr = BindToDesktop(pidlCommonStartMenu, ppsfStartMenu); + ILFree(pidlCommonStartMenu); + return hr; + } + + hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_STARTMENU, &pidlCommonStartMenu); + if (FAILED_UNEXPECTEDLY(hr)) + { + WARN("Failed to get the COMMON start menu folder. Will use only the USER contents.\n"); hr = BindToDesktop(pidlUserStartMenu, ppsfStartMenu); ILFree(pidlUserStartMenu); return hr; } + TRACE("Both COMMON and USER statr menu folders obtained, merging them...\n"); + hr = BindToDesktop(pidlUserStartMenu, &psfUserStartMenu); if (FAILED_UNEXPECTEDLY(hr)) return hr; @@ -353,7 +370,7 @@ static HRESULT GetStartMenuFolder(IShellFolder ** ppsfStartMenu) if (FAILED_UNEXPECTEDLY(hr)) return hr; -#if 1 +#if !USE_SYSTEM_MERGED_FOLDERS hr = CMergedFolder_Constructor(IID_PPV_ARG(IAugmentedShellFolder, &pasf)); #else hr = CoCreateInstance(CLSID_MergedFolder, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARG(IAugmentedShellFolder, &pasf)); @@ -447,8 +464,13 @@ CStartMenu_Constructor(REFIID riid, void **ppv) return hr; hr = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &pidlProgramsAbsolute); - if (FAILED_UNEXPECTEDLY(hr)) - return hr; + if (FAILED(hr)) + { + WARN("USER Programs folder not found."); + hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_PROGRAMS, &pidlProgramsAbsolute); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + } pidlPrograms = ILClone(ILFindLastID(pidlProgramsAbsolute)); ILFree(pidlProgramsAbsolute); diff --git a/dll/win32/browseui/internettoolbar.cpp b/dll/win32/browseui/internettoolbar.cpp index 68b939e04fc..1f0bfda0259 100644 --- a/dll/win32/browseui/internettoolbar.cpp +++ b/dll/win32/browseui/internettoolbar.cpp @@ -446,15 +446,30 @@ static HRESULT GetFavoritesFolder(IShellFolder ** ppsfFavorites, LPITEMIDLIST * hr = SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidlUserFavorites); if (FAILED(hr)) - return hr; - - if (FAILED(SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_FAVORITES, &pidlCommonFavorites))) { - hr = BindToDesktop(pidlUserFavorites, ppsfFavorites); - *ppidl = pidlUserFavorites; + WARN("Failed to get the USER favorites folder. Trying to run with just the COMMON one.\n"); + + hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_FAVORITES, &pidlCommonFavorites); + if (FAILED_UNEXPECTEDLY(hr)) + return hr; + + TRACE("COMMON start menu obtained.\n"); + *ppidl = pidlCommonFavorites; + hr = BindToDesktop(pidlCommonFavorites, ppsfFavorites); return hr; } + hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_FAVORITES, &pidlCommonFavorites); + if (FAILED_UNEXPECTEDLY(hr)) + { + WARN("Failed to get the COMMON favorites folder. Will use only the USER contents.\n"); + *ppidl = pidlCommonFavorites; + hr = BindToDesktop(pidlUserFavorites, ppsfFavorites); + return hr; + } + + TRACE("Both COMMON and USER favorites folders obtained, merging them...\n"); + hr = BindToDesktop(pidlUserFavorites, &psfUserFavorites); if (FAILED_UNEXPECTEDLY(hr)) return hr;