From 2ed535da8ab490b53bb496f3ac25fd1fd03f4965 Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Mon, 30 Oct 2017 17:39:12 +0200 Subject: [PATCH] [EXPLORER] -Rewrite taskbar settings routines and dialog - Rewrite the taskbar settings and start menu settings property sheets. - All settings in the taskbar settings property sheet can be loaded and saved properly except for the quick launch one which will be implemented later. - Implement toggling lock, autohide and always on top. The rest will be implemented later. --- base/shell/explorer/CMakeLists.txt | 2 +- base/shell/explorer/explorer.cpp | 3 +- base/shell/explorer/precomp.h | 55 +-- base/shell/explorer/resource.h | 2 + base/shell/explorer/settings.cpp | 106 ++---- base/shell/explorer/taskswnd.cpp | 13 + base/shell/explorer/trayntfy.cpp | 64 ++-- base/shell/explorer/trayprop.cpp | 583 ++++++++++------------------- base/shell/explorer/traywnd.cpp | 173 ++++----- 9 files changed, 395 insertions(+), 606 deletions(-) diff --git a/base/shell/explorer/CMakeLists.txt b/base/shell/explorer/CMakeLists.txt index 8d1eaa42c6520..f935f4dafd7f0 100644 --- a/base/shell/explorer/CMakeLists.txt +++ b/base/shell/explorer/CMakeLists.txt @@ -1,7 +1,7 @@ PROJECT(SHELL) set_cpp(WITH_RUNTIME) - +add_definitions(-D_ATL_NO_EXCEPTIONS) include_directories(${REACTOS_SOURCE_DIR}/sdk/lib/atl) list(APPEND SOURCE diff --git a/base/shell/explorer/explorer.cpp b/base/shell/explorer/explorer.cpp index e803c4db42914..f6e7402423d1e 100644 --- a/base/shell/explorer/explorer.cpp +++ b/base/shell/explorer/explorer.cpp @@ -127,7 +127,8 @@ StartWithDesktop(IN HINSTANCE hInstance) hExplorerInstance = hInstance; hProcessHeap = GetProcessHeap(); - LoadTaskBarSettings(); + g_TaskbarSettings.Load(); + InitCommonControls(); OleInitialize(NULL); diff --git a/base/shell/explorer/precomp.h b/base/shell/explorer/precomp.h index f674a2c13cc89..df6fd7537fd0e 100644 --- a/base/shell/explorer/precomp.h +++ b/base/shell/explorer/precomp.h @@ -27,6 +27,7 @@ #include #include #include +#include #include #include #include @@ -40,6 +41,7 @@ #include #include +#include #include #include "tmschema.h" @@ -125,6 +127,7 @@ HRESULT WINAPI _CBandSite_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void */ #define TWM_OPENSTARTMENU (WM_USER + 260) +#define TWM_SETTINGSCHANGED (WM_USER + 300) extern const GUID IID_IShellDesktopTray; @@ -181,35 +184,39 @@ TrayMessageLoop(IN OUT ITrayWindow *Tray); * settings.c */ -/* Structure to hold non-default options*/ -typedef struct _TASKBAR_SETTINGS +typedef struct _TW_STUCKRECTS2 +{ + DWORD cbSize; + LONG Unknown; + union + { + DWORD dwFlags; + struct + { + DWORD AutoHide : 1; + DWORD AlwaysOnTop : 1; + DWORD SmallIcons : 1; + DWORD HideClock : 1; + }; + }; + DWORD Position; + SIZE Size; + RECT Rect; +} TW_STRUCKRECTS2, *PTW_STUCKRECTS2; + +struct TaskbarSettings { BOOL bLock; - BOOL bAutoHide; - BOOL bAlwaysOnTop; BOOL bGroupButtons; - BOOL bShowQuickLaunch; - BOOL bShowClock; BOOL bShowSeconds; BOOL bHideInactiveIcons; -} TASKBAR_SETTINGS, *PTASKBAR_SETTINGS; - -extern TASKBAR_SETTINGS TaskBarSettings; - -VOID -LoadTaskBarSettings(VOID); + TW_STRUCKRECTS2 sr; -VOID -SaveTaskBarSettings(VOID); + BOOL Load(); + BOOL Save(); +}; -BOOL -LoadSettingDword(IN LPCWSTR pszKeyName, - IN LPCWSTR pszValueName, - OUT DWORD &dwValue); -BOOL -SaveSettingDword(IN LPCWSTR pszKeyName, - IN LPCWSTR pszValueName, - IN DWORD dwValue); +extern TaskbarSettings g_TaskbarSettings; /* * shellservice.cpp @@ -229,7 +236,7 @@ ProcessStartupItems(VOID); */ VOID -DisplayTrayProperties(IN HWND hwndOwner); +DisplayTrayProperties(IN HWND hwndOwner, IN HWND hwndTaskbar); /* * desktop.cpp @@ -344,7 +351,7 @@ VOID UnregisterTrayNotifyWndClass(VOID); HWND -CreateTrayNotifyWnd(IN OUT ITrayWindow *TrayWindow, IN BOOL bHideClock, CTrayNotifyWnd** ppTrayNotify); +CreateTrayNotifyWnd(IN OUT ITrayWindow *TrayWindow, CTrayNotifyWnd** ppTrayNotify); BOOL TrayNotify_NotifyIconCmd(CTrayNotifyWnd* pTrayNotify, IN WPARAM wParam, IN LPARAM lParam); diff --git a/base/shell/explorer/resource.h b/base/shell/explorer/resource.h index ae3c29181f9b7..aed1e08a6043a 100644 --- a/base/shell/explorer/resource.h +++ b/base/shell/explorer/resource.h @@ -107,6 +107,7 @@ \*******************************************************************************/ /* Taskbar Page */ +#define IDC_TASKBARPROP_FIRST_CMD 1000 #define IDC_TASKBARPROP_HIDEICONS 1000 #define IDC_TASKBARPROP_ICONCUST 1007 #define IDC_TASKBARPROP_ONTOP 1101 @@ -116,6 +117,7 @@ #define IDC_TASKBARPROP_LOCK 1105 #define IDC_TASKBARPROP_SECONDS 1106 #define IDC_TASKBARPROP_SHOWQL 1107 +#define IDC_TASKBARPROP_LAST_CMD 1107 #define IDC_TASKBARPROP_TASKBARBITMAP 1111 #define IDC_TASKBARPROP_NOTIFICATIONBITMAP 1112 diff --git a/base/shell/explorer/settings.cpp b/base/shell/explorer/settings.cpp index 791a91c79c239..f47e165d7df9f 100644 --- a/base/shell/explorer/settings.cpp +++ b/base/shell/explorer/settings.cpp @@ -20,85 +20,61 @@ #include "precomp.h" -TASKBAR_SETTINGS TaskBarSettings; -const WCHAR szSettingsKey[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer"; -const WCHAR szAdvancedSettingsKey[] = L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced"; +TaskbarSettings g_TaskbarSettings; -VOID -LoadTaskBarSettings(VOID) +BOOL TaskbarSettings::Save() { - DWORD dwValue = NULL; - - LoadSettingDword(szAdvancedSettingsKey, L"TaskbarSizeMove", dwValue); - TaskBarSettings.bLock = (dwValue == 0); - - LoadSettingDword(szAdvancedSettingsKey, L"ShowSeconds", dwValue); - TaskBarSettings.bShowSeconds = (dwValue != 0); - - LoadSettingDword(szSettingsKey, L"EnableAutotray", dwValue); - TaskBarSettings.bHideInactiveIcons = (dwValue != 0); - - LoadSettingDword(szAdvancedSettingsKey, L"TaskbarGlomming", dwValue); - TaskBarSettings.bGroupButtons = (dwValue != 0); - - TaskBarSettings.bShowQuickLaunch = TRUE; //FIXME: Where is this stored, and how? - - /* FIXME: The following settings are stored in stuckrects2, do they have to be load here too? */ - TaskBarSettings.bShowClock = TRUE; - TaskBarSettings.bAutoHide = FALSE; - TaskBarSettings.bAlwaysOnTop = FALSE; + SHSetValueW(hkExplorer, NULL, L"EnableAutotray", REG_DWORD, &bHideInactiveIcons, sizeof(bHideInactiveIcons)); + SHSetValueW(hkExplorer, L"Advanced", L"ShowSeconds", REG_DWORD, &bShowSeconds, sizeof(bShowSeconds)); + SHSetValueW(hkExplorer, L"Advanced", L"TaskbarGlomming", REG_DWORD, &bGroupButtons, sizeof(bGroupButtons)); + BOOL bAllowSizeMove = !bLock; + SHSetValueW(hkExplorer, L"Advanced", L"TaskbarSizeMove", REG_DWORD, &bAllowSizeMove, sizeof(bAllowSizeMove)); + sr.cbSize = sizeof(sr); + SHSetValueW(hkExplorer, L"StuckRects2", L"Settings", REG_BINARY, &sr, sizeof(sr)); + /* TODO: AutoHide writes something to HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Components\0 figure out what and why */ + return TRUE; } -VOID -SaveTaskBarSettings(VOID) +BOOL TaskbarSettings::Load() { - SaveSettingDword(szAdvancedSettingsKey, L"TaskbarSizeMove", TaskBarSettings.bLock); - SaveSettingDword(szAdvancedSettingsKey, L"ShowSeconds", TaskBarSettings.bShowSeconds); - SaveSettingDword(szSettingsKey, L"EnableAutotray", TaskBarSettings.bHideInactiveIcons); - SaveSettingDword(szAdvancedSettingsKey, L"TaskbarGlomming", TaskBarSettings.bGroupButtons); - - /* FIXME: Show Clock, AutoHide and Always on top are stored in the stuckrects2 key but are not written to it with a click on apply. How is this done instead? - AutoHide writes something to HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Desktop\Components\0 figure out what and why */ -} + DWORD dwRet, cbSize, dwValue = NULL; -BOOL -LoadSettingDword(IN LPCWSTR pszKeyName, - IN LPCWSTR pszValueName, - OUT DWORD &dwValue) -{ - BOOL ret = FALSE; - HKEY hKey; + cbSize = sizeof(dwValue); + dwRet = SHGetValueW(hkExplorer, L"Advanced", L"TaskbarSizeMove", NULL, &dwValue, &cbSize); + bLock = (dwRet == ERROR_SUCCESS) ? (dwValue == 0) : TRUE; - if (RegOpenKeyW(HKEY_CURRENT_USER, pszKeyName, &hKey) == ERROR_SUCCESS) - { - DWORD dwValueLength, dwType; + dwRet = SHGetValueW(hkExplorer, L"Advanced", L"ShowSeconds", NULL, &dwValue, &cbSize); + bShowSeconds = (dwRet == ERROR_SUCCESS) ? (dwValue != 0) : FALSE; - dwValueLength = sizeof(dwValue); - ret = RegQueryValueExW(hKey, pszValueName, NULL, &dwType, (PBYTE)&dwValue, &dwValueLength) == ERROR_SUCCESS && dwType == REG_DWORD; - - RegCloseKey(hKey); - } - - return ret; -} + dwRet = SHGetValueW(hkExplorer, L"Advanced", L"TaskbarGlomming", NULL, &dwValue, &cbSize); + bGroupButtons = (dwRet == ERROR_SUCCESS) ? (dwValue != 0) : FALSE; -BOOL -SaveSettingDword(IN LPCWSTR pszKeyName, - IN LPCWSTR pszValueName, - IN DWORD dwValue) -{ - BOOL ret = FALSE; - HKEY hKey; + dwRet = SHGetValueW(hkExplorer, NULL, L"EnableAutotray", NULL, &dwValue, &cbSize); + bHideInactiveIcons = (dwRet == ERROR_SUCCESS) ? (dwValue != 0) : FALSE; - if (RegCreateKeyW(HKEY_CURRENT_USER, pszKeyName, &hKey) == ERROR_SUCCESS) - { - ret = RegSetValueExW(hKey, pszValueName, 0, REG_DWORD, (PBYTE)&dwValue, sizeof(dwValue)) == ERROR_SUCCESS; + cbSize = sizeof(sr); + dwRet = SHGetValueW(hkExplorer, L"StuckRects2", L"Settings", NULL, &sr, &cbSize); - RegCloseKey(hKey); + /* Make sure we have correct values here */ + if (dwRet != ERROR_SUCCESS || sr.cbSize != sizeof(sr) || cbSize != sizeof(sr)) + { + sr.Position = ABE_BOTTOM; + sr.AutoHide = FALSE; + sr.AlwaysOnTop = TRUE; + sr.SmallIcons = TRUE; + sr.HideClock = FALSE; + sr.Rect.left = sr.Rect.top = 0; + sr.Rect.bottom = sr.Rect.right = 1; + sr.Size.cx = sr.Size.cy = 0; + } + else + { + if (sr.Position > ABE_BOTTOM) + sr.Position = ABE_BOTTOM; } - return ret; + return TRUE; } /* EOF */ diff --git a/base/shell/explorer/taskswnd.cpp b/base/shell/explorer/taskswnd.cpp index 94ee9260386ec..44d0e3e2155df 100644 --- a/base/shell/explorer/taskswnd.cpp +++ b/base/shell/explorer/taskswnd.cpp @@ -1735,6 +1735,18 @@ class CTaskSwitchWnd : return TRUE; } + LRESULT OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + TaskbarSettings* newSettings = (TaskbarSettings*)lParam; + if (newSettings->bGroupButtons != g_TaskbarSettings.bGroupButtons) + { + /* TODO: Toggle grouping */ + g_TaskbarSettings.bGroupButtons = newSettings->bGroupButtons; + } + + return 0; + } + LRESULT OnContextMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { LRESULT Ret = 0; @@ -1828,6 +1840,7 @@ class CTaskSwitchWnd : MESSAGE_HANDLER(WM_NOTIFY, OnNotify) MESSAGE_HANDLER(TSWM_ENABLEGROUPING, OnEnableGrouping) MESSAGE_HANDLER(TSWM_UPDATETASKBARPOS, OnUpdateTaskbarPos) + MESSAGE_HANDLER(TWM_SETTINGSCHANGED, OnTaskbarSettingsChanged) MESSAGE_HANDLER(WM_CONTEXTMENU, OnContextMenu) MESSAGE_HANDLER(WM_TIMER, OnTimer) MESSAGE_HANDLER(WM_SETFONT, OnSetFont) diff --git a/base/shell/explorer/trayntfy.cpp b/base/shell/explorer/trayntfy.cpp index b79d41b5a3edc..95c40aa723fbd 100644 --- a/base/shell/explorer/trayntfy.cpp +++ b/base/shell/explorer/trayntfy.cpp @@ -916,7 +916,7 @@ class CTrayClockWnd : if (ClockWndFormats[i].IsTime) { iRet = GetTimeFormat(LOCALE_USER_DEFAULT, - TaskBarSettings.bShowSeconds ? ClockWndFormats[i].dwFormatFlags : TIME_NOSECONDS, + g_TaskbarSettings.bShowSeconds ? ClockWndFormats[i].dwFormatFlags : TIME_NOSECONDS, &LocalTime, ClockWndFormats[i].lpFormat, szLines[i], @@ -988,7 +988,7 @@ class CTrayClockWnd : /* Calculate the due time */ GetLocalTime(&LocalTime); uiDueTime = 1000 - (UINT) LocalTime.wMilliseconds; - if (TaskBarSettings.bShowSeconds) + if (g_TaskbarSettings.bShowSeconds) uiDueTime += (UINT) LocalTime.wSecond * 100; else uiDueTime += (59 - (UINT) LocalTime.wSecond) * 1000; @@ -1046,7 +1046,7 @@ class CTrayClockWnd : uiDueTime = CalculateDueTime(); - if (TaskBarSettings.bShowSeconds) + if (g_TaskbarSettings.bShowSeconds) { uiWait1 = 1000 - 200; uiWait2 = 1000; @@ -1310,15 +1310,7 @@ class CTrayNotifyWnd : SIZE szTrayClockMin; SIZE szTrayNotify; MARGINS ContentMargin; - union - { - DWORD dwFlags; - struct - { - DWORD HideClock : 1; - DWORD IsHorizontal : 1; - }; - }; + BOOL IsHorizontal; public: CTrayNotifyWnd() : @@ -1326,7 +1318,7 @@ class CTrayNotifyWnd : m_pager(NULL), m_clock(NULL), TrayTheme(NULL), - dwFlags(0) + IsHorizontal(FALSE) { ZeroMemory(&szTrayClockMin, sizeof(szTrayClockMin)); ZeroMemory(&szTrayNotify, sizeof(szTrayNotify)); @@ -1377,10 +1369,10 @@ class CTrayNotifyWnd : LRESULT OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { m_clock = new CTrayClockWnd(); - m_clock->_Init(m_hWnd, !HideClock); + m_clock->_Init(m_hWnd, !g_TaskbarSettings.sr.HideClock); m_pager = new CSysPagerWnd(); - m_pager->_Init(m_hWnd, !HideClock); + m_pager->_Init(m_hWnd, !g_TaskbarSettings.sr.HideClock); return TRUE; } @@ -1390,7 +1382,7 @@ class CTrayNotifyWnd : SIZE szClock = { 0, 0 }; SIZE szTray = { 0, 0 }; - if (!HideClock) + if (!g_TaskbarSettings.sr.HideClock) { if (IsHorizontal) { @@ -1430,7 +1422,7 @@ class CTrayNotifyWnd : { pSize->cx = 2 * TRAY_NOTIFY_WND_SPACING_X; - if (!HideClock) + if (!g_TaskbarSettings.sr.HideClock) pSize->cx += TRAY_NOTIFY_WND_SPACING_X + szTrayClockMin.cx; pSize->cx += szTray.cx; @@ -1439,7 +1431,7 @@ class CTrayNotifyWnd : { pSize->cy = 2 * TRAY_NOTIFY_WND_SPACING_Y; - if (!HideClock) + if (!g_TaskbarSettings.sr.HideClock) pSize->cy += TRAY_NOTIFY_WND_SPACING_Y + szTrayClockMin.cy; pSize->cy += szTray.cy; @@ -1453,7 +1445,7 @@ class CTrayNotifyWnd : VOID Size(IN const SIZE *pszClient) { - if (!HideClock) + if (!g_TaskbarSettings.sr.HideClock) { POINT ptClock; SIZE szClock; @@ -1600,17 +1592,35 @@ class CTrayNotifyWnd : LRESULT OnShowClock(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - BOOL PrevHidden = HideClock; - HideClock = (wParam == 0); + BOOL PrevHidden = g_TaskbarSettings.sr.HideClock; + g_TaskbarSettings.sr.HideClock = (wParam == 0); - if (m_clock != NULL && PrevHidden != HideClock) + if (m_clock != NULL && PrevHidden != g_TaskbarSettings.sr.HideClock) { - m_clock->ShowWindow(HideClock ? SW_HIDE : SW_SHOW); + m_clock->ShowWindow(g_TaskbarSettings.sr.HideClock ? SW_HIDE : SW_SHOW); } return (LRESULT) (!PrevHidden); } + LRESULT OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + TaskbarSettings* newSettings = (TaskbarSettings*)lParam; + if (newSettings->bShowSeconds != g_TaskbarSettings.bShowSeconds) + { + g_TaskbarSettings.bShowSeconds = newSettings->bShowSeconds; + /* TODO: Toggle showing seconds */ + } + + if (newSettings->sr.HideClock != g_TaskbarSettings.sr.HideClock) + { + g_TaskbarSettings.sr.HideClock = newSettings->sr.HideClock; + /* TODO: Toggle hiding the clock */ + } + + return 0; + } + LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { const NMHDR *nmh = (const NMHDR *) lParam; @@ -1665,9 +1675,10 @@ class CTrayNotifyWnd : MESSAGE_HANDLER(TNWM_GETMINIMUMSIZE, OnGetMinimumSize) MESSAGE_HANDLER(TNWM_UPDATETIME, OnUpdateTime) MESSAGE_HANDLER(TNWM_SHOWCLOCK, OnShowClock) + MESSAGE_HANDLER(TWM_SETTINGSCHANGED, OnTaskbarSettingsChanged) END_MSG_MAP() - HWND _Init(IN OUT ITrayWindow *TrayWindow, IN BOOL bHideClock) + HWND _Init(IN OUT ITrayWindow *TrayWindow) { HWND hWndTrayWindow; @@ -1676,7 +1687,6 @@ class CTrayNotifyWnd : return NULL; this->TrayWindow = TrayWindow; - this->HideClock = bHideClock; this->hWndNotify = hWndTrayWindow; DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; @@ -1684,13 +1694,13 @@ class CTrayNotifyWnd : } }; -HWND CreateTrayNotifyWnd(IN OUT ITrayWindow *Tray, BOOL bHideClock, CTrayNotifyWnd** ppinstance) +HWND CreateTrayNotifyWnd(IN OUT ITrayWindow *Tray, CTrayNotifyWnd** ppinstance) { CTrayNotifyWnd * pTrayNotify = new CTrayNotifyWnd(); // TODO: Destroy after the window is destroyed *ppinstance = pTrayNotify; - return pTrayNotify->_Init(Tray, bHideClock); + return pTrayNotify->_Init(Tray); } BOOL diff --git a/base/shell/explorer/trayprop.cpp b/base/shell/explorer/trayprop.cpp index 87cf7a2d8cd4f..03823ccf97de7 100644 --- a/base/shell/explorer/trayprop.cpp +++ b/base/shell/explorer/trayprop.cpp @@ -21,441 +21,254 @@ #include "precomp.h" -typedef struct _PROPSHEET_INFO +static void SetBitmap(HWND hwnd, HBITMAP* hbmp, UINT uImageId) { - HWND hTaskbarWnd; - HWND hStartWnd; + if (*hbmp) + DeleteObject(*hbmp); - HBITMAP hTaskbarBitmap; - HBITMAP hTrayBitmap; - HBITMAP hStartBitmap; -} PROPSHEET_INFO, *PPROPSHEET_INFO; + *hbmp = (HBITMAP)LoadImageW(hExplorerInstance, + MAKEINTRESOURCEW(uImageId), + IMAGE_BITMAP, + 0, + 0, + LR_DEFAULTCOLOR); + + if (*hbmp && hwnd) + { + BITMAP bm; + GetObject(*hbmp, sizeof(bm), &bm); + ::SetWindowPos(hwnd, NULL, 0, 0, bm.bmWidth + 2, bm.bmHeight + 2, + SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); + SendMessage(hwnd, STM_SETIMAGE, IMAGE_BITMAP, (LPARAM)*hbmp); + } +} -static BOOL -UpdateBitmaps(PPROPSHEET_INFO pPropInfo) +class CTaskBarSettingsPage : public CPropertyPageImpl { - HWND hwndLock, hwndHide, hwndGroup, hwndShowQL, hwndClock, hwndSeconds, hwndHideInactive, hwndModernStart, hwndClassicStart; - HWND hwndTaskbarBitmap, hwndTrayBitmap, hwndStartBitmap; - HWND hwndCustomizeNotifyButton, hwndCustomizeClassicStartButton, hwndCustomizeModernStartButton; - BOOL bLock, bHide, bGroup, bShowQL, bShowClock, bShowSeconds, bHideInactive; - LPTSTR lpTaskBarImageName = NULL, lpTrayImageName = NULL, lpStartImageName = NULL; - BOOL bRet = FALSE; - - hwndLock = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_LOCK); - hwndHide = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_HIDE); - hwndGroup = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_GROUP); - hwndShowQL = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_SHOWQL); - - hwndClock = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_CLOCK); - hwndSeconds = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_SECONDS); - hwndHideInactive = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_HIDEICONS); - - hwndCustomizeNotifyButton = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_ICONCUST); - - hwndModernStart = GetDlgItem(pPropInfo->hStartWnd, IDC_TASKBARPROP_STARTMENU); - hwndClassicStart = GetDlgItem(pPropInfo->hStartWnd, IDC_TASKBARPROP_STARTMENUCLASSIC); - - hwndCustomizeClassicStartButton = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_STARTMENUCLASSICCUST); - hwndCustomizeModernStartButton = GetDlgItem(pPropInfo->hTaskbarWnd, IDC_TASKBARPROP_STARTMENUCUST); - - +private: + HBITMAP m_hbmpTaskbar; + HBITMAP m_hbmpTray; + HWND m_hwndTaskbar; - if (hwndLock && hwndHide && hwndGroup && hwndShowQL && hwndClock && hwndSeconds && hwndHideInactive) + void UpdateDialog() { - bLock = (SendMessage(hwndLock, BM_GETCHECK, 0, 0) == BST_CHECKED); - bHide = (SendMessage(hwndHide, BM_GETCHECK, 0, 0) == BST_CHECKED); - bGroup = (SendMessage(hwndGroup, BM_GETCHECK, 0, 0) == BST_CHECKED); - bShowQL = (SendMessage(hwndShowQL, BM_GETCHECK, 0, 0) == BST_CHECKED); - - bShowClock = (SendMessage(hwndClock, BM_GETCHECK, 0, 0) == BST_CHECKED); - bShowSeconds = (SendMessage(hwndSeconds, BM_GETCHECK, 0, 0) == BST_CHECKED); - bHideInactive = (SendMessage(hwndHideInactive, BM_GETCHECK, 0, 0) == BST_CHECKED); + BOOL bLock = IsDlgButtonChecked(IDC_TASKBARPROP_LOCK); + BOOL bHide = IsDlgButtonChecked(IDC_TASKBARPROP_HIDE); + BOOL bGroup = IsDlgButtonChecked(IDC_TASKBARPROP_GROUP); + BOOL bShowQL = IsDlgButtonChecked(IDC_TASKBARPROP_SHOWQL); + BOOL bShowClock = IsDlgButtonChecked(IDC_TASKBARPROP_CLOCK); + BOOL bShowSeconds = IsDlgButtonChecked(IDC_TASKBARPROP_SECONDS); + BOOL bHideInactive = IsDlgButtonChecked(IDC_TASKBARPROP_HIDEICONS); + UINT uImageId; + + HWND hwndCustomizeNotifyButton = GetDlgItem(IDC_TASKBARPROP_ICONCUST); + HWND hwndSeconds = GetDlgItem(IDC_TASKBARPROP_SECONDS); + HWND hwndTaskbarBitmap = GetDlgItem(IDC_TASKBARPROP_TASKBARBITMAP); + HWND hwndTrayBitmap = GetDlgItem(IDC_TASKBARPROP_NOTIFICATIONBITMAP); if (bHide) - lpTaskBarImageName = MAKEINTRESOURCEW(IDB_TASKBARPROP_AUTOHIDE); + uImageId = IDB_TASKBARPROP_AUTOHIDE; else if (bLock && bGroup && bShowQL) - lpTaskBarImageName = MAKEINTRESOURCEW(IDB_TASKBARPROP_LOCK_GROUP_QL); + uImageId = IDB_TASKBARPROP_LOCK_GROUP_QL; else if (bLock && !bGroup && !bShowQL) - lpTaskBarImageName = MAKEINTRESOURCEW(IDB_TASKBARPROP_LOCK_NOGROUP_NOQL); + uImageId = IDB_TASKBARPROP_LOCK_NOGROUP_NOQL; else if (bLock && bGroup && !bShowQL) - lpTaskBarImageName = MAKEINTRESOURCEW(IDB_TASKBARPROP_LOCK_GROUP_NOQL); + uImageId = IDB_TASKBARPROP_LOCK_GROUP_NOQL; else if (bLock && !bGroup && bShowQL) - lpTaskBarImageName = MAKEINTRESOURCEW(IDB_TASKBARPROP_LOCK_NOGROUP_QL); + uImageId = IDB_TASKBARPROP_LOCK_NOGROUP_QL; else if (!bLock && !bGroup && !bShowQL) - lpTaskBarImageName = MAKEINTRESOURCEW(IDB_TASKBARPROP_NOLOCK_NOGROUP_NOQL); + uImageId = IDB_TASKBARPROP_NOLOCK_NOGROUP_NOQL; else if (!bLock && bGroup && !bShowQL) - lpTaskBarImageName = MAKEINTRESOURCEW(IDB_TASKBARPROP_NOLOCK_GROUP_NOQL); + uImageId = IDB_TASKBARPROP_NOLOCK_GROUP_NOQL; else if (!bLock && !bGroup && bShowQL) - lpTaskBarImageName = MAKEINTRESOURCEW(IDB_TASKBARPROP_NOLOCK_NOGROUP_QL); + uImageId = IDB_TASKBARPROP_NOLOCK_NOGROUP_QL; else if (!bLock && bGroup && bShowQL) - lpTaskBarImageName = MAKEINTRESOURCEW(IDB_TASKBARPROP_NOLOCK_GROUP_QL); - - - if (lpTaskBarImageName) - { - if (pPropInfo->hTaskbarBitmap) - { - DeleteObject(pPropInfo->hTaskbarBitmap); - } - - pPropInfo->hTaskbarBitmap = (HBITMAP)LoadImageW(hExplorerInstance, - lpTaskBarImageName, - IMAGE_BITMAP, - 0, - 0, - LR_DEFAULTCOLOR); - if (pPropInfo->hTaskbarBitmap) - { - hwndTaskbarBitmap = GetDlgItem(pPropInfo->hTaskbarWnd, - IDC_TASKBARPROP_TASKBARBITMAP); - if (hwndTaskbarBitmap) - { - BITMAP bm; - GetObject(pPropInfo->hTaskbarBitmap, sizeof(bm), &bm); - SetWindowPos(hwndTaskbarBitmap, NULL, 0, 0, bm.bmWidth + 2, bm.bmHeight + 2, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); - SendMessage(hwndTaskbarBitmap, - STM_SETIMAGE, - IMAGE_BITMAP, - (LPARAM)pPropInfo->hTaskbarBitmap); - } - } - } - - if (bHideInactive) - { - EnableWindow(hwndCustomizeNotifyButton, TRUE); - if (bShowClock) - { - EnableWindow(hwndSeconds, TRUE); - if (bShowSeconds) - lpTrayImageName = MAKEINTRESOURCEW(IDB_SYSTRAYPROP_HIDE_SECONDS); - else - lpTrayImageName = MAKEINTRESOURCEW(IDB_SYSTRAYPROP_HIDE_CLOCK); - } - else - { - SendMessage(hwndSeconds, BM_SETCHECK, BST_UNCHECKED, 0); - EnableWindow(hwndSeconds, FALSE); - lpTrayImageName = MAKEINTRESOURCEW(IDB_SYSTRAYPROP_HIDE_NOCLOCK); - } - } - else - { - EnableWindow(hwndCustomizeNotifyButton, FALSE); - if (bShowClock) - { - EnableWindow(hwndSeconds, TRUE); - if (bShowSeconds) - lpTrayImageName = MAKEINTRESOURCEW(IDB_SYSTRAYPROP_SHOW_SECONDS); - else - lpTrayImageName = MAKEINTRESOURCEW(IDB_SYSTRAYPROP_SHOW_CLOCK); - } - else - { - SendMessage(hwndSeconds, BM_SETCHECK, BST_UNCHECKED, 0); - EnableWindow(hwndSeconds, FALSE); - lpTrayImageName = MAKEINTRESOURCEW(IDB_SYSTRAYPROP_SHOW_NOCLOCK); - } - } - - if (lpTrayImageName) - { - if (pPropInfo->hTrayBitmap) - { - DeleteObject(pPropInfo->hTrayBitmap); - } - - pPropInfo->hTrayBitmap = (HBITMAP)LoadImageW(hExplorerInstance, - lpTrayImageName, - IMAGE_BITMAP, - 0, - 0, - LR_DEFAULTCOLOR); - if (pPropInfo->hTrayBitmap) - { - hwndTrayBitmap = GetDlgItem(pPropInfo->hTaskbarWnd, - IDC_TASKBARPROP_NOTIFICATIONBITMAP); - if (hwndTrayBitmap) - { - BITMAP bm; - GetObject(pPropInfo->hTrayBitmap, sizeof(bm), &bm); - SetWindowPos(hwndTrayBitmap, NULL, 0, 0, bm.bmWidth + 2, bm.bmHeight + 2, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); - SendMessage(hwndTrayBitmap, - STM_SETIMAGE, - IMAGE_BITMAP, - (LPARAM)pPropInfo->hTrayBitmap); - } - } - } + uImageId = IDB_TASKBARPROP_NOLOCK_GROUP_QL; + else + ASSERT(FALSE); + + SetBitmap(hwndTaskbarBitmap, &m_hbmpTaskbar, uImageId); + + ::EnableWindow(hwndCustomizeNotifyButton, bHideInactive); + ::EnableWindow(hwndSeconds, bShowClock); + if (!bShowSeconds) + CheckDlgButton(IDC_TASKBARPROP_SECONDS, BST_UNCHECKED); + + if (bHideInactive && bShowClock && bShowSeconds) + uImageId = IDB_SYSTRAYPROP_HIDE_SECONDS; + else if (bHideInactive && bShowClock && !bShowSeconds) + uImageId = IDB_SYSTRAYPROP_HIDE_CLOCK; + else if (bHideInactive && !bShowClock) + uImageId = IDB_SYSTRAYPROP_HIDE_NOCLOCK; + else if (!bHideInactive && bShowClock && bShowSeconds) + uImageId = IDB_SYSTRAYPROP_SHOW_SECONDS; + else if (!bHideInactive && bShowClock && !bShowSeconds) + uImageId = IDB_SYSTRAYPROP_SHOW_CLOCK; + else if (!bHideInactive && !bShowClock) + uImageId = IDB_SYSTRAYPROP_SHOW_NOCLOCK; + else + ASSERT(FALSE); + + SetBitmap(hwndTrayBitmap, &m_hbmpTray, uImageId); + } + +public: + enum { IDD = IDD_TASKBARPROP_TASKBAR }; + + BEGIN_MSG_MAP(CTaskBarSettingsPage) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_ID_HANDLER(IDC_TASKBARPROP_ICONCUST, OnCustomizeTrayIcons) + COMMAND_RANGE_HANDLER(IDC_TASKBARPROP_FIRST_CMD, IDC_TASKBARPROP_LAST_CMD, OnCtrlCommand) + CHAIN_MSG_MAP(CPropertyPageImpl) + END_MSG_MAP() + + CTaskBarSettingsPage(HWND hwnd): + m_hbmpTaskbar(NULL), + m_hbmpTray(NULL), + m_hwndTaskbar(hwnd) + { } - if(hwndClassicStart && hwndModernStart) + ~CTaskBarSettingsPage() { - if(SendMessage(hwndModernStart, BM_GETCHECK, 0, 0) == BST_CHECKED) - { - EnableWindow(hwndCustomizeModernStartButton, TRUE); - EnableWindow(hwndCustomizeClassicStartButton, FALSE); - lpStartImageName = MAKEINTRESOURCEW(IDB_STARTPREVIEW); - } - else - { - EnableWindow(hwndCustomizeModernStartButton, FALSE); - EnableWindow(hwndCustomizeClassicStartButton, TRUE); - lpStartImageName = MAKEINTRESOURCEW(IDB_STARTPREVIEW_CLASSIC); - } - - if (lpStartImageName) - { - if (pPropInfo->hStartBitmap) - { - DeleteObject(pPropInfo->hStartBitmap); - } - - pPropInfo->hStartBitmap = (HBITMAP)LoadImageW(hExplorerInstance, - lpStartImageName, - IMAGE_BITMAP, - 0, - 0, - LR_DEFAULTCOLOR); - if (pPropInfo->hStartBitmap) - { - hwndStartBitmap = GetDlgItem(pPropInfo->hStartWnd, - IDC_TASKBARPROP_STARTMENU_BITMAP); - if (hwndStartBitmap) - { - BITMAP bm; - GetObject(pPropInfo->hStartBitmap, sizeof(bm), &bm); - SetWindowPos(hwndStartBitmap, NULL, 0, 0, bm.bmWidth + 2, bm.bmHeight + 2, - SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER); - SendMessage(hwndStartBitmap, - STM_SETIMAGE, - IMAGE_BITMAP, - (LPARAM)pPropInfo->hStartBitmap); - } - } - } + if (m_hbmpTaskbar) + DeleteObject(m_hbmpTaskbar); + if (m_hbmpTray) + DeleteObject(m_hbmpTray); } - return bRet; -} + LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) + { + CheckDlgButton(IDC_TASKBARPROP_LOCK, g_TaskbarSettings.bLock ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(IDC_TASKBARPROP_HIDE, g_TaskbarSettings.sr.AutoHide ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(IDC_TASKBARPROP_ONTOP, g_TaskbarSettings.sr.AlwaysOnTop ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(IDC_TASKBARPROP_GROUP, g_TaskbarSettings.bGroupButtons ? BST_CHECKED : BST_UNCHECKED); + //CheckDlgButton(IDC_TASKBARPROP_SHOWQL, g_TaskbarSettings.bShowQuickLaunch ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(IDC_TASKBARPROP_CLOCK, (!g_TaskbarSettings.sr.HideClock) ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(IDC_TASKBARPROP_SECONDS, g_TaskbarSettings.bShowSeconds ? BST_CHECKED : BST_UNCHECKED); + CheckDlgButton(IDC_TASKBARPROP_HIDEICONS, g_TaskbarSettings.bHideInactiveIcons ? BST_CHECKED : BST_UNCHECKED); + + UpdateDialog(); + return TRUE; + } -static VOID -OnCreateTaskbarPage(HWND hwnd, - PPROPSHEET_INFO pPropInfo) -{ - SetWindowLongPtr(hwnd, - GWLP_USERDATA, - (LONG_PTR)pPropInfo); - - pPropInfo->hTaskbarWnd = hwnd; - - CheckDlgButton(hwnd, IDC_TASKBARPROP_LOCK, TaskBarSettings.bLock ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_TASKBARPROP_HIDE, TaskBarSettings.bAutoHide ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_TASKBARPROP_ONTOP, TaskBarSettings.bAlwaysOnTop ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_TASKBARPROP_GROUP, TaskBarSettings.bGroupButtons ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_TASKBARPROP_SHOWQL, TaskBarSettings.bShowQuickLaunch ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_TASKBARPROP_CLOCK, TaskBarSettings.bShowClock ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_TASKBARPROP_SECONDS, TaskBarSettings.bShowSeconds ? BST_CHECKED : BST_UNCHECKED); - CheckDlgButton(hwnd, IDC_TASKBARPROP_HIDEICONS, TaskBarSettings.bHideInactiveIcons ? BST_CHECKED : BST_UNCHECKED); - - UpdateBitmaps(pPropInfo); -} + LRESULT OnCustomizeTrayIcons(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) + { + ShowCustomizeNotifyIcons(hExplorerInstance, m_hWnd); + return 0; + } -static VOID -OnCreateStartPage(HWND hwnd, - PPROPSHEET_INFO pPropInfo) -{ - pPropInfo->hStartWnd = hwnd; + LRESULT OnCtrlCommand(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) + { + UpdateDialog(); + SetModified(TRUE); + return 0; + } - CheckDlgButton(hwnd, IDC_TASKBARPROP_STARTMENUCLASSIC, 1); // HACK: This has to be read from registry! - - UpdateBitmaps(pPropInfo); -} + int OnApply() + { + TaskbarSettings newSettings; + memcpy(&newSettings, &g_TaskbarSettings, sizeof(TaskbarSettings)); + + newSettings.bLock = IsDlgButtonChecked(IDC_TASKBARPROP_LOCK); + newSettings.sr.AutoHide = IsDlgButtonChecked(IDC_TASKBARPROP_HIDE); + newSettings.sr.AlwaysOnTop = IsDlgButtonChecked(IDC_TASKBARPROP_ONTOP); + newSettings.bGroupButtons = IsDlgButtonChecked(IDC_TASKBARPROP_GROUP); + //newSettings.bShowQuickLaunch = IsDlgButtonChecked(IDC_TASKBARPROP_SHOWQL); + newSettings.sr.HideClock = !IsDlgButtonChecked(IDC_TASKBARPROP_CLOCK); + newSettings.bShowSeconds = IsDlgButtonChecked(IDC_TASKBARPROP_SECONDS); + newSettings.bHideInactiveIcons = IsDlgButtonChecked(IDC_TASKBARPROP_HIDEICONS); -INT_PTR CALLBACK -TaskbarPageProc(HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) + SendMessage(m_hwndTaskbar, TWM_SETTINGSCHANGED, 0, (LPARAM)&newSettings); + + return PSNRET_NOERROR; + } +}; + +class CStartMenuSettingsPage : public CPropertyPageImpl { - PPROPSHEET_INFO pPropInfo; +private: + HBITMAP m_hbmpStartBitmap; - /* Get the window context */ - pPropInfo = (PPROPSHEET_INFO)GetWindowLongPtrW(hwndDlg, - GWLP_USERDATA); - if (pPropInfo == NULL && uMsg != WM_INITDIALOG) + void UpdateDialog() { - goto HandleDefaultMessage; + HWND hwndCustomizeClassic = GetDlgItem(IDC_TASKBARPROP_STARTMENUCLASSICCUST); + HWND hwndCustomizeModern = GetDlgItem(IDC_TASKBARPROP_STARTMENUCUST); + HWND hwndStartBitmap = GetDlgItem(IDC_TASKBARPROP_STARTMENU_BITMAP); + + BOOL bModern = IsDlgButtonChecked(IDC_TASKBARPROP_STARTMENU); + ::EnableWindow(hwndCustomizeModern, bModern); + ::EnableWindow(hwndCustomizeClassic, !bModern); + + UINT uImageId = bModern ? IDB_STARTPREVIEW : IDB_STARTPREVIEW_CLASSIC; + SetBitmap(hwndStartBitmap, &m_hbmpStartBitmap, uImageId); } - switch (uMsg) +public: + enum { IDD = IDD_TASKBARPROP_STARTMENU }; + + BEGIN_MSG_MAP(CTaskBarSettingsPage) + MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog) + COMMAND_ID_HANDLER(IDC_TASKBARPROP_STARTMENUCLASSICCUST, OnStartMenuCustomize) + CHAIN_MSG_MAP(CPropertyPageImpl) + END_MSG_MAP() + + CStartMenuSettingsPage(): + m_hbmpStartBitmap(NULL) { - case WM_INITDIALOG: - OnCreateTaskbarPage(hwndDlg, (PPROPSHEET_INFO)((LPPROPSHEETPAGE)lParam)->lParam); - break; - - case WM_COMMAND: - switch (LOWORD(wParam)) - { - case IDC_TASKBARPROP_LOCK: - case IDC_TASKBARPROP_HIDE: - case IDC_TASKBARPROP_GROUP: - case IDC_TASKBARPROP_SHOWQL: - case IDC_TASKBARPROP_HIDEICONS: - case IDC_TASKBARPROP_CLOCK: - case IDC_TASKBARPROP_SECONDS: - if (HIWORD(wParam) == BN_CLICKED) - { - UpdateBitmaps(pPropInfo); - - /* Enable the 'Apply' button */ - PropSheet_Changed(GetParent(hwndDlg), hwndDlg); - } - break; - case IDC_TASKBARPROP_ICONCUST: - ShowCustomizeNotifyIcons(hExplorerInstance, hwndDlg); - break; - } - break; - - case WM_NOTIFY: - { - LPNMHDR pnmh = (LPNMHDR)lParam; - - switch (pnmh->code) - { - case PSN_SETACTIVE: - break; - - case PSN_APPLY: - TaskBarSettings.bLock = IsDlgButtonChecked(hwndDlg, IDC_TASKBARPROP_LOCK); - TaskBarSettings.bAutoHide = IsDlgButtonChecked(hwndDlg, IDC_TASKBARPROP_HIDE); - TaskBarSettings.bAlwaysOnTop = IsDlgButtonChecked(hwndDlg, IDC_TASKBARPROP_ONTOP); - TaskBarSettings.bGroupButtons = IsDlgButtonChecked(hwndDlg, IDC_TASKBARPROP_GROUP); - TaskBarSettings.bShowQuickLaunch = IsDlgButtonChecked(hwndDlg, IDC_TASKBARPROP_SHOWQL); - TaskBarSettings.bShowClock = IsDlgButtonChecked(hwndDlg, IDC_TASKBARPROP_CLOCK); - TaskBarSettings.bShowSeconds = IsDlgButtonChecked(hwndDlg, IDC_TASKBARPROP_SECONDS); - TaskBarSettings.bHideInactiveIcons = IsDlgButtonChecked(hwndDlg, IDC_TASKBARPROP_HIDEICONS); - SaveTaskBarSettings(); - break; - } - - break; - } - - case WM_DESTROY: - if (pPropInfo->hTaskbarBitmap) - { - DeleteObject(pPropInfo->hTaskbarBitmap); - } - if (pPropInfo->hTrayBitmap) - { - DeleteObject(pPropInfo->hTrayBitmap); - } - break; - -HandleDefaultMessage: - default: - return FALSE; } - return FALSE; -} - -static INT_PTR CALLBACK -StartMenuPageProc(HWND hwndDlg, - UINT uMsg, - WPARAM wParam, - LPARAM lParam) -{ - switch (uMsg) + ~CStartMenuSettingsPage() { - case WM_INITDIALOG: - OnCreateStartPage(hwndDlg, (PPROPSHEET_INFO)((LPPROPSHEETPAGE)lParam)->lParam); - break; - - case WM_COMMAND: - { - switch (LOWORD(wParam)) - { - case IDC_TASKBARPROP_STARTMENUCLASSICCUST: - ShowCustomizeClassic(hExplorerInstance, hwndDlg); - break; - } - break; - } - - case WM_DESTROY: - break; - - case WM_NOTIFY: - { - LPNMHDR pnmh = (LPNMHDR)lParam; - - switch (pnmh->code) - { - case PSN_SETACTIVE: - break; - - case PSN_APPLY: - break; - } - - break; - } + if (m_hbmpStartBitmap) + DeleteObject(m_hbmpStartBitmap); } - return FALSE; -} + LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) + { + CheckDlgButton(IDC_TASKBARPROP_STARTMENUCLASSIC, BST_CHECKED); // HACK: This has to be read from registry! + UpdateDialog(); + return TRUE; + } -static VOID -InitPropSheetPage(PROPSHEETPAGE *psp, - WORD idDlg, - DLGPROC DlgProc, - LPARAM lParam) -{ - ZeroMemory(psp, sizeof(*psp)); - psp->dwSize = sizeof(*psp); - psp->dwFlags = PSP_DEFAULT; - psp->hInstance = hExplorerInstance; - psp->pszTemplate = MAKEINTRESOURCEW(idDlg); - psp->lParam = lParam; - psp->pfnDlgProc = DlgProc; -} + LRESULT OnStartMenuCustomize(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL &bHandled) + { + ShowCustomizeClassic(hExplorerInstance, m_hWnd); + return 0; + } + int OnApply() + { + //TODO + return PSNRET_NOERROR; + } +}; VOID -DisplayTrayProperties(IN HWND hwndOwner) +DisplayTrayProperties(IN HWND hwndOwner, IN HWND hwndTaskbar) { - PROPSHEET_INFO propInfo = {0}; PROPSHEETHEADER psh; - PROPSHEETPAGE psp[2]; - WCHAR szCaption[256]; - - if (!LoadStringW(hExplorerInstance, - IDS_TASKBAR_STARTMENU_PROP_CAPTION, - szCaption, - _countof(szCaption))) - { - return; - } + HPROPSHEETPAGE hpsp[2]; + CTaskBarSettingsPage tbSettingsPage(hwndTaskbar); + CStartMenuSettingsPage smSettingsPage; + CStringW caption; + + caption.LoadStringW(IDS_TASKBAR_STARTMENU_PROP_CAPTION); + + hpsp[0] = tbSettingsPage.Create(); + hpsp[1] = smSettingsPage.Create(); ZeroMemory(&psh, sizeof(psh)); psh.dwSize = sizeof(psh); - psh.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE; + psh.dwFlags = PSH_PROPTITLE; psh.hwndParent = hwndOwner; psh.hInstance = hExplorerInstance; psh.hIcon = NULL; - psh.pszCaption = szCaption; - psh.nPages = _countof(psp); + psh.pszCaption = caption.GetString(); + psh.nPages = _countof(hpsp); psh.nStartPage = 0; - psh.ppsp = psp; - - InitPropSheetPage(&psp[0], IDD_TASKBARPROP_TASKBAR, TaskbarPageProc, (LPARAM)&propInfo); - InitPropSheetPage(&psp[1], IDD_TASKBARPROP_STARTMENU, StartMenuPageProc, (LPARAM)&propInfo); + psh.phpage = hpsp; PropertySheet(&psh); } diff --git a/base/shell/explorer/traywnd.cpp b/base/shell/explorer/traywnd.cpp index f703955a30fc9..fefd0f06237f4 100644 --- a/base/shell/explorer/traywnd.cpp +++ b/base/shell/explorer/traywnd.cpp @@ -237,12 +237,6 @@ class CTrayWindow : DWORD Flags; struct { - DWORD AutoHide : 1; - DWORD AlwaysOnTop : 1; - DWORD SmSmallIcons : 1; - DWORD HideClock : 1; - DWORD Locked : 1; - /* UI Status */ DWORD InSizeMove : 1; DWORD IsDragging : 1; @@ -411,7 +405,7 @@ class CTrayWindow : m_TrayPropertiesOwner = hwnd; - DisplayTrayProperties(hwnd); + DisplayTrayProperties(hwnd, m_hWnd); m_TrayPropertiesOwner = NULL; ::DestroyWindow(hwnd); @@ -494,7 +488,7 @@ class CTrayWindow : case ID_LOCKTASKBAR: if (SHRestricted(REST_CLASSICSHELL) == 0) { - Lock(!Locked); + Lock(!g_TaskbarSettings.bLock); } break; @@ -1192,7 +1186,7 @@ class CTrayWindow : without user interaction. */ rcTray = m_TrayRects[m_Position]; - if (AutoHide) + if (g_TaskbarSettings.sr.AutoHide) { rcTray.left += m_AutoHideOffset.cx; rcTray.right += m_AutoHideOffset.cx; @@ -1273,7 +1267,7 @@ class CTrayWindow : /* If AutoHide is false then change the workarea to exclude the area that the taskbar covers. */ - if (!AutoHide) + if (!g_TaskbarSettings.sr.AutoHide) { switch (m_Position) { @@ -1324,23 +1318,11 @@ class CTrayWindow : ApplyClipping(TRUE); } - typedef struct _TW_STUCKRECTS2 - { - DWORD cbSize; - LONG Unknown; - DWORD dwFlags; - DWORD Position; - SIZE Size; - RECT Rect; - } TW_STRUCKRECTS2, *PTW_STUCKRECTS2; - VOID RegLoadSettings() { DWORD Pos; - TW_STRUCKRECTS2 sr; RECT rcScreen; SIZE WndSize, EdgeSize, DlgFrameSize; - DWORD cbSize = sizeof(sr); SIZE StartBtnSize = m_StartButton.GetSize(); EdgeSize.cx = GetSystemMetrics(SM_CXEDGE); @@ -1348,44 +1330,12 @@ class CTrayWindow : DlgFrameSize.cx = GetSystemMetrics(SM_CXDLGFRAME); DlgFrameSize.cy = GetSystemMetrics(SM_CYDLGFRAME); - if (SHGetValue(hkExplorer, - TEXT("StuckRects2"), - TEXT("Settings"), - NULL, - &sr, - &cbSize) == ERROR_SUCCESS && - sr.cbSize == sizeof(sr)) - { - AutoHide = (sr.dwFlags & ABS_AUTOHIDE) != 0; - AlwaysOnTop = (sr.dwFlags & ABS_ALWAYSONTOP) != 0; - SmSmallIcons = (sr.dwFlags & 0x4) != 0; - HideClock = (sr.dwFlags & 0x8) != 0; - - /* FIXME: Are there more flags? */ + m_Position = g_TaskbarSettings.sr.Position; + rcScreen = g_TaskbarSettings.sr.Rect; + GetScreenRectFromRect(&rcScreen, MONITOR_DEFAULTTONEAREST); -#if WIN7_DEBUG_MODE - m_Position = ABE_LEFT; -#else - if (sr.Position > ABE_BOTTOM) - m_Position = ABE_BOTTOM; - else - m_Position = sr.Position; -#endif - - /* Try to find out which monitor the tray window was located on last. - Here we're only interested in the monitor screen that we think - is the last one used. We're going to determine on which monitor - we really are after calculating the docked position. */ - rcScreen = sr.Rect; - GetScreenRectFromRect( - &rcScreen, - MONITOR_DEFAULTTONEAREST); - } - else + if (!g_TaskbarSettings.sr.Size.cx || !g_TaskbarSettings.sr.Size.cy) { - m_Position = ABE_BOTTOM; - AlwaysOnTop = TRUE; - /* Use the minimum size of the taskbar, we'll use the start button as a minimum for now. Make sure we calculate the entire window size, not just the client size. However, we @@ -1393,36 +1343,17 @@ class CTrayWindow : the start button and bands are not stuck to the screen border. */ if(!m_Theme) { - sr.Size.cx = StartBtnSize.cx + (2 * (EdgeSize.cx + DlgFrameSize.cx)); - sr.Size.cy = StartBtnSize.cy + (2 * (EdgeSize.cy + DlgFrameSize.cy)); + g_TaskbarSettings.sr.Size.cx = StartBtnSize.cx + (2 * (EdgeSize.cx + DlgFrameSize.cx)); + g_TaskbarSettings.sr.Size.cy = StartBtnSize.cy + (2 * (EdgeSize.cy + DlgFrameSize.cy)); } else { - sr.Size.cx = StartBtnSize.cx - EdgeSize.cx; - sr.Size.cy = StartBtnSize.cy - EdgeSize.cy; - if(!Locked) - sr.Size.cy += GetSystemMetrics(SM_CYSIZEFRAME); + g_TaskbarSettings.sr.Size.cx = StartBtnSize.cx - EdgeSize.cx; + g_TaskbarSettings.sr.Size.cy = StartBtnSize.cy - EdgeSize.cy; + if(!g_TaskbarSettings.bLock) + g_TaskbarSettings.sr.Size.cy += GetSystemMetrics(SM_CYSIZEFRAME); } - - /* Use the primary screen by default */ - rcScreen.left = 0; - rcScreen.top = 0; - rcScreen.right = GetSystemMetrics(SM_CXSCREEN); - rcScreen.bottom = GetSystemMetrics(SM_CYSCREEN); - GetScreenRectFromRect( - &rcScreen, - MONITOR_DEFAULTTOPRIMARY); } - - if (m_hWnd != NULL) - SetWindowPos( - AlwaysOnTop ? HWND_TOPMOST : HWND_NOTOPMOST, - 0, - 0, - 0, - 0, - SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); - /* Determine a minimum tray window rectangle. The "client" height is zero here since we cannot determine an optimal minimum width when loaded as a vertical tray window. We just need to make sure the values @@ -1440,10 +1371,10 @@ class CTrayWindow : WndSize.cy = StartBtnSize.cy - EdgeSize.cx; } - if (WndSize.cx < sr.Size.cx) - WndSize.cx = sr.Size.cx; - if (WndSize.cy < sr.Size.cy) - WndSize.cy = sr.Size.cy; + if (WndSize.cx < g_TaskbarSettings.sr.Size.cx) + WndSize.cx = g_TaskbarSettings.sr.Size.cx; + if (WndSize.cy < g_TaskbarSettings.sr.Size.cy) + WndSize.cy = g_TaskbarSettings.sr.Size.cy; /* Save the calculated size */ m_TraySize = WndSize; @@ -1940,7 +1871,7 @@ class CTrayWindow : } DWORD dwExStyle = WS_EX_TOOLWINDOW | WS_EX_WINDOWEDGE; - if (AlwaysOnTop) + if (g_TaskbarSettings.sr.AlwaysOnTop) dwExStyle |= WS_EX_TOPMOST; DWORD dwStyle = WS_POPUP | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN; @@ -1996,18 +1927,18 @@ class CTrayWindow : BOOL STDMETHODCALLTYPE Lock(IN BOOL bLock) { - BOOL bPrevLock = Locked; + BOOL bPrevLock = g_TaskbarSettings.bLock; - if (Locked != bLock) + if (g_TaskbarSettings.bLock != bLock) { - Locked = bLock; + g_TaskbarSettings.bLock = bLock; if (m_TrayBandSite != NULL) { if (!SUCCEEDED(m_TrayBandSite->Lock(bLock))) { /* Reset?? */ - Locked = bPrevLock; + g_TaskbarSettings.bLock = bPrevLock; return bPrevLock; } } @@ -2020,7 +1951,7 @@ class CTrayWindow : RECT rcGripper = {0}; AdjustSizerRect(&rcGripper, Pos); - if(Locked) + if(g_TaskbarSettings.bLock) { m_TrayRects[Pos].top += rcGripper.top; m_TrayRects[Pos].left += rcGripper.left; @@ -2130,13 +2061,13 @@ class CTrayWindow : SetWindowTheme(m_Rebar, L"TaskBar", NULL); /* Create the tray notification window */ - m_TrayNotify = CreateTrayNotifyWnd(this, HideClock, &m_TrayNotifyInstance); + m_TrayNotify = CreateTrayNotifyWnd(this, &m_TrayNotifyInstance); UpdateFonts(); InitShellServices(&m_ShellServices); - if (AutoHide) + if (g_TaskbarSettings.sr.AutoHide) { m_AutoHideState = AUTOHIDE_HIDING; SetTimer(TIMER_ID_AUTOHIDE, AUTOHIDE_DELAY_HIDE, NULL); @@ -2248,7 +2179,7 @@ class CTrayWindow : RECT rcClient; POINT pt; - if (Locked) + if (g_TaskbarSettings.bLock) { /* The user may not be able to resize the tray window. Pretend like the window is not sizeable when the user @@ -2307,7 +2238,7 @@ class CTrayWindow : need to be able to move the window in case the user wants to drag the tray window to another position or in case the user wants to resize the tray window. */ - if (!Locked && GetCursorPos(&ptCursor)) + if (!g_TaskbarSettings.bLock && GetCursorPos(&ptCursor)) { IsDragging = TRUE; m_DraggingPosition = GetDraggingRectFromPt(ptCursor, pRect, &m_DraggingMonitor); @@ -2323,7 +2254,7 @@ class CTrayWindow : { PRECT pRect = (PRECT) lParam; - if (!Locked) + if (!g_TaskbarSettings.bLock) { FitToRebar(pRect); } @@ -2370,7 +2301,7 @@ class CTrayWindow : { InSizeMove = TRUE; IsDragging = FALSE; - if (!Locked) + if (!g_TaskbarSettings.bLock) { /* Remove the clipping on multi monitor systems while dragging around */ ApplyClipping(FALSE); @@ -2381,7 +2312,7 @@ class CTrayWindow : LRESULT OnExitSizeMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { InSizeMove = FALSE; - if (!Locked) + if (!g_TaskbarSettings.bLock) { FitToRebar(&m_TrayRects[m_Position]); @@ -2714,7 +2645,7 @@ class CTrayWindow : LRESULT OnMouseMove(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - if (AutoHide) + if (g_TaskbarSettings.sr.AutoHide) { SetTimer(TIMER_ID_MOUSETRACK, MOUSETRACK_INTERVAL, NULL); } @@ -2741,7 +2672,7 @@ class CTrayWindow : { RECT *rc = NULL; /* Ignore WM_NCCALCSIZE if we are not themed or locked */ - if(!m_Theme || Locked) + if(!m_Theme || g_TaskbarSettings.bLock) { bHandled = FALSE; return 0; @@ -2817,6 +2748,41 @@ class CTrayWindow : return 0; } + LRESULT OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) + { + TaskbarSettings* newSettings = (TaskbarSettings*)lParam; + + /* Propagate the new settings to the children */ + ::SendMessageW(m_TaskSwitch, uMsg, wParam, lParam); + ::SendMessageW(m_TrayNotify, uMsg, wParam, lParam); + + /* Toggle autohide */ + if (newSettings->sr.AutoHide != g_TaskbarSettings.sr.AutoHide) + { + g_TaskbarSettings.sr.AutoHide = newSettings->sr.AutoHide; + memset(&m_AutoHideOffset, 0, sizeof(m_AutoHideOffset)); + m_AutoHideState = AUTOHIDE_SHOWN; + if (!newSettings->sr.AutoHide) + SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER); + else + SetTimer(TIMER_ID_MOUSETRACK, MOUSETRACK_INTERVAL, NULL); + } + + /* Toggle lock state */ + Lock(newSettings->bLock); + + /* Toggle OnTop state */ + if (newSettings->sr.AlwaysOnTop != g_TaskbarSettings.sr.AlwaysOnTop) + { + g_TaskbarSettings.sr.AlwaysOnTop = newSettings->sr.AlwaysOnTop; + HWND hWndInsertAfter = newSettings->sr.AlwaysOnTop ? HWND_TOPMOST : HWND_BOTTOM; + SetWindowPos(hWndInsertAfter, 0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW); + } + + g_TaskbarSettings.Save(); + return 0; + } + DECLARE_WND_CLASS_EX(szTrayWndClass, CS_DBLCLKS, COLOR_3DFACE) BEGIN_MSG_MAP(CTrayWindow) @@ -2872,6 +2838,7 @@ class CTrayWindow : MESSAGE_HANDLER(WM_CLOSE, OnDoExitWindows) MESSAGE_HANDLER(WM_HOTKEY, OnHotkey) MESSAGE_HANDLER(WM_NCCALCSIZE, OnNcCalcSize) + MESSAGE_HANDLER(TWM_SETTINGSCHANGED, OnTaskbarSettingsChanged) ALT_MSG_MAP(1) END_MSG_MAP() @@ -3032,7 +2999,7 @@ class CTrayWindowCtxMenu : CheckMenuItem(hPopup, ID_LOCKTASKBAR, - MF_BYCOMMAND | (TrayWnd->Locked ? MF_CHECKED : MF_UNCHECKED)); + MF_BYCOMMAND | (g_TaskbarSettings.bLock ? MF_CHECKED : MF_UNCHECKED)); UINT idCmdNext; idCmdNext = Shell_MergeMenus(hPopup, menubase, indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS | MM_ADDSEPARATOR);