@@ -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+
221225class 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
843852BOOL 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
38213830HRESULT 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 */
0 commit comments