[SHELL32] CFolderOptions Reset can call DefView directly if there is no browser (#7806)

CORE-20029
This commit is contained in:
Whindmar Saksit 2025-03-28 23:15:01 +01:00 committed by GitHub
parent cfde03ec9b
commit 090d563488
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 52 additions and 14 deletions

View file

@ -4240,13 +4240,13 @@ HRESULT WINAPI CDefView::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCm
SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\ShellNoRoam\\Bags");
if (SUCCEEDED(GetDefaultViewStream(STGM_WRITE, &pStream)))
SaveViewState(pStream);
break;
return S_OK;
case DVCMDID_RESET_DEFAULTFOLDER_SETTINGS:
wsprintfW(SubKey, L"%s\\%s", REGSTR_PATH_EXPLORER, L"Streams\\Default");
PathCombineW(SubKey, REGSTR_PATH_EXPLORER, L"Streams\\Default");
SHDeleteKey(HKEY_CURRENT_USER, SubKey);
SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\ShellNoRoam\\Bags");
m_FolderSettings.fFlags |= FWF_NOBROWSERVIEWSTATE; // Don't let this folder save itself
break;
return S_OK;
}
}

View file

@ -113,6 +113,45 @@ HRESULT STDMETHODCALLTYPE CFolderOptions::GetSite(REFIID riid, void **ppvSite)
/*************************************************************************
* FolderOptions helper methods
*/
static HRESULT ResetGlobalFolderSettings()
{
IGlobalFolderSettings *pgfs;
HRESULT hr = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER,
IID_PPV_ARG(IGlobalFolderSettings, &pgfs));
if (SUCCEEDED(hr))
{
hr = pgfs->Set(NULL, 0, 0);
pgfs->Release();
}
return hr;
}
static inline HRESULT ExecResetDefViewFolderSettings(IUnknown *pUnk)
{
return IUnknown_Exec(pUnk, CGID_DefView, DVCMDID_RESET_DEFAULTFOLDER_SETTINGS,
OLECMDEXECOPT_DODEFAULT, NULL, NULL);
}
static HRESULT ResetDefViewFolderSettings()
{
CComPtr<IShellFolder> pSF;
HRESULT hr = SHGetDesktopFolder(&pSF);
if (SUCCEEDED(hr))
{
CComPtr<IShellView> pSV;
SFV_CREATE create = { sizeof(SFV_CREATE), pSF };
if (SUCCEEDED(hr = SHCreateShellFolderView(&create, &pSV)))
hr = ExecResetDefViewFolderSettings(pSV);
}
return hr;
}
HRESULT CFolderOptions::ResetGlobalAndDefViewFolderSettings()
{
ResetDefViewFolderSettings();
return ResetGlobalFolderSettings();
}
HRESULT CFolderOptions::HandleDefFolderSettings(int Action)
{
IBrowserService2 *bs2;
@ -126,25 +165,19 @@ HRESULT CFolderOptions::HandleDefFolderSettings(int Action)
else if (Action == DFSA_RESET)
{
// There does not seem to be a method in IBrowserService2 for this
IUnknown_Exec(bs2, CGID_DefView, DVCMDID_RESET_DEFAULTFOLDER_SETTINGS, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
ExecResetDefViewFolderSettings(bs2);
}
else
{
// FFSA_QUERY: hr is already correct
// DFSA_QUERY: hr is already correct
}
bs2->Release();
}
if (Action == DFSA_RESET)
{
IGlobalFolderSettings *pgfs;
HRESULT hr = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER,
IID_IGlobalFolderSettings, (void **)&pgfs);
if (SUCCEEDED(hr))
{
hr = pgfs->Set(NULL, 0, 0);
pgfs->Release();
}
// In case the browser is hosting a 3rd-party view, we force a DefView reset
hr = ResetGlobalAndDefViewFolderSettings();
}
return hr;

View file

@ -66,6 +66,8 @@ class CFolderOptions :
return HandleDefFolderSettings(ResetToDefault ? DFSA_RESET : DFSA_APPLY);
}
static HRESULT ResetGlobalAndDefViewFolderSettings();
DECLARE_REGISTRY_RESOURCEID(IDR_FOLDEROPTIONS)
DECLARE_NOT_AGGREGATABLE(CFolderOptions)

View file

@ -975,9 +975,12 @@ FolderOptionsViewDlg(
case IDC_VIEW_RESET_ALL:
{
HRESULT hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
bool ResetToDefault = LOWORD(wParam) == IDC_VIEW_RESET_ALL;
CFolderOptions *pFO = (CFolderOptions*)GetWindowLongPtr(hwndDlg, GWL_USERDATA);
if (pFO)
hr = pFO->ApplyDefFolderSettings(LOWORD(wParam) == IDC_VIEW_RESET_ALL);
hr = pFO->ApplyDefFolderSettings(ResetToDefault); // Use IBrowserService2
if (ResetToDefault && hr == HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED))
hr = CFolderOptions::ResetGlobalAndDefViewFolderSettings(); // No browser
if (FAILED(hr))
SHELL_ErrorBox(hwndDlg, hr);
break;