Skip to content

Commit 090d563

Browse files
authored
[SHELL32] CFolderOptions Reset can call DefView directly if there is no browser (reactos#7806)
CORE-20029
1 parent cfde03e commit 090d563

File tree

4 files changed

+52
-14
lines changed

4 files changed

+52
-14
lines changed

dll/win32/shell32/CDefView.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4240,13 +4240,13 @@ HRESULT WINAPI CDefView::Exec(const GUID *pguidCmdGroup, DWORD nCmdID, DWORD nCm
42404240
SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\ShellNoRoam\\Bags");
42414241
if (SUCCEEDED(GetDefaultViewStream(STGM_WRITE, &pStream)))
42424242
SaveViewState(pStream);
4243-
break;
4243+
return S_OK;
42444244
case DVCMDID_RESET_DEFAULTFOLDER_SETTINGS:
4245-
wsprintfW(SubKey, L"%s\\%s", REGSTR_PATH_EXPLORER, L"Streams\\Default");
4245+
PathCombineW(SubKey, REGSTR_PATH_EXPLORER, L"Streams\\Default");
42464246
SHDeleteKey(HKEY_CURRENT_USER, SubKey);
42474247
SHDeleteKey(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\ShellNoRoam\\Bags");
42484248
m_FolderSettings.fFlags |= FWF_NOBROWSERVIEWSTATE; // Don't let this folder save itself
4249-
break;
4249+
return S_OK;
42504250
}
42514251
}
42524252

dll/win32/shell32/CFolderOptions.cpp

Lines changed: 43 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,45 @@ HRESULT STDMETHODCALLTYPE CFolderOptions::GetSite(REFIID riid, void **ppvSite)
113113
/*************************************************************************
114114
* FolderOptions helper methods
115115
*/
116+
static HRESULT ResetGlobalFolderSettings()
117+
{
118+
IGlobalFolderSettings *pgfs;
119+
HRESULT hr = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER,
120+
IID_PPV_ARG(IGlobalFolderSettings, &pgfs));
121+
if (SUCCEEDED(hr))
122+
{
123+
hr = pgfs->Set(NULL, 0, 0);
124+
pgfs->Release();
125+
}
126+
return hr;
127+
}
128+
129+
static inline HRESULT ExecResetDefViewFolderSettings(IUnknown *pUnk)
130+
{
131+
return IUnknown_Exec(pUnk, CGID_DefView, DVCMDID_RESET_DEFAULTFOLDER_SETTINGS,
132+
OLECMDEXECOPT_DODEFAULT, NULL, NULL);
133+
}
134+
135+
static HRESULT ResetDefViewFolderSettings()
136+
{
137+
CComPtr<IShellFolder> pSF;
138+
HRESULT hr = SHGetDesktopFolder(&pSF);
139+
if (SUCCEEDED(hr))
140+
{
141+
CComPtr<IShellView> pSV;
142+
SFV_CREATE create = { sizeof(SFV_CREATE), pSF };
143+
if (SUCCEEDED(hr = SHCreateShellFolderView(&create, &pSV)))
144+
hr = ExecResetDefViewFolderSettings(pSV);
145+
}
146+
return hr;
147+
}
148+
149+
HRESULT CFolderOptions::ResetGlobalAndDefViewFolderSettings()
150+
{
151+
ResetDefViewFolderSettings();
152+
return ResetGlobalFolderSettings();
153+
}
154+
116155
HRESULT CFolderOptions::HandleDefFolderSettings(int Action)
117156
{
118157
IBrowserService2 *bs2;
@@ -126,25 +165,19 @@ HRESULT CFolderOptions::HandleDefFolderSettings(int Action)
126165
else if (Action == DFSA_RESET)
127166
{
128167
// There does not seem to be a method in IBrowserService2 for this
129-
IUnknown_Exec(bs2, CGID_DefView, DVCMDID_RESET_DEFAULTFOLDER_SETTINGS, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
168+
ExecResetDefViewFolderSettings(bs2);
130169
}
131170
else
132171
{
133-
// FFSA_QUERY: hr is already correct
172+
// DFSA_QUERY: hr is already correct
134173
}
135174
bs2->Release();
136175
}
137176

138177
if (Action == DFSA_RESET)
139178
{
140-
IGlobalFolderSettings *pgfs;
141-
HRESULT hr = CoCreateInstance(CLSID_GlobalFolderSettings, NULL, CLSCTX_INPROC_SERVER,
142-
IID_IGlobalFolderSettings, (void **)&pgfs);
143-
if (SUCCEEDED(hr))
144-
{
145-
hr = pgfs->Set(NULL, 0, 0);
146-
pgfs->Release();
147-
}
179+
// In case the browser is hosting a 3rd-party view, we force a DefView reset
180+
hr = ResetGlobalAndDefViewFolderSettings();
148181
}
149182

150183
return hr;

dll/win32/shell32/CFolderOptions.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ class CFolderOptions :
6666
return HandleDefFolderSettings(ResetToDefault ? DFSA_RESET : DFSA_APPLY);
6767
}
6868

69+
static HRESULT ResetGlobalAndDefViewFolderSettings();
70+
6971
DECLARE_REGISTRY_RESOURCEID(IDR_FOLDEROPTIONS)
7072
DECLARE_NOT_AGGREGATABLE(CFolderOptions)
7173

dll/win32/shell32/dialogs/view.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -975,9 +975,12 @@ FolderOptionsViewDlg(
975975
case IDC_VIEW_RESET_ALL:
976976
{
977977
HRESULT hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED);
978+
bool ResetToDefault = LOWORD(wParam) == IDC_VIEW_RESET_ALL;
978979
CFolderOptions *pFO = (CFolderOptions*)GetWindowLongPtr(hwndDlg, GWL_USERDATA);
979980
if (pFO)
980-
hr = pFO->ApplyDefFolderSettings(LOWORD(wParam) == IDC_VIEW_RESET_ALL);
981+
hr = pFO->ApplyDefFolderSettings(ResetToDefault); // Use IBrowserService2
982+
if (ResetToDefault && hr == HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED))
983+
hr = CFolderOptions::ResetGlobalAndDefViewFolderSettings(); // No browser
981984
if (FAILED(hr))
982985
SHELL_ErrorBox(hwndDlg, hr);
983986
break;

0 commit comments

Comments
 (0)