[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"); SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\ShellNoRoam\\Bags");
if (SUCCEEDED(GetDefaultViewStream(STGM_WRITE, &pStream))) if (SUCCEEDED(GetDefaultViewStream(STGM_WRITE, &pStream)))
SaveViewState(pStream); SaveViewState(pStream);
break; return S_OK;
case DVCMDID_RESET_DEFAULTFOLDER_SETTINGS: 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, SubKey);
SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\ShellNoRoam\\Bags"); SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\ShellNoRoam\\Bags");
m_FolderSettings.fFlags |= FWF_NOBROWSERVIEWSTATE; // Don't let this folder save itself 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 * 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) HRESULT CFolderOptions::HandleDefFolderSettings(int Action)
{ {
IBrowserService2 *bs2; IBrowserService2 *bs2;
@ -126,25 +165,19 @@ HRESULT CFolderOptions::HandleDefFolderSettings(int Action)
else if (Action == DFSA_RESET) else if (Action == DFSA_RESET)
{ {
// There does not seem to be a method in IBrowserService2 for this // 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 else
{ {
// FFSA_QUERY: hr is already correct // DFSA_QUERY: hr is already correct
} }
bs2->Release(); bs2->Release();
} }
if (Action == DFSA_RESET) if (Action == DFSA_RESET)
{ {
IGlobalFolderSettings *pgfs; // In case the browser is hosting a 3rd-party view, we force a DefView reset
HRESULT hr = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER, hr = ResetGlobalAndDefViewFolderSettings();
IID_IGlobalFolderSettings, (void **)&pgfs);
if (SUCCEEDED(hr))
{
hr = pgfs->Set(NULL, 0, 0);
pgfs->Release();
}
} }
return hr; return hr;

View file

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

View file

@ -975,9 +975,12 @@ FolderOptionsViewDlg(
case IDC_VIEW_RESET_ALL: case IDC_VIEW_RESET_ALL:
{ {
HRESULT hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); HRESULT hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
bool ResetToDefault = LOWORD(wParam) == IDC_VIEW_RESET_ALL;
CFolderOptions *pFO = (CFolderOptions*)GetWindowLongPtr(hwndDlg, GWL_USERDATA); CFolderOptions *pFO = (CFolderOptions*)GetWindowLongPtr(hwndDlg, GWL_USERDATA);
if (pFO) 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)) if (FAILED(hr))
SHELL_ErrorBox(hwndDlg, hr); SHELL_ErrorBox(hwndDlg, hr);
break; break;