Author: rharabien Date: Mon Jan 16 19:54:24 2012 New Revision: 54985
URL: http://svn.reactos.org/svn/reactos?rev=54985&view=rev Log: [SHELL32] - Load shell extensions from Directory key only for file system directories. Fixes New menu being added to special folders context menu (for example My Computer or Control Panel) - Load shell extensions from AllFilesystemObjects only for files and directories - Hardcode special folders attributes in proper place
Modified: trunk/reactos/dll/win32/shell32/defcontextmenu.cpp trunk/reactos/dll/win32/shell32/folders/desktop.cpp trunk/reactos/dll/win32/shell32/folders/mycomp.cpp trunk/reactos/dll/win32/shell32/newmenu.cpp trunk/reactos/dll/win32/shell32/shlfolder.cpp
Modified: trunk/reactos/dll/win32/shell32/defcontextmenu.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/defcontex... ============================================================================== --- trunk/reactos/dll/win32/shell32/defcontextmenu.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/defcontextmenu.cpp [iso-8859-1] Mon Jan 16 19:54:24 2012 @@ -144,7 +144,7 @@
if (!pdcm->cidl) { - /* Init pidlFolder only if is background context menu. See IShellExtInit::Initialize */ + /* Init pidlFolder only if it is background context menu. See IShellExtInit::Initialize */ if (pdcm->pidlFolder) m_pidlFolder = ILClone(pdcm->pidlFolder); else @@ -513,7 +513,7 @@
TRACE("BuildBackgroundContextMenu entered\n");
- if (!_ILIsDesktop(m_Dcm.pidlFolder)) + if (!_ILIsDesktop(m_pidlFolder)) { WCHAR wszBuf[MAX_PATH];
@@ -552,18 +552,24 @@ DisablePasteOptions(hMenu); }
- /* Load context menu handlers */ - HKEY hKey; - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Directory\Background", 0, KEY_READ, &hKey) == ERROR_SUCCESS) - { - EnumerateDynamicContextHandlerForKey(hKey); - RegCloseKey(hKey); - } - - if (InsertMenuItemsOfDynamicContextMenuExtension(hMenu, GetMenuItemCount(hMenu) - 1, iIdCmdFirst, iIdCmdLast)) - { - /* seperate dynamic context menu items */ - _InsertMenuItemW(hMenu, GetMenuItemCount(hMenu) - 1, TRUE, -1, MFT_SEPARATOR, NULL, MFS_ENABLED); + /* Directory is progid of filesystem folders only */ + LPITEMIDLIST pidlFolderLast = ILFindLastID(m_pidlFolder); + if (_ILIsDesktop(pidlFolderLast) || _ILIsDrive(pidlFolderLast) || _ILIsFolder(pidlFolderLast)) + { + /* Load context menu handlers */ + TRACE("Add background handlers: %p\n", m_pidlFolder); + HKEY hKey; + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Directory\Background", 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + EnumerateDynamicContextHandlerForKey(hKey); + RegCloseKey(hKey); + } + + if (InsertMenuItemsOfDynamicContextMenuExtension(hMenu, GetMenuItemCount(hMenu) - 1, iIdCmdFirst, iIdCmdLast)) + { + /* seperate dynamic context menu items */ + _InsertMenuItemW(hMenu, GetMenuItemCount(hMenu) - 1, TRUE, -1, MFT_SEPARATOR, NULL, MFS_ENABLED); + } }
return iIdCmdLast; @@ -795,24 +801,30 @@ rfg = 0; }
- if ((rfg & SFGAO_FOLDER) || _ILIsControlPanel(m_Dcm.apidl[0])) + if (rfg & SFGAO_FOLDER) { /* add the default verbs open / explore */ AddStaticEntryForFileClass(L"Folder"); - AddStaticEntryForFileClass(L"Directory"); if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Folder", 0, KEY_READ, &hKey) == ERROR_SUCCESS) { EnumerateDynamicContextHandlerForKey(hKey); RegCloseKey(hKey); } - if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Directory", 0, KEY_READ, &hKey) == ERROR_SUCCESS) - { - EnumerateDynamicContextHandlerForKey(hKey); - RegCloseKey(hKey); - } - } - - if (rfg & SFGAO_FILESYSTEM) + + /* Directory is only loaded for real filesystem directories */ + if (_ILIsFolder(m_Dcm.apidl[0])) + { + AddStaticEntryForFileClass(L"Directory"); + if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"Directory", 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + EnumerateDynamicContextHandlerForKey(hKey); + RegCloseKey(hKey); + } + } + } + + /* AllFilesystemObjects class is loaded only for files and directories */ + if (_ILIsFolder(m_Dcm.apidl[0]) || _ILIsValue(m_Dcm.apidl[0])) { if (RegOpenKeyExW(HKEY_CLASSES_ROOT, L"AllFilesystemObjects", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
Modified: trunk/reactos/dll/win32/shell32/folders/desktop.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/d... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/desktop.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/desktop.cpp [iso-8859-1] Mon Jan 16 19:54:24 2012 @@ -540,17 +540,18 @@ { HRESULT hr = S_OK; static const DWORD dwDesktopAttributes = - SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | - SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER; + SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR | + SFGAO_STORAGEANCESTOR | SFGAO_HASPROPSHEET | SFGAO_STORAGE | SFGAO_CANLINK; static const DWORD dwMyComputerAttributes = - SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | - SFGAO_DROPTARGET | SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER; + SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | + SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK; + static DWORD dwMyNetPlacesAttributes = + SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | + SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK;
TRACE("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
- if (!rgfInOut) - return E_INVALIDARG; if (cidl && !apidl) return E_INVALIDARG;
@@ -558,23 +559,21 @@ *rgfInOut = ~0;
if(cidl == 0) - { *rgfInOut &= dwDesktopAttributes; - } else { - while (cidl > 0 && *apidl) + /* TODO: always add SFGAO_CANLINK */ + for (UINT i = 0; i < cidl; ++i) { pdump(*apidl); if (_ILIsDesktop(*apidl)) *rgfInOut &= dwDesktopAttributes; - else if (_ILIsMyComputer(*apidl)) + else if (_ILIsMyComputer(apidl[i])) *rgfInOut &= dwMyComputerAttributes; + else if (_ILIsNetHood(apidl[i])) + *rgfInOut &= dwMyNetPlacesAttributes; else - SHELL32_GetItemAttributes((IShellFolder *)this, *apidl, rgfInOut); - - apidl++; - cidl--; + SHELL32_GetItemAttributes((IShellFolder *)this, apidl[i], rgfInOut); } } /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
Modified: trunk/reactos/dll/win32/shell32/folders/mycomp.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/m... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/mycomp.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/mycomp.cpp [iso-8859-1] Mon Jan 16 19:54:24 2012 @@ -365,39 +365,48 @@ */ HRESULT WINAPI CDrivesFolder::GetAttributesOf(UINT cidl, LPCITEMIDLIST * apidl, DWORD * rgfInOut) { - HRESULT hr = S_OK; static const DWORD dwComputerAttributes = - SFGAO_STORAGE | SFGAO_HASPROPSHEET | SFGAO_STORAGEANCESTOR | SFGAO_CANCOPY | - SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_FILESYSTEM | SFGAO_HASSUBFOLDER | SFGAO_CANRENAME | SFGAO_CANDELETE; + SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET | + SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK; + static const DWORD dwControlPanelAttributes = + SFGAO_HASSUBFOLDER | SFGAO_FOLDER | SFGAO_CANLINK; + static const DWORD dwDriveAttributes = + SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR | + SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANRENAME | SFGAO_CANLINK;
TRACE ("(%p)->(cidl=%d apidl=%p mask=%p (0x%08x))\n", this, cidl, apidl, rgfInOut, rgfInOut ? *rgfInOut : 0);
- if (!rgfInOut) - return E_INVALIDARG; if (cidl && !apidl) return E_INVALIDARG;
if (*rgfInOut == 0) *rgfInOut = ~0;
+ /* FIXME: always add SFGAO_CANLINK */ if(cidl == 0) *rgfInOut &= dwComputerAttributes; else { - while (cidl > 0 && *apidl) + for (UINT i = 0; i < cidl; ++i) { - pdump (*apidl); - SHELL32_GetItemAttributes (this, *apidl, rgfInOut); - apidl++; - cidl--; + if (_ILIsDrive(apidl[i])) + *rgfInOut &= dwDriveAttributes; + else if (_ILIsControlPanel(apidl[i])) + *rgfInOut &= dwControlPanelAttributes; + else + { + pdump(apidl[i]); + SHELL32_GetItemAttributes(this, apidl[i], rgfInOut); + } } } + /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */ *rgfInOut &= ~SFGAO_VALIDATE;
TRACE ("-- result=0x%08x\n", *rgfInOut); - return hr; + return S_OK; }
/**************************************************************************
Modified: trunk/reactos/dll/win32/shell32/newmenu.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/newmenu.c... ============================================================================== --- trunk/reactos/dll/win32/shell32/newmenu.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/newmenu.cpp [iso-8859-1] Mon Jan 16 19:54:24 2012 @@ -643,6 +643,7 @@ CNewMenu::Initialize(LPCITEMIDLIST pidlFolder, IDataObject *pdtobj, HKEY hkeyProgID) { + /* Load folder and shortcut icons */ HICON hIcon = (HICON)LoadImage(shell32_hInstance, MAKEINTRESOURCE(IDI_SHELL_FOLDER), IMAGE_ICON, 0, 0, LR_SHARED); m_hbmFolder = hIcon ? IconToBitmap(hIcon) : NULL; hIcon = (HICON)LoadImage(shell32_hInstance, MAKEINTRESOURCE(IDI_SHELL_SHORTCUT), IMAGE_ICON, 0, 0, LR_SHARED);
Modified: trunk/reactos/dll/win32/shell32/shlfolder.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/shlfolder... ============================================================================== --- trunk/reactos/dll/win32/shell32/shlfolder.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/shlfolder.cpp [iso-8859-1] Mon Jan 16 19:54:24 2012 @@ -397,17 +397,7 @@
dwAttributes = *pdwAttributes;
- /* Attributes of some special folders are hardcoded */ - if (_ILIsDrive(pidl)) - *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FILESYSTEM|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR| - SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANRENAME; - else if (_ILIsMyComputer(pidl) || _ILIsNetHood(pidl)) - *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_FILESYSANCESTOR| - SFGAO_DROPTARGET|SFGAO_HASPROPSHEET|SFGAO_CANDELETE| - SFGAO_CANRENAME|SFGAO_CANLINK; - else if (_ILIsControlPanel(pidl)) - *pdwAttributes &= SFGAO_HASSUBFOLDER|SFGAO_FOLDER|SFGAO_CANLINK; - else if (has_guid && HCR_GetFolderAttributes(pidl, &dwAttributes)) + if (has_guid && HCR_GetFolderAttributes(pidl, &dwAttributes)) *pdwAttributes = dwAttributes; else if (_ILGetDataPointer(pidl)) {