From 5b40f6f353d47bd3414399a64bf47e40dd28a8e0 Mon Sep 17 00:00:00 2001 From: "Carl J. Bialorucki" Date: Fri, 4 Aug 2023 05:20:19 -0600 Subject: [PATCH] [EXPLORER] Add support for Windows 7 style system tray icon spacing (#5489) When using large taskbar icon: - Increase the padding around system tray icons. - Push the clock text further to the right, increasing the left padding between the clock and notification icons. This matches Windows 7 shell behavior. - Correct the spacing for the clock area, in the case when bPreferDate is enabled, only two lines are visible, and the day of the week is shorter than the date. CORE-11698 --- base/shell/explorer/precomp.h | 1 + base/shell/explorer/settings.cpp | 4 ++++ base/shell/explorer/syspager.cpp | 15 ++++++++++++++- base/shell/explorer/trayclock.cpp | 9 ++++++++- 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/base/shell/explorer/precomp.h b/base/shell/explorer/precomp.h index 91770090ef5..a52e3704266 100644 --- a/base/shell/explorer/precomp.h +++ b/base/shell/explorer/precomp.h @@ -211,6 +211,7 @@ struct TaskbarSettings BOOL bPreferDate; BOOL bHideInactiveIcons; BOOL bSmallIcons; + BOOL bCompactTrayIcons; TW_STRUCKRECTS2 sr; BOOL Load(); diff --git a/base/shell/explorer/settings.cpp b/base/shell/explorer/settings.cpp index 4c6b3dd2633..0f3daeddea6 100644 --- a/base/shell/explorer/settings.cpp +++ b/base/shell/explorer/settings.cpp @@ -32,6 +32,7 @@ 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"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 */ @@ -61,6 +62,9 @@ BOOL TaskbarSettings::Load() dwRet = SHGetValueW(hkExplorer, L"Advanced", L"TaskbarSmallIcons", NULL, &dwValue, &cbSize); bSmallIcons = (dwRet == ERROR_SUCCESS) ? (dwValue != 0) : TRUE; + dwRet = SHGetValueW(hkExplorer, L"Advanced", L"CompactTrayIcons", NULL, &dwValue, &cbSize); + bCompactTrayIcons = (dwRet == ERROR_SUCCESS) ? (dwValue != 0) : bSmallIcons; + cbSize = sizeof(sr); dwRet = SHGetValueW(hkExplorer, L"StuckRects2", L"Settings", NULL, &sr, &cbSize); diff --git a/base/shell/explorer/syspager.cpp b/base/shell/explorer/syspager.cpp index 1bb2691b40f..35eb0faf75f 100644 --- a/base/shell/explorer/syspager.cpp +++ b/base/shell/explorer/syspager.cpp @@ -1252,6 +1252,11 @@ void CNotifyToolbar::Initialize(HWND hWndParent, CBalloonQueue * queue) 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; @@ -1397,11 +1402,19 @@ 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) + { + cyButton = MulDiv(GetSystemMetrics(SM_CYSMICON), 3, 2); + cxButton = MulDiv(GetSystemMetrics(SM_CXSMICON), 3, 2); + } int VisibleButtonCount = Toolbar.GetVisibleButtonCount(); if (IsHorizontal) { - rows = max(size->cy / cyButton, 1); + if (!g_TaskbarSettings.bCompactTrayIcons) + rows = max(size->cy / MulDiv(cyButton, 3, 2), 1); + else + rows = max(size->cy / cyButton, 1); columns = (VisibleButtonCount + rows - 1) / rows; } else diff --git a/base/shell/explorer/trayclock.cpp b/base/shell/explorer/trayclock.cpp index 39277e19a04..f25c63dbe9c 100644 --- a/base/shell/explorer/trayclock.cpp +++ b/base/shell/explorer/trayclock.cpp @@ -267,6 +267,10 @@ WORD CTrayClockWnd::GetMinimumSize(IN BOOL Horizontal, IN OUT PSIZE pSize) if (!LinesMeasured) return 0; + /* Prevents the date from being cut off when the day of the week is shorter than the date. */ + if (VisibleLines > 1 && g_TaskbarSettings.bPreferDate) + szMax.cx = LineSizes[CLOCKWND_FORMAT_DATE].cx; + for (i = 0; i < CLOCKWND_FORMAT_COUNT; i++) { if (LineSizes[i].cx != 0) @@ -567,8 +571,11 @@ VOID CTrayClockWnd::PaintLine(IN HDC hDC, IN OUT RECT *rcClient, IN UINT LineNum if (LineSizes[LineNumber].cx == 0) return; + INT HShift = ((IsHorizontal && (VisibleLines <= 1 || + g_TaskbarSettings.bCompactTrayIcons)) ? 0 : TRAY_CLOCK_WND_SPACING_X); + TextOut(hDC, - (rcClient->right - LineSizes[szLinesIndex].cx) / 2, + ((rcClient->right - LineSizes[szLinesIndex].cx) / 2) + HShift, rcClient->top + TRAY_CLOCK_WND_SPACING_Y, szLines[szLinesIndex], wcslen(szLines[szLinesIndex]));