https://git.reactos.org/?p=reactos.git;a=commitdiff;h=43b3dc20341682ffe1f5b29e28b023f5843952b3

commit 43b3dc20341682ffe1f5b29e28b023f5843952b3
Author:     Carl J. Bialorucki <cbia...@outlook.com>
AuthorDate: Thu Aug 17 03:14:41 2023 -0600
Commit:     GitHub <nore...@github.com>
CommitDate: Thu Aug 17 12:14:41 2023 +0300

    [BROWSEUI] Refactor settings and sync them between windows (#5496)
    
    This works similarly to how our shell stores its settings from a software 
design standpoint.
    
    - Add settings.cpp file and ShellSettings structure to load and save 
settings.
    - Add a registry value to hivedef.inf for the locked toolbar state.
      This prevents a bug where the associated registry key cannot be opened or 
saved to.
    - Add new BWM_SETTINGCHANGE window message to refresh the UI on setting 
changes
      and send it to every open window when saving settings to the registry.
    - Add new BWM_GETSETTINGSPTR window message to share the shellbrowser 
settings
      structure pointer with child windows and toolbars.
---
 boot/bootdata/hivedef.inf              |  1 +
 dll/win32/browseui/CMakeLists.txt      |  1 +
 dll/win32/browseui/internettoolbar.cpp | 92 +++++++++++++++++-----------------
 dll/win32/browseui/internettoolbar.h   |  4 ++
 dll/win32/browseui/precomp.h           | 14 ++++++
 dll/win32/browseui/settings.cpp        | 36 +++++++++++++
 dll/win32/browseui/shellbrowser.cpp    | 66 ++++++++++++++----------
 7 files changed, 141 insertions(+), 73 deletions(-)

diff --git a/boot/bootdata/hivedef.inf b/boot/bootdata/hivedef.inf
index 6394246fad9..6551f5a7701 100644
--- a/boot/bootdata/hivedef.inf
+++ b/boot/bootdata/hivedef.inf
@@ -1902,6 +1902,7 @@ 
HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced","ShowSuperHid
 
HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CabinetState",,0x00000012
 
HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\CabinetState","FullPath",0x00010003,0
 HKCU,"SOFTWARE\Microsoft\Internet Explorer\Main","StatusBarOther",0x00010003,1
+HKCU,"SOFTWARE\Microsoft\Internet Explorer\Toolbar","Locked",0x00010003,1
 
 ; ComDlg32
 HKCU,"SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32",,0x00000012
diff --git a/dll/win32/browseui/CMakeLists.txt 
b/dll/win32/browseui/CMakeLists.txt
index 8b9eb4ebd3d..83a78e085dc 100644
--- a/dll/win32/browseui/CMakeLists.txt
+++ b/dll/win32/browseui/CMakeLists.txt
@@ -30,6 +30,7 @@ list(APPEND SOURCE
     internettoolbar.cpp
     parsecmdline.cpp
     regtreeoptions.cpp
+    settings.cpp
     shellbrowser.cpp
     toolsband.cpp
     travellog.cpp
diff --git a/dll/win32/browseui/internettoolbar.cpp 
b/dll/win32/browseui/internettoolbar.cpp
index 8d51ad6bcfe..b9d3b6273b7 100644
--- a/dll/win32/browseui/internettoolbar.cpp
+++ b/dll/win32/browseui/internettoolbar.cpp
@@ -250,11 +250,11 @@ HRESULT CDockSite::GetRBBandInfo(REBARBANDINFOW &bandInfo)
         bandInfo.fStyle |= RBBS_BREAK;
     if (fDeskBandInfo.dwModeFlags & DBIMF_TOPALIGN)
         bandInfo.fStyle |= RBBS_TOPALIGN;
-    if (fFlags & ITF_NOGRIPPER || fToolbar->fLocked)
+    if (fFlags & ITF_NOGRIPPER || fToolbar->pSettings->fLocked)
         bandInfo.fStyle |= RBBS_NOGRIPPER;
     if (fFlags & ITF_NOTITLE)
         bandInfo.fStyle |= RBBS_HIDETITLE;
-    if (fFlags & ITF_GRIPPERALWAYS && !fToolbar->fLocked)
+    if (fFlags & ITF_GRIPPERALWAYS && !fToolbar->pSettings->fLocked)
         bandInfo.fStyle |= RBBS_GRIPPERALWAYS;
     if (fFlags & ITF_FIXEDSIZE)
         bandInfo.fStyle |= RBBS_FIXEDSIZE;
@@ -607,17 +607,13 @@ HRESULT STDMETHODCALLTYPE 
CMenuCallback::CallbackSM(LPSMDATA psmd, UINT uMsg, WP
 
 CInternetToolbar::CInternetToolbar()
 {
-    fLocked = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet 
Explorer\\Toolbar",
-                                   L"Locked",
-                                   FALSE,
-                                   TRUE);
-
     fMainReBar = NULL;
     fMenuBandWindow = NULL;
     fNavigationWindow = NULL;
     fMenuCallback = new CComObject<CMenuCallback>();
     fToolbarWindow = NULL;
     fAdviseCookie = 0;
+    pSettings = NULL;
 }
 
 CInternetToolbar::~CInternetToolbar()
@@ -714,45 +710,40 @@ HRESULT CInternetToolbar::CreateMenuBar(IShellMenu 
**pMenuBar)
 }
 
 HRESULT CInternetToolbar::LockUnlockToolbars(bool locked)
+{
+    if (locked != pSettings->fLocked)
+    {
+        pSettings->fLocked = locked;
+        pSettings->Save();
+        RefreshLockedToolbarState();
+    }
+    return S_OK;
+}
+
+void CInternetToolbar::RefreshLockedToolbarState()
 {
     REBARBANDINFOW                          rebarBandInfo;
     int                                     bandCount;
     CDockSite                               *dockSite;
-    HRESULT                                 hResult;
 
-    if (locked != fLocked)
+    rebarBandInfo.cbSize = sizeof(rebarBandInfo);
+    rebarBandInfo.fMask = RBBIM_STYLE | RBBIM_LPARAM;
+    bandCount = (int)SendMessage(fMainReBar, RB_GETBANDCOUNT, 0, 0);
+    for (INT x  = 0; x < bandCount; x++)
     {
-        DWORD dwLocked = locked ? 1 : 0;
-        SHRegSetUSValueW(L"Software\\Microsoft\\Internet Explorer\\Toolbar",
-                         L"Locked",
-                         REG_DWORD,
-                         &dwLocked,
-                         sizeof(dwLocked),
-                         SHREGSET_FORCE_HKCU);
-        fLocked = locked;
-
-        rebarBandInfo.cbSize = sizeof(rebarBandInfo);
-        rebarBandInfo.fMask = RBBIM_STYLE | RBBIM_LPARAM;
-        bandCount = (int)SendMessage(fMainReBar, RB_GETBANDCOUNT, 0, 0);
-        for (INT x  = 0; x < bandCount; x++)
+        SendMessage(fMainReBar, RB_GETBANDINFOW, x, (LPARAM)&rebarBandInfo);
+        dockSite = reinterpret_cast<CDockSite *>(rebarBandInfo.lParam);
+        if (dockSite != NULL)
         {
-            SendMessage(fMainReBar, RB_GETBANDINFOW, x, 
(LPARAM)&rebarBandInfo);
-            dockSite = reinterpret_cast<CDockSite *>(rebarBandInfo.lParam);
-            if (dockSite != NULL)
-            {
-                rebarBandInfo.fStyle &= ~(RBBS_NOGRIPPER | RBBS_GRIPPERALWAYS);
-                if (dockSite->fFlags & CDockSite::ITF_NOGRIPPER || fLocked)
-                    rebarBandInfo.fStyle |= RBBS_NOGRIPPER;
-                if (dockSite->fFlags & CDockSite::ITF_GRIPPERALWAYS && 
!fLocked)
-                    rebarBandInfo.fStyle |= RBBS_GRIPPERALWAYS;
-                SendMessage(fMainReBar, RB_SETBANDINFOW, x, 
(LPARAM)&rebarBandInfo);
-            }
+            rebarBandInfo.fStyle &= ~(RBBS_NOGRIPPER | RBBS_GRIPPERALWAYS);
+            if (dockSite->fFlags & CDockSite::ITF_NOGRIPPER || 
pSettings->fLocked)
+                rebarBandInfo.fStyle |= RBBS_NOGRIPPER;
+            if (dockSite->fFlags & CDockSite::ITF_GRIPPERALWAYS && 
!pSettings->fLocked)
+                rebarBandInfo.fStyle |= RBBS_GRIPPERALWAYS;
+            SendMessage(fMainReBar, RB_SETBANDINFOW, x, 
(LPARAM)&rebarBandInfo);
         }
-        hResult = ReserveBorderSpace(0);
-
-        // TODO: refresh view menu?
     }
-    return S_OK;
+    ReserveBorderSpace(0);
 }
 
 HRESULT CInternetToolbar::SetState(const GUID *pguidCmdGroup, long commandID, 
OLECMD* pcmd)
@@ -980,7 +971,7 @@ HRESULT STDMETHODCALLTYPE 
CInternetToolbar::ResizeBorderDW(LPCRECT prcBorder,
     ::GetWindowRect(fMainReBar, &availableBorderSpace);
     neededBorderSpace.left = 0;
     neededBorderSpace.top = availableBorderSpace.bottom - 
availableBorderSpace.top;
-    if (!fLocked)
+    if (!pSettings->fLocked)
         neededBorderSpace.top += 3;
     neededBorderSpace.right = 0;
     neededBorderSpace.bottom = 0;
@@ -1145,7 +1136,7 @@ HRESULT STDMETHODCALLTYPE 
CInternetToolbar::QueryStatus(const GUID *pguidCmdGrou
                     break;
                 case ITID_TOOLBARLOCKED:    // lock toolbars
                     prgCmds->cmdf = OLECMDF_SUPPORTED | OLECMDF_ENABLED;
-                    if (fLocked)
+                    if (pSettings->fLocked)
                         prgCmds->cmdf |= OLECMDF_LATCHED;
                     break;
                 default:
@@ -1184,7 +1175,7 @@ HRESULT STDMETHODCALLTYPE CInternetToolbar::Exec(const 
GUID *pguidCmdGroup, DWOR
                 // run customize
                 return S_OK;
             case ITID_TOOLBARLOCKED:
-                return LockUnlockToolbars(!fLocked);
+                return LockUnlockToolbars(!pSettings->fLocked);
         }
     }
     return E_FAIL;
@@ -1356,6 +1347,9 @@ HRESULT STDMETHODCALLTYPE 
CInternetToolbar::SetSite(IUnknown *pUnkSite)
         if (ownerWindow == NULL)
             return E_FAIL;
 
+        // Get settings from owner window
+        ::SendMessageW(ownerWindow, BWM_GETSETTINGSPTR, 0, (LPARAM)&pSettings);
+
         // create dock container
         fSite = pUnkSite;
         dockContainer = SHCreateWorkerWindowW(0, ownerWindow, 0,
@@ -1682,7 +1676,6 @@ LRESULT CInternetToolbar::OnContextMenu(UINT uMsg, WPARAM 
wParam, LPARAM lParam,
     RBHITTESTINFO                           hitTestInfo;
     REBARBANDINFOW                          rebarBandInfo;
     int                                     bandID;
-    BOOL                                    goButtonChecked;
 
     clickLocation.x = LOWORD(lParam);
     clickLocation.y = HIWORD(lParam);
@@ -1727,9 +1720,8 @@ LRESULT CInternetToolbar::OnContextMenu(UINT uMsg, WPARAM 
wParam, LPARAM lParam,
     SHCheckMenuItem(contextMenu, IDM_TOOLBARS_ADDRESSBAR, 
IsBandVisible(ITBBID_ADDRESSBAND) == S_OK);
     SHCheckMenuItem(contextMenu, IDM_TOOLBARS_LINKSBAR, FALSE);
     SHCheckMenuItem(contextMenu, IDM_TOOLBARS_CUSTOMIZE, FALSE);
-    SHCheckMenuItem(contextMenu, IDM_TOOLBARS_LOCKTOOLBARS, fLocked);
-    goButtonChecked = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet 
Explorer\\Main", L"ShowGoButton", FALSE, TRUE);
-    SHCheckMenuItem(contextMenu, IDM_TOOLBARS_GOBUTTON, goButtonChecked);
+    SHCheckMenuItem(contextMenu, IDM_TOOLBARS_LOCKTOOLBARS, 
pSettings->fLocked);
+    SHCheckMenuItem(contextMenu, IDM_TOOLBARS_GOBUTTON, 
pSettings->fShowGoButton);
 
     // TODO: use GetSystemMetrics(SM_MENUDROPALIGNMENT) to determine menu 
alignment
     command = TrackPopupMenu(contextMenu, TPM_LEFTALIGN | TPM_TOPALIGN | 
TPM_RIGHTBUTTON | TPM_RETURNCMD,
@@ -1745,7 +1737,7 @@ LRESULT CInternetToolbar::OnContextMenu(UINT uMsg, WPARAM 
wParam, LPARAM lParam,
         case IDM_TOOLBARS_LINKSBAR: // links
             break;
         case IDM_TOOLBARS_LOCKTOOLBARS: // lock the toolbars
-            LockUnlockToolbars(!fLocked);
+            LockUnlockToolbars(!pSettings->fLocked);
             break;
         case IDM_TOOLBARS_CUSTOMIZE:    // customize
             SendMessage(fToolbarWindow, TB_CUSTOMIZE, 0, 0);
@@ -1850,7 +1842,7 @@ LRESULT CInternetToolbar::OnNotify(UINT uMsg, WPARAM 
wParam, LPARAM lParam, BOOL
 LRESULT CInternetToolbar::OnLDown(UINT uMsg, WPARAM wParam, LPARAM lParam, 
BOOL &bHandled)
 {
     bHandled = FALSE;
-    if (fLocked)
+    if (pSettings->fLocked)
         return 0;
 
     if (wParam & MK_CONTROL)
@@ -1928,3 +1920,11 @@ LRESULT CInternetToolbar::OnWinIniChange(UINT uMsg, 
WPARAM wParam, LPARAM lParam
 
     return lres;
 }
+
+LRESULT CInternetToolbar::OnSettingsChange(UINT uMsg, WPARAM wParam, LPARAM 
lParam, BOOL& bHandled)
+{
+    /* Refresh toolbar locked state */
+    RefreshLockedToolbarState();
+
+    return 0;
+}
diff --git a/dll/win32/browseui/internettoolbar.h 
b/dll/win32/browseui/internettoolbar.h
index e824df72b19..0b154ab07b0 100644
--- a/dll/win32/browseui/internettoolbar.h
+++ b/dll/win32/browseui/internettoolbar.h
@@ -92,6 +92,7 @@ public:
     BOOL                                    fSizing;
     POINT                                   fStartPosition;
     LONG                                    fStartHeight;
+    ShellSettings                           *pSettings;
 public:
     CInternetToolbar();
     virtual ~CInternetToolbar();
@@ -105,6 +106,7 @@ public:
     HRESULT IsBandVisible(int BandID);
     HRESULT ToggleBandVisibility(int BandID);
     HRESULT SetState(const GUID *pguidCmdGroup, long commandID, OLECMD* pcmd);
+    void RefreshLockedToolbarState();
 
 public:
     // *** IInputObject specific methods ***
@@ -200,6 +202,7 @@ public:
     LRESULT OnLUp(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled);
     LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL 
&bHandled);
     LRESULT OnWinIniChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL 
&bHandled);
+    LRESULT OnSettingsChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL 
&bHandled);
 
     BEGIN_MSG_MAP(CInternetToolbar)
         COMMAND_ID_HANDLER(IDM_GOTO_BACK, OnTravelBack)
@@ -221,6 +224,7 @@ public:
         MESSAGE_HANDLER(WM_LBUTTONUP, OnLUp)
         MESSAGE_HANDLER(WM_MOUSEMOVE, OnMouseMove)
         MESSAGE_HANDLER(WM_WININICHANGE, OnWinIniChange)
+        MESSAGE_HANDLER(BWM_SETTINGCHANGE, OnSettingsChange)
     END_MSG_MAP()
 
     DECLARE_REGISTRY_RESOURCEID(IDR_INTERNETTOOLBAR)
diff --git a/dll/win32/browseui/precomp.h b/dll/win32/browseui/precomp.h
index 67fe4c33208..c3c26e7115d 100644
--- a/dll/win32/browseui/precomp.h
+++ b/dll/win32/browseui/precomp.h
@@ -37,6 +37,10 @@
 
 #include "resource.h"
 
+#define BWM_SETTINGCHANGE  (WM_USER + 300)
+#define BWM_GETSETTINGSPTR (WM_USER + 301)
+struct ShellSettings;
+
 #include "ACLCustomMRU.h"
 #include "aclhistory.h"
 #include "aclistisf.h"
@@ -65,4 +69,14 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(browseui);
 
+struct ShellSettings
+{
+    BOOL fLocked = FALSE;
+    BOOL fShowGoButton = FALSE;
+    BOOL fStatusBarVisible = FALSE;
+
+    BOOL Save();
+    BOOL Load();
+};
+
 #endif /* _BROWSEUI_PCH_ */
diff --git a/dll/win32/browseui/settings.cpp b/dll/win32/browseui/settings.cpp
new file mode 100644
index 00000000000..de7e6c04480
--- /dev/null
+++ b/dll/win32/browseui/settings.cpp
@@ -0,0 +1,36 @@
+/*
+ * PROJECT:     ReactOS browseui
+ * LICENSE:     LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
+ * PURPOSE:     Stores settings for the file explorer UI.
+ * COPYRIGHT:   Copyright 2023 Carl Bialorucki <cbia...@outlook.com>
+ */
+
+#include "precomp.h"
+
+BOOL ShellSettings::Save()
+{
+    SHRegSetUSValueW(L"Software\\Microsoft\\Internet Explorer\\Main", 
L"StatusBarOther",
+                     REG_DWORD, &fStatusBarVisible, sizeof(fStatusBarVisible), 
SHREGSET_FORCE_HKCU);
+
+    SHRegSetUSValueW(L"Software\\Microsoft\\Internet Explorer\\Main", 
L"ShowGoButton",
+                     REG_DWORD, &fShowGoButton, sizeof(fShowGoButton), 
SHREGSET_FORCE_HKCU);
+
+    SHRegSetUSValueW(L"Software\\Microsoft\\Internet Explorer\\Toolbar", 
L"Locked",
+                     REG_DWORD, &fLocked, sizeof(fLocked), 
SHREGSET_FORCE_HKCU);
+
+    return TRUE;
+}
+
+BOOL ShellSettings::Load()
+{
+    fStatusBarVisible = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet 
Explorer\\Main",
+                                             L"StatusBarOther", FALSE, FALSE);
+
+    fShowGoButton = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet 
Explorer\\Main",
+                                         L"ShowGoButton", FALSE, TRUE);
+
+    fLocked = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet 
Explorer\\Toolbar",
+                                   L"Locked", FALSE, TRUE);
+
+    return TRUE;
+}
diff --git a/dll/win32/browseui/shellbrowser.cpp 
b/dll/win32/browseui/shellbrowser.cpp
index 0c808c29e25..0f1e3814ebe 100644
--- a/dll/win32/browseui/shellbrowser.cpp
+++ b/dll/win32/browseui/shellbrowser.cpp
@@ -292,7 +292,6 @@ private:
     CComPtr<IShellView>                     fCurrentShellView;          //
     LPITEMIDLIST                            fCurrentDirectoryPIDL;      //
     HWND                                    fStatusBar;
-    bool                                    fStatusBarVisible;
     CToolbarProxy                           fToolbarProxy;
     barInfo                                 fClientBars[3];
     CComPtr<ITravelLog>                     fTravelLog;
@@ -306,6 +305,7 @@ private:
     IBindCtx                                *fHistoryBindContext;
     HDSA menuDsa;
     HACCEL m_hAccel;
+    ShellSettings m_settings;
 public:
 #if 0
     ULONG InternalAddRef()
@@ -350,7 +350,7 @@ public:
     HRESULT UpdateUpState();
     void UpdateGotoMenu(HMENU theMenu);
     void UpdateViewMenu(HMENU theMenu);
-    void LoadSettings();
+    void LoadCabinetState();
 
 /*    // *** IDockingWindowFrame methods ***
     virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR 
pwszItem, DWORD dwAddFlags);
@@ -624,6 +624,8 @@ public:
     LRESULT OnRefresh(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL 
&bHandled);
     LRESULT OnExplorerBar(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL 
&bHandled);
     LRESULT RelayCommands(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL 
&bHandled);
+    LRESULT OnSettingsChange(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& 
bHandled);
+    LRESULT OnGetSettingsPtr(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& 
bHandled);
     HRESULT OnSearch();
 
     static ATL::CWndClassInfo& GetWndClassInfo()
@@ -674,6 +676,8 @@ public:
         COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET, 
IDM_GOTO_TRAVEL_LASTTARGET, OnGoTravel)
         COMMAND_RANGE_HANDLER(IDM_EXPLORERBAND_BEGINCUSTOM, 
IDM_EXPLORERBAND_ENDCUSTOM, OnExplorerBar)
         MESSAGE_HANDLER(WM_COMMAND, RelayCommands)
+        MESSAGE_HANDLER(BWM_SETTINGCHANGE, OnSettingsChange)
+        MESSAGE_HANDLER(BWM_GETSETTINGSPTR, OnGetSettingsPtr)
     END_MSG_MAP()
 
     BEGIN_CONNECTION_POINT_MAP(CShellBrowser)
@@ -714,6 +718,7 @@ CShellBrowser::CShellBrowser()
     fHistoryObject = NULL;
     fHistoryStream = NULL;
     fHistoryBindContext = NULL;
+    m_settings.Load();
 }
 
 CShellBrowser::~CShellBrowser()
@@ -783,11 +788,11 @@ HRESULT CShellBrowser::Initialize()
 
     fToolbarProxy.Initialize(m_hWnd, clientBar);
 
-    LoadSettings();
+    LoadCabinetState();
 
     // create status bar
     DWORD dwStatusStyle = WS_CHILD | WS_CLIPSIBLINGS | SBARS_SIZEGRIP | 
SBARS_TOOLTIPS;
-    if (fStatusBarVisible)
+    if (m_settings.fStatusBarVisible)
         dwStatusStyle |= WS_VISIBLE;
     fStatusBar = ::CreateWindowExW(0, STATUSCLASSNAMEW, NULL, dwStatusStyle,
                                    0, 0, 500, 20, m_hWnd, (HMENU)IDC_STATUSBAR,
@@ -1449,7 +1454,7 @@ void CShellBrowser::RepositionBars()
 
     GetClientRect(&clientRect);
 
-    if (fStatusBarVisible && fStatusBar)
+    if (m_settings.fStatusBarVisible && fStatusBar)
     {
         ::GetWindowRect(fStatusBar, &statusRect);
         ::SetWindowPos(fStatusBar, NULL, clientRect.left, clientRect.bottom - 
(statusRect.bottom - statusRect.top),
@@ -1517,13 +1522,8 @@ void CShellBrowser::RepositionBars()
                         clientRect.bottom - clientRect.top, SWP_NOOWNERZORDER 
| SWP_NOZORDER);
 }
 
-void CShellBrowser::LoadSettings()
+void CShellBrowser::LoadCabinetState()
 {
-    fStatusBarVisible = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet 
Explorer\\Main",
-                                             L"StatusBarOther",
-                                             FALSE,
-                                             FALSE);
-
     fCabinetState.fFullPathTitle = 
SHRegGetBoolUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CabinetState",
                                                         L"FullPath",
                                                         FALSE,
@@ -1757,7 +1757,7 @@ void CShellBrowser::UpdateViewMenu(HMENU theMenu)
         menuItemInfo.hSubMenu = toolbarMenu;
         SetMenuItemInfo(theMenu, IDM_VIEW_TOOLBARS, FALSE, &menuItemInfo);
     }
-    SHCheckMenuItem(theMenu, IDM_VIEW_STATUSBAR, fStatusBarVisible ? TRUE : 
FALSE);
+    SHCheckMenuItem(theMenu, IDM_VIEW_STATUSBAR, m_settings.fStatusBarVisible 
? TRUE : FALSE);
 }
 
 HRESULT CShellBrowser::BuildExplorerBandMenu()
@@ -3681,21 +3681,9 @@ LRESULT CShellBrowser::OnOrganizeFavorites(WORD 
wNotifyCode, WORD wID, HWND hWnd
 
 LRESULT CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode, WORD wID, 
HWND hWndCtl, BOOL &bHandled)
 {
-    fStatusBarVisible = !fStatusBarVisible;
-    if (fStatusBar)
-    {
-        ::ShowWindow(fStatusBar, fStatusBarVisible ? SW_SHOW : SW_HIDE);
-        RepositionBars();
-    }
-    
-    DWORD dwStatusBarVisible = fStatusBarVisible;
-    SHRegSetUSValueW(L"Software\\Microsoft\\Internet Explorer\\Main",
-                     L"StatusBarOther",
-                     REG_DWORD,
-                     &dwStatusBarVisible,
-                     sizeof(dwStatusBarVisible),
-                     SHREGSET_FORCE_HKCU);
-    
+    m_settings.fStatusBarVisible = !m_settings.fStatusBarVisible;
+    m_settings.Save();
+    SendMessageW(BWM_SETTINGCHANGE, 0, (LPARAM)&m_settings);
     return 0;
 }
 
@@ -3800,6 +3788,30 @@ LRESULT CShellBrowser::RelayCommands(UINT uMsg, WPARAM 
wParam, LPARAM lParam, BO
     return 0;
 }
 
+LRESULT CShellBrowser::OnSettingsChange(UINT uMsg, WPARAM wParam, LPARAM 
lParam, BOOL& bHandled)
+{
+    /* Refresh child windows */
+    ::SendMessageW(fClientBars[BIInternetToolbar].hwnd, uMsg, wParam, lParam);
+
+    /* Refresh status bar */
+    if (fStatusBar)
+    {
+        ::ShowWindow(fStatusBar, m_settings.fStatusBarVisible ? SW_SHOW : 
SW_HIDE);
+        RepositionBars();
+    }
+
+    return 0;
+}
+
+LRESULT CShellBrowser::OnGetSettingsPtr(UINT uMsg, WPARAM wParam, LPARAM 
lParam, BOOL& bHandled)
+{
+    if (!lParam)
+        return ERROR_INVALID_PARAMETER;
+
+    *(ShellSettings**)lParam = &m_settings;
+    return NO_ERROR;
+}
+
 HRESULT CShellBrowser_CreateInstance(REFIID riid, void **ppv)
 {
     return ShellObjectCreatorInit<CShellBrowser>(riid, ppv);

Reply via email to