mirror of
https://github.com/reactos/reactos.git
synced 2025-04-20 20:36:35 +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");
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue