mirror of
https://github.com/reactos/reactos.git
synced 2025-04-22 13:10:39 +00:00
[SHELL32] CFolderOptions Reset can call DefView directly if there is no browser (#7806)
CORE-20029
This commit is contained in:
parent
cfde03ec9b
commit
090d563488
4 changed files with 52 additions and 14 deletions
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue