diff --git a/base/shell/explorer/precomp.h b/base/shell/explorer/precomp.h index ecc36caa9c6..8a2dfd08811 100644 --- a/base/shell/explorer/precomp.h +++ b/base/shell/explorer/precomp.h @@ -184,6 +184,14 @@ TrayMessageLoop(IN OUT ITrayWindow *Tray); * settings.c */ +enum TrayIconsMode +{ + TIM_Default, + TIM_NeverCompact, + TIM_AlwaysCompact, + TIM_Max = TIM_AlwaysCompact +}; + typedef struct _TW_STUCKRECTS2 { DWORD cbSize; @@ -212,12 +220,24 @@ struct TaskbarSettings BOOL bPreferDate; BOOL bHideInactiveIcons; BOOL bSmallIcons; - BOOL bCompactTrayIcons; + TrayIconsMode eCompactTrayIcons; BOOL bShowDesktopButton; TW_STRUCKRECTS2 sr; BOOL Load(); BOOL Save(); + inline BOOL UseCompactTrayIcons() + { + switch (eCompactTrayIcons) + { + case TIM_NeverCompact: + return FALSE; + case TIM_AlwaysCompact: + return TRUE; + default: + return bSmallIcons; + } + } }; extern TaskbarSettings g_TaskbarSettings; diff --git a/base/shell/explorer/settings.cpp b/base/shell/explorer/settings.cpp index 62ac29b5b2f..f5932ef42cb 100644 --- a/base/shell/explorer/settings.cpp +++ b/base/shell/explorer/settings.cpp @@ -32,7 +32,6 @@ BOOL TaskbarSettings::Save() SHSetValueW(hkExplorer, L"Advanced", L"TaskbarSizeMove", REG_DWORD, &bAllowSizeMove, sizeof(bAllowSizeMove)); sr.cbSize = sizeof(sr); SHSetValueW(hkExplorer, L"Advanced", L"TaskbarSmallIcons", REG_DWORD, &bSmallIcons, sizeof(bSmallIcons)); - SHSetValueW(hkExplorer, L"Advanced", L"CompactTrayIcons", REG_DWORD, &bCompactTrayIcons, sizeof(bCompactTrayIcons)); SHSetValueW(hkExplorer, L"Advanced", L"TaskbarSd", REG_DWORD, &bShowDesktopButton, sizeof(bShowDesktopButton)); SHSetValueW(hkExplorer, L"StuckRects2", L"Settings", REG_BINARY, &sr, sizeof(sr)); @@ -64,7 +63,10 @@ BOOL TaskbarSettings::Load() bSmallIcons = (dwRet == ERROR_SUCCESS) ? (dwValue != 0) : TRUE; dwRet = SHGetValueW(hkExplorer, L"Advanced", L"CompactTrayIcons", NULL, &dwValue, &cbSize); - bCompactTrayIcons = (dwRet == ERROR_SUCCESS) ? (dwValue != 0) : bSmallIcons; + if (dwRet == ERROR_SUCCESS && dwValue <= TIM_Max) + eCompactTrayIcons = static_cast(dwValue); + else + eCompactTrayIcons = TIM_Default; dwRet = SHGetValueW(hkExplorer, L"Advanced", L"TaskbarSd", NULL, &dwValue, &cbSize); bShowDesktopButton = (dwRet == ERROR_SUCCESS) ? (dwValue != 0) : TRUE; diff --git a/base/shell/explorer/syspager.cpp b/base/shell/explorer/syspager.cpp index b039f189101..22063a18bc6 100644 --- a/base/shell/explorer/syspager.cpp +++ b/base/shell/explorer/syspager.cpp @@ -165,6 +165,7 @@ public: BOOL RemoveButton(IN CONST NOTIFYICONDATA *iconData); VOID ResizeImagelist(); bool SendNotifyCallback(InternalIconData* notifyItem, UINT uMsg); + void RefreshToolbarMetrics(BOOL bForceRefresh); private: LRESULT OnCtxMenu(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled); @@ -1250,24 +1251,34 @@ void CNotifyToolbar::Initialize(HWND hWndParent, CBalloonQueue * queue) m_ImageList = ImageList_Create(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON), ILC_COLOR32 | ILC_MASK, 0, 1000); SetImageList(m_ImageList); - TBMETRICS tbm = {sizeof(tbm)}; - tbm.dwMask = TBMF_BARPAD | TBMF_BUTTONSPACING | TBMF_PAD; - tbm.cxPad = 1; - tbm.cyPad = 1; - if (!g_TaskbarSettings.bCompactTrayIcons) - { - tbm.cxPad = GetSystemMetrics(SM_CXSMICON) / 2; - tbm.cyPad = GetSystemMetrics(SM_CYSMICON) / 2; - } - tbm.cxBarPad = 1; - tbm.cyBarPad = 1; - tbm.cxButtonSpacing = 1; - tbm.cyButtonSpacing = 1; - SetMetrics(&tbm); + RefreshToolbarMetrics(TRUE); SetButtonSize(GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CYSMICON)); } +void CNotifyToolbar::RefreshToolbarMetrics(BOOL bForceRefresh = FALSE) +{ + // Toolbar metrics only needs to be refreshed for the automatic setting and first launch + if (g_TaskbarSettings.eCompactTrayIcons == TrayIconsMode::TIM_Default || + bForceRefresh) + { + TBMETRICS tbm = {sizeof(tbm)}; + tbm.dwMask = TBMF_BARPAD | TBMF_BUTTONSPACING | TBMF_PAD; + tbm.cxPad = 1; + tbm.cyPad = 1; + if (!g_TaskbarSettings.UseCompactTrayIcons()) + { + tbm.cxPad = GetSystemMetrics(SM_CXSMICON) / 2; + tbm.cyPad = GetSystemMetrics(SM_CYSMICON) / 2; + } + tbm.cxBarPad = 1; + tbm.cyBarPad = 1; + tbm.cxButtonSpacing = 1; + tbm.cyButtonSpacing = 1; + SetMetrics(&tbm); + } +} + /* * SysPagerWnd */ @@ -1404,7 +1415,7 @@ void CSysPagerWnd::GetSize(IN BOOL IsHorizontal, IN PSIZE size) INT columns = 0; INT cyButton = GetSystemMetrics(SM_CYSMICON) + 2; INT cxButton = GetSystemMetrics(SM_CXSMICON) + 2; - if (!g_TaskbarSettings.bCompactTrayIcons) + if (!g_TaskbarSettings.UseCompactTrayIcons()) { cyButton = MulDiv(GetSystemMetrics(SM_CYSMICON), 3, 2); cxButton = MulDiv(GetSystemMetrics(SM_CXSMICON), 3, 2); @@ -1413,7 +1424,7 @@ void CSysPagerWnd::GetSize(IN BOOL IsHorizontal, IN PSIZE size) if (IsHorizontal) { - if (!g_TaskbarSettings.bCompactTrayIcons) + if (!g_TaskbarSettings.UseCompactTrayIcons()) rows = max(size->cy / MulDiv(cyButton, 3, 2), 1); else rows = max(size->cy / cyButton, 1); @@ -1522,6 +1533,7 @@ LRESULT CSysPagerWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHan INT yOff = (szClient.cy - szBar.cy) / 2; Toolbar.SetWindowPos(NULL, xOff, yOff, szBar.cx, szBar.cy, SWP_NOZORDER); + Toolbar.RefreshToolbarMetrics(); } return Ret; } diff --git a/base/shell/explorer/trayclock.cpp b/base/shell/explorer/trayclock.cpp index f25c63dbe9c..4411d34d543 100644 --- a/base/shell/explorer/trayclock.cpp +++ b/base/shell/explorer/trayclock.cpp @@ -572,7 +572,7 @@ VOID CTrayClockWnd::PaintLine(IN HDC hDC, IN OUT RECT *rcClient, IN UINT LineNum return; INT HShift = ((IsHorizontal && (VisibleLines <= 1 || - g_TaskbarSettings.bCompactTrayIcons)) ? 0 : TRAY_CLOCK_WND_SPACING_X); + g_TaskbarSettings.UseCompactTrayIcons())) ? 0 : TRAY_CLOCK_WND_SPACING_X); TextOut(hDC, ((rcClient->right - LineSizes[szLinesIndex].cx) / 2) + HShift, @@ -684,7 +684,7 @@ LRESULT CTrayClockWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHa VisibleLines = GetMinimumSize(IsHorizontal, &szClient); CurrentSize = szClient; - InvalidateRect(NULL, TRUE); + UpdateWnd(); return TRUE; }