Skip to content

Commit 87df3ea

Browse files
authored
[SHLWAPI][EXPLORER] Implement OS_SERVERADMINUI (reactos#7051)
OS_SERVERADMINUI changes minor things in Explorer, the most visible is that the default folder view mode changes from large icons to details
1 parent db57e02 commit 87df3ea

File tree

14 files changed

+198
-71
lines changed

14 files changed

+198
-71
lines changed

base/shell/explorer/explorer.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,31 @@ static VOID InitializeAtlModule(HINSTANCE hInstance, BOOL bInitialize)
4949
}
5050
}
5151

52+
static void
53+
InitializeServerAdminUI()
54+
{
55+
HKEY hKey = SHGetShellKey(SHKEY_Root_HKCU | SHKEY_Key_Explorer, L"Advanced", TRUE);
56+
if (!hKey)
57+
return;
58+
59+
DWORD value, size = sizeof(value), type;
60+
DWORD error = SHGetValueW(hKey, NULL, L"ServerAdminUI", &type, &value, &size);
61+
if (error || type != REG_DWORD || size != sizeof(value))
62+
{
63+
// The value doesn't exist or is invalid, calculate and apply a default value
64+
value = IsOS(OS_ANYSERVER) && IsUserAnAdmin();
65+
SHSetValueW(hKey, NULL, L"ServerAdminUI", REG_DWORD, &value, sizeof(value));
66+
if (value)
67+
{
68+
// TODO: Apply registry tweaks with RegInstallW; RegServerAdmin in the REGINST resource in shell32.
69+
#if !ROSPOLICY_SHELL_NODEFKEYBOARDCUES
70+
SystemParametersInfo(SPI_SETKEYBOARDCUES, 0, IntToPtr(TRUE), SPIF_SENDCHANGE | SPIF_UPDATEINIFILE);
71+
#endif
72+
}
73+
}
74+
RegCloseKey(hKey);
75+
}
76+
5277
#if !WIN7_DEBUG_MODE
5378
static BOOL
5479
SetShellReadyEvent(IN LPCWSTR lpEventName)
@@ -179,6 +204,8 @@ StartWithDesktop(IN HINSTANCE hInstance)
179204
/* Initialize CLSID_ShellWindows class */
180205
_WinList_Init();
181206

207+
InitializeServerAdminUI();
208+
182209
CComPtr<ITrayWindow> Tray;
183210
CreateTrayWindow(&Tray);
184211

dll/cpl/sysdm/advanced.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
*/
1010

1111
#include "precomp.h"
12-
#define WIN32_NO_STATUS
13-
#include "pstypes.h" /* SharedUserData */
12+
#define NTOS_MODE_USER
13+
#include <ndk/pstypes.h> /* For SharedUserData */
1414

1515
static TCHAR BugLink[] = _T("http://jira.reactos.org/");
1616
static TCHAR ReportAsWorkstationKey[] = _T("SYSTEM\\CurrentControlSet\\Control\\ReactOS\\Settings\\Version");
@@ -56,7 +56,7 @@ OnInitSysSettingsDialog(HWND hwndDlg)
5656
DWORD dwVal = 0;
5757
DWORD dwType = REG_DWORD;
5858
DWORD cbData = sizeof(DWORD);
59-
BOOL ReportAsWorkstation = SharedUserData->NtProductType == VER_NT_WORKSTATION;
59+
BOOL ReportAsWorkstation = SharedUserData->NtProductType == NtProductWinNt;
6060

6161
if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,
6262
ReportAsWorkstationKey,
@@ -71,7 +71,7 @@ OnInitSysSettingsDialog(HWND hwndDlg)
7171
(LPBYTE)&dwVal,
7272
&cbData) == ERROR_SUCCESS)
7373
{
74-
if (cbData == sizeof(DWORD))
74+
if (dwType == REG_DWORD && cbData == sizeof(DWORD))
7575
ReportAsWorkstation = dwVal != FALSE;
7676
}
7777

dll/ntdll/rtl/version.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ SetRosSpecificInfo(IN OUT PRTL_OSVERSIONINFOEXW VersionInformation)
5353
(kvpInfo->Type == REG_DWORD) &&
5454
(kvpInfo->DataLength == sizeof(ULONG)))
5555
{
56-
ULONG IsWorkstation = SharedUserData->NtProductType == NtProductWinNt;
57-
ULONG ReportAsWorkstation = (*(PULONG)kvpInfo->Data) != 0;
56+
BOOLEAN IsWorkstation = SharedUserData->NtProductType == NtProductWinNt;
57+
BOOLEAN ReportAsWorkstation = (*(PULONG)kvpInfo->Data) != 0;
5858
if (IsWorkstation != ReportAsWorkstation)
5959
{
60-
g_ReportProductType = ReportAsWorkstation ? NtProductWinNt : NtProductServer;
60+
g_ReportProductType = ReportAsWorkstation ? VER_NT_WORKSTATION : VER_NT_SERVER;
6161
}
6262
}
6363

@@ -73,7 +73,7 @@ SetRosSpecificInfo(IN OUT PRTL_OSVERSIONINFOEXW VersionInformation)
7373
}
7474
else
7575
{
76-
g_ReportProductType = -1;
76+
g_ReportProductType = -1; /* No override, caller gets the real value */
7777
}
7878
}
7979

dll/win32/browseui/shellbrowser.cpp

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -907,27 +907,18 @@ HRESULT CShellBrowser::CreateRelativeBrowsePIDL(LPCITEMIDLIST relative, UINT Sbs
907907

908908
HRESULT CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl, long flags)
909909
{
910+
// Called by shell view to browse to new folder
911+
// also called by explorer band to navigate to new folder
910912
CComPtr<IShellFolder> newFolder;
911913
FOLDERSETTINGS newFolderSettings = m_deffoldersettings.FolderSettings;
912-
HRESULT hResult;
913-
CLSID clsid;
914-
BOOL HasIconViewType;
915914

916-
// called by shell view to browse to new folder
917-
// also called by explorer band to navigate to new folder
918-
hResult = SHBindToFolder(pidl, &newFolder);
919-
if (FAILED_UNEXPECTEDLY(hResult))
920-
return hResult;
921-
// HACK & FIXME: Get view mode from shellbag when fully implemented.
922-
IUnknown_GetClassID(newFolder, &clsid);
923-
HasIconViewType = clsid == CLSID_MyComputer || clsid == CLSID_ControlPanel ||
924-
clsid == CLSID_ShellDesktop;
925-
926-
if (HasIconViewType)
927-
newFolderSettings.ViewMode = FVM_ICON;
928-
hResult = BrowseToPath(newFolder, pidl, &newFolderSettings, flags);
929-
if (FAILED_UNEXPECTEDLY(hResult))
930-
return hResult;
915+
HRESULT hr = SHBindToFolder(pidl, &newFolder);
916+
if (FAILED_UNEXPECTEDLY(hr))
917+
return hr;
918+
919+
hr = BrowseToPath(newFolder, pidl, &newFolderSettings, flags);
920+
if (FAILED_UNEXPECTEDLY(hr))
921+
return hr;
931922
return S_OK;
932923
}
933924

@@ -1116,8 +1107,22 @@ HRESULT CShellBrowser::BrowseToPath(IShellFolder *newShellFolder,
11161107
absolutePIDL = fCurrentDirectoryPIDL;
11171108

11181109
// create view window
1119-
hResult = newShellView->CreateViewWindow(saveCurrentShellView, folderSettings,
1120-
this, &shellViewWindowBounds, &newShellViewWindow);
1110+
SHELLVIEWID vid;
1111+
SV2CVW2_PARAMS cvw2 = { sizeof(cvw2), saveCurrentShellView, folderSettings, this, &shellViewWindowBounds, NULL };
1112+
1113+
CComPtr<IShellView2> newShellView2;
1114+
if (SUCCEEDED(newShellView->QueryInterface(IID_PPV_ARG(IShellView2, &newShellView2))))
1115+
{
1116+
if (SUCCEEDED(newShellView2->GetView(&vid, SV2GV_DEFAULTVIEW)))
1117+
cvw2.pvid = &vid;
1118+
hResult = newShellView2->CreateViewWindow2(&cvw2);
1119+
}
1120+
else
1121+
{
1122+
hResult = newShellView->CreateViewWindow(cvw2.psvPrev, cvw2.pfs, this, cvw2.prcView, &cvw2.hwndView);
1123+
}
1124+
newShellViewWindow = cvw2.hwndView;
1125+
11211126
if (FAILED_UNEXPECTEDLY(hResult) || newShellViewWindow == NULL)
11221127
{
11231128
fCurrentShellView = saveCurrentShellView;

dll/win32/shell32/CDefView.cpp

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@ static inline COLORREF GetViewColor(COLORREF Clr, UINT SysFallback)
218218
return Clr != CLR_INVALID ? Clr : GetSysColor(SysFallback);
219219
}
220220

221+
#define VID_Default ( *(const SHELLVIEWID*)&IID_CDefView )
222+
extern HRESULT ShellViewIdToFolderViewMode(const SHELLVIEWID *pVid);
223+
extern const SHELLVIEWID* FolderViewModeToShellViewId(UINT FVM);
224+
221225
class CDefView :
222226
public CWindowImpl<CDefView, CWindow, CControlWinTraits>,
223227
public CComObjectRootEx<CComMultiThreadModelNoCS>,
@@ -373,6 +377,11 @@ class CDefView :
373377
return 0;
374378
}
375379

380+
static inline bool IsSupportedFolderViewMode(int Mode)
381+
{
382+
return Mode >= FVM_FIRST && Mode <= FVM_DETAILS; // We don't support Tile nor Thumbstrip
383+
}
384+
376385
// *** IOleWindow methods ***
377386
STDMETHOD(GetWindow)(HWND *lphwnd) override;
378387
STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode) override;
@@ -391,7 +400,7 @@ class CDefView :
391400
STDMETHOD(GetItemObject)(UINT uItem, REFIID riid, void **ppv) override;
392401

393402
// *** IShellView2 methods ***
394-
STDMETHOD(GetView)(SHELLVIEWID *view_guid, ULONG view_type) override;
403+
STDMETHOD(GetView)(SHELLVIEWID *pVid, ULONG view_type) override;
395404
STDMETHOD(CreateViewWindow2)(LPSV2CVW2_PARAMS view_params) override;
396405
STDMETHOD(HandleRename)(LPCITEMIDLIST pidl) override;
397406
STDMETHOD(SelectAndPositionItem)(LPCITEMIDLIST item, UINT flags, POINT *point) override;
@@ -842,10 +851,7 @@ LRESULT CDefView::OnUpdateStatusbar(UINT uMsg, WPARAM wParam, LPARAM lParam, BOO
842851
// creates the list view window
843852
BOOL CDefView::CreateList()
844853
{
845-
HRESULT hr;
846854
DWORD dwStyle, dwExStyle, ListExStyle;
847-
UINT ViewMode;
848-
849855
TRACE("%p\n", this);
850856

851857
dwStyle = WS_TABSTOP | WS_VISIBLE | WS_CHILDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
@@ -868,16 +874,6 @@ BOOL CDefView::CreateList()
868874
#endif
869875
}
870876

871-
ViewMode = m_FolderSettings.ViewMode;
872-
hr = _DoFolderViewCB(SFVM_DEFVIEWMODE, 0, (LPARAM)&ViewMode);
873-
if (SUCCEEDED(hr))
874-
{
875-
if (ViewMode >= FVM_FIRST && ViewMode <= FVM_LAST)
876-
m_FolderSettings.ViewMode = ViewMode;
877-
else
878-
ERR("Ignoring invalid ViewMode from SFVM_DEFVIEWMODE: %u (was: %u)\n", ViewMode, m_FolderSettings.ViewMode);
879-
}
880-
881877
switch (m_FolderSettings.ViewMode)
882878
{
883879
case FVM_ICON:
@@ -3605,7 +3601,7 @@ FOLDERVIEWMODE CDefView::GetDefaultViewMode()
36053601
{
36063602
FOLDERVIEWMODE mode = ((m_FolderSettings.fFlags & FWF_DESKTOP) || !IsOS(OS_SERVERADMINUI)) ? FVM_ICON : FVM_DETAILS;
36073603
FOLDERVIEWMODE temp = mode;
3608-
if (SUCCEEDED(_DoFolderViewCB(SFVM_DEFVIEWMODE, 0, (LPARAM)&temp)) && temp >= FVM_FIRST && temp <= FVM_LAST)
3604+
if (SUCCEEDED(_DoFolderViewCB(SFVM_DEFVIEWMODE, 0, (LPARAM)&temp)) && IsSupportedFolderViewMode(temp))
36093605
mode = temp;
36103606
return mode;
36113607
}
@@ -3812,10 +3808,23 @@ HRESULT STDMETHODCALLTYPE CDefView::SelectAndPositionItems(UINT cidl, PCUITEMID_
38123808

38133809
// IShellView2 implementation
38143810

3815-
HRESULT STDMETHODCALLTYPE CDefView::GetView(SHELLVIEWID *view_guid, ULONG view_type)
3811+
HRESULT STDMETHODCALLTYPE CDefView::GetView(SHELLVIEWID *pVid, ULONG view_type)
38163812
{
3817-
FIXME("(%p)->(%p, %lu) stub\n", this, view_guid, view_type);
3818-
return E_NOTIMPL;
3813+
if (view_type == SV2GV_DEFAULTVIEW)
3814+
{
3815+
*pVid = VID_Default;
3816+
return S_OK;
3817+
}
3818+
if (view_type == SV2GV_CURRENTVIEW)
3819+
view_type = m_FolderSettings.ViewMode;
3820+
if ((int)view_type < 0)
3821+
return E_UNEXPECTED;
3822+
3823+
view_type += FVM_FIRST;
3824+
if (!IsSupportedFolderViewMode(view_type))
3825+
return E_INVALIDARG;
3826+
*pVid = *FolderViewModeToShellViewId(view_type);
3827+
return S_OK;
38193828
}
38203829

38213830
HRESULT STDMETHODCALLTYPE CDefView::CreateViewWindow2(LPSV2CVW2_PARAMS view_params)
@@ -3844,33 +3853,30 @@ HRESULT STDMETHODCALLTYPE CDefView::CreateViewWindow3(IShellBrowser *psb, IShell
38443853
if (view_flags & ~SUPPORTED_SV3CVW3)
38453854
FIXME("unsupported view flags 0x%08x\n", view_flags & ~SUPPORTED_SV3CVW3);
38463855

3847-
if (mode == FVM_AUTO)
3848-
mode = GetDefaultViewMode();
3849-
38503856
/* Set up the member variables */
38513857
m_pShellBrowser = psb;
38523858
m_FolderSettings.ViewMode = mode;
38533859
m_FolderSettings.fFlags = (mask & flags) & ~IGNORE_FWF;
38543860

38553861
if (view_id)
38563862
{
3857-
if (IsEqualIID(*view_id, VID_LargeIcons))
3858-
m_FolderSettings.ViewMode = FVM_ICON;
3859-
else if (IsEqualIID(*view_id, VID_SmallIcons))
3860-
m_FolderSettings.ViewMode = FVM_SMALLICON;
3861-
else if (IsEqualIID(*view_id, VID_List))
3862-
m_FolderSettings.ViewMode = FVM_LIST;
3863-
else if (IsEqualIID(*view_id, VID_Details))
3864-
m_FolderSettings.ViewMode = FVM_DETAILS;
3865-
else if (IsEqualIID(*view_id, VID_Thumbnails))
3866-
m_FolderSettings.ViewMode = FVM_THUMBNAIL;
3867-
else if (IsEqualIID(*view_id, VID_Tile))
3868-
m_FolderSettings.ViewMode = FVM_TILE;
3869-
else if (IsEqualIID(*view_id, VID_ThumbStrip))
3870-
m_FolderSettings.ViewMode = FVM_THUMBSTRIP;
3863+
FOLDERVIEWMODE temp = (FOLDERVIEWMODE)ShellViewIdToFolderViewMode(view_id);
3864+
if (IsSupportedFolderViewMode(temp))
3865+
mode = temp;
3866+
else if (*view_id == VID_Default)
3867+
mode = FVM_AUTO;
38713868
else
38723869
FIXME("Ignoring unrecognized VID %s\n", debugstr_guid(view_id));
38733870
}
3871+
if (mode == FVM_AUTO)
3872+
m_FolderSettings.ViewMode = GetDefaultViewMode();
3873+
3874+
if (!IsSupportedFolderViewMode(m_FolderSettings.ViewMode))
3875+
{
3876+
ERR("Ignoring %s FVM %u\n", FolderViewModeToShellViewId(m_FolderSettings.ViewMode)
3877+
? "unsupported" : "invalid", m_FolderSettings.ViewMode);
3878+
m_FolderSettings.ViewMode = FVM_ICON;
3879+
}
38743880
const UINT requestedViewMode = m_FolderSettings.ViewMode;
38753881

38763882
/* Get our parent window */

dll/win32/shell32/CDefViewUtil.cpp

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,38 @@
99

1010
WINE_DEFAULT_DEBUG_CHANNEL(shell);
1111

12+
HRESULT
13+
ShellViewIdToFolderViewMode(const SHELLVIEWID *pVid)
14+
{
15+
if (IsEqualIID(*pVid, VID_LargeIcons))
16+
return FVM_ICON;
17+
else if (IsEqualIID(*pVid, VID_SmallIcons))
18+
return FVM_SMALLICON;
19+
else if (IsEqualIID(*pVid, VID_List))
20+
return FVM_LIST;
21+
else if (IsEqualIID(*pVid, VID_Details))
22+
return FVM_DETAILS;
23+
else if (IsEqualIID(*pVid, VID_Thumbnails))
24+
return FVM_THUMBNAIL;
25+
else if (IsEqualIID(*pVid, VID_Tile))
26+
return FVM_TILE;
27+
else if (IsEqualIID(*pVid, VID_ThumbStrip))
28+
return FVM_THUMBSTRIP;
29+
return E_UNEXPECTED;
30+
}
31+
32+
const SHELLVIEWID *
33+
FolderViewModeToShellViewId(UINT FVM)
34+
{
35+
static const SHELLVIEWID *vids[] = {
36+
&VID_LargeIcons, &VID_SmallIcons,
37+
&VID_Details, &VID_Thumbnails,
38+
&VID_Tile, &VID_ThumbStrip,
39+
};
40+
FVM -= FVM_FIRST;
41+
return FVM < _countof(vids) ? vids[FVM] : NULL;
42+
}
43+
1244
// This class adapts the legacy function callback to work as an IShellFolderViewCB
1345
class CShellFolderViewCBWrapper :
1446
public CComObjectRootEx<CComMultiThreadModelNoCS>,

dll/win32/shell32/folders/CControlPanelFolder.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,7 @@ HRESULT WINAPI CControlPanelFolder::CreateViewObject(HWND hwndOwner, REFIID riid
386386
WARN("IContextMenu not implemented\n");
387387
hr = E_NOTIMPL;
388388
} else if (IsEqualIID(riid, IID_IShellView)) {
389-
SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
389+
SFV_CREATE sfvparams = { sizeof(SFV_CREATE), this , NULL, this };
390390
hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
391391
}
392392
}
@@ -673,6 +673,23 @@ HRESULT WINAPI CControlPanelFolder::GetCurFolder(PIDLIST_ABSOLUTE * pidl)
673673
return S_OK;
674674
}
675675

676+
HRESULT WINAPI CControlPanelFolder::MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
677+
{
678+
switch (uMsg)
679+
{
680+
case SFVM_DEFVIEWMODE:
681+
{
682+
#if ROSPOLICY_CONTROLSFOLDER_DEFLARGEICONS
683+
*((FOLDERVIEWMODE*)lParam) = FVM_ICON;
684+
#else
685+
*((FOLDERVIEWMODE*)lParam) = IsOS(OS_SERVERADMINUI) ? FVM_LIST : FVM_ICON;
686+
#endif
687+
return S_OK;
688+
}
689+
}
690+
return E_NOTIMPL;
691+
}
692+
676693
CCPLItemMenu::CCPLItemMenu()
677694
{
678695
m_apidl = NULL;

dll/win32/shell32/folders/CControlPanelFolder.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ class CControlPanelFolder :
2626
public CComCoClass<CControlPanelFolder, &CLSID_ControlPanel>,
2727
public CComObjectRootEx<CComMultiThreadModelNoCS>,
2828
public IShellFolder2,
29-
public IPersistFolder2
29+
public IPersistFolder2,
30+
public IShellFolderViewCB
3031
{
3132
private:
3233
/* both paths are parsible from the desktop */
@@ -70,6 +71,9 @@ class CControlPanelFolder :
7071
// IPersistFolder2
7172
STDMETHOD(GetCurFolder)(PIDLIST_ABSOLUTE * pidl) override;
7273

74+
// IShellFolderViewCB
75+
STDMETHODIMP MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam) override;
76+
7377
DECLARE_REGISTRY_RESOURCEID(IDR_CONTROLPANEL)
7478
DECLARE_NOT_AGGREGATABLE(CControlPanelFolder)
7579

@@ -81,6 +85,7 @@ class CControlPanelFolder :
8185
COM_INTERFACE_ENTRY_IID(IID_IPersistFolder, IPersistFolder)
8286
COM_INTERFACE_ENTRY_IID(IID_IPersistFolder2, IPersistFolder2)
8387
COM_INTERFACE_ENTRY_IID(IID_IPersist, IPersist)
88+
COM_INTERFACE_ENTRY_IID(IID_IShellFolderViewCB, IShellFolderViewCB)
8489
END_COM_MAP()
8590
};
8691

0 commit comments

Comments
 (0)