From 8b6907f2a603cb790df10c115f22c7af3387ed7a Mon Sep 17 00:00:00 2001 From: Whindmar Saksit Date: Fri, 25 Apr 2025 13:51:26 +0200 Subject: [PATCH] [EXPLORER] Implement NoWinKeys and HideClock restrictions (#7926) --- base/shell/explorer/precomp.h | 5 +++++ base/shell/explorer/trayclock.cpp | 33 ++++++++++++++-------------- base/shell/explorer/trayntfy.cpp | 11 ++++++---- base/shell/explorer/trayprop.cpp | 7 +++++- base/shell/explorer/traywnd.cpp | 36 ++++++++++++++++++++----------- 5 files changed, 59 insertions(+), 33 deletions(-) diff --git a/base/shell/explorer/precomp.h b/base/shell/explorer/precomp.h index f90ec62f1a8..4b188400861 100644 --- a/base/shell/explorer/precomp.h +++ b/base/shell/explorer/precomp.h @@ -367,6 +367,11 @@ CStartMenuSite_CreateInstance(IN OUT ITrayWindow *Tray, const IID & riid, PVOID /* TrayClockWnd */ HRESULT CTrayClockWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv); +static inline BOOL GetHideClock() +{ + return g_TaskbarSettings.sr.HideClock || SHRestricted(REST_HIDECLOCK); +} + /* TrayNotifyWnd */ #define TNWM_GETMINIMUMSIZE (WM_USER + 0x100) #define TNWM_CHANGETRAYPOS (WM_USER + 0x104) diff --git a/base/shell/explorer/trayclock.cpp b/base/shell/explorer/trayclock.cpp index dd8224091ed..48ec1d4d543 100644 --- a/base/shell/explorer/trayclock.cpp +++ b/base/shell/explorer/trayclock.cpp @@ -666,7 +666,7 @@ LRESULT CTrayClockWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& b m_tooltip.AddTool(&ti); - if (!g_TaskbarSettings.sr.HideClock) + if (!GetHideClock()) { ResetTime(); } @@ -694,26 +694,17 @@ LRESULT CTrayClockWnd::OnSize(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHa LRESULT CTrayClockWnd::OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { BOOL bRealign = FALSE; - + BOOL bHideClock = GetHideClock(); TaskbarSettings* newSettings = (TaskbarSettings*)lParam; - if (newSettings->bShowSeconds != g_TaskbarSettings.bShowSeconds) - { - g_TaskbarSettings.bShowSeconds = newSettings->bShowSeconds; - if (!g_TaskbarSettings.sr.HideClock) - { - bRealign = TRUE; - ResetTime(); - } - } - - if (newSettings->sr.HideClock != g_TaskbarSettings.sr.HideClock) + if (newSettings->sr.HideClock != !IsWindowVisible()) { g_TaskbarSettings.sr.HideClock = newSettings->sr.HideClock; - ShowWindow(g_TaskbarSettings.sr.HideClock ? SW_HIDE : SW_SHOW); + bHideClock = GetHideClock(); + ShowWindow(bHideClock ? SW_HIDE : SW_SHOW); bRealign = TRUE; - if (g_TaskbarSettings.sr.HideClock) + if (bHideClock) { /* Disable all timers */ if (IsTimerEnabled) @@ -733,6 +724,16 @@ LRESULT CTrayClockWnd::OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM } } + if (newSettings->bShowSeconds != g_TaskbarSettings.bShowSeconds) + { + g_TaskbarSettings.bShowSeconds = newSettings->bShowSeconds; + if (!bHideClock) + { + bRealign = TRUE; + ResetTime(); + } + } + if (newSettings->bPreferDate != g_TaskbarSettings.bPreferDate) { g_TaskbarSettings.bPreferDate = newSettings->bPreferDate; @@ -766,7 +767,7 @@ HRESULT CTrayClockWnd::Initialize(IN HWND hWndParent) /* Create the window. The tray window is going to move it to the correct position and resize it as needed. */ DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS; - if (!g_TaskbarSettings.sr.HideClock) + if (!GetHideClock()) dwStyle |= WS_VISIBLE; Create(hWndParent, 0, NULL, dwStyle); diff --git a/base/shell/explorer/trayntfy.cpp b/base/shell/explorer/trayntfy.cpp index 1fad7c39cf9..d40ca6ea7fa 100644 --- a/base/shell/explorer/trayntfy.cpp +++ b/base/shell/explorer/trayntfy.cpp @@ -139,8 +139,9 @@ public: SIZE clockSize = { 0, 0 }; SIZE traySize = { 0, 0 }; SIZE showDesktopSize = { 0, 0 }; + BOOL bHideClock = GetHideClock(); - if (!g_TaskbarSettings.sr.HideClock) + if (!bHideClock) { if (IsHorizontal) { @@ -197,7 +198,7 @@ public: { pSize->cx = 2 * TRAY_NOTIFY_WND_SPACING_X; - if (!g_TaskbarSettings.sr.HideClock) + if (!bHideClock) pSize->cx += TRAY_NOTIFY_WND_SPACING_X + trayClockMinSize.cx; if (g_TaskbarSettings.bShowDesktopButton) @@ -210,7 +211,7 @@ public: { pSize->cy = 2 * TRAY_NOTIFY_WND_SPACING_Y; - if (!g_TaskbarSettings.sr.HideClock) + if (!bHideClock) pSize->cy += TRAY_NOTIFY_WND_SPACING_Y + trayClockMinSize.cy; if (g_TaskbarSettings.bShowDesktopButton) @@ -303,7 +304,7 @@ public: swpFlags); } - if (!g_TaskbarSettings.sr.HideClock) + if (!GetHideClock()) { POINT ptClock = { rcClient.left, rcClient.top }; SIZE clockSize = { rcClient.right - rcClient.left, rcClient.bottom - rcClient.top }; @@ -482,6 +483,8 @@ public: SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh); } + g_TaskbarSettings.bHideInactiveIcons = newSettings->bHideInactiveIcons; + return OnClockMessage(uMsg, wParam, lParam, bHandled); } diff --git a/base/shell/explorer/trayprop.cpp b/base/shell/explorer/trayprop.cpp index 875334bf340..0be047439d0 100644 --- a/base/shell/explorer/trayprop.cpp +++ b/base/shell/explorer/trayprop.cpp @@ -276,11 +276,16 @@ public: LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) { - CheckDlgButton(IDC_TASKBARPROP_CLOCK, (!g_TaskbarSettings.sr.HideClock) ? BST_CHECKED : BST_UNCHECKED); + ::EnableWindow(GetDlgItem(IDC_TASKBARPROP_CLOCK), !SHRestricted(REST_HIDECLOCK)); + CheckDlgButton(IDC_TASKBARPROP_CLOCK, (!GetHideClock()) ? 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); CheckDlgButton(IDC_TASKBARPROP_DESKTOP, g_TaskbarSettings.bShowDesktopButton ? BST_CHECKED : BST_UNCHECKED); + // TODO: bHideInactiveIcons is not implemented yet, just disable for now + CheckDlgButton(IDC_TASKBARPROP_HIDEICONS, BST_UNCHECKED); + ::EnableWindow(GetDlgItem(IDC_TASKBARPROP_HIDEICONS), FALSE); + _UpdateDialog(); return TRUE; } diff --git a/base/shell/explorer/traywnd.cpp b/base/shell/explorer/traywnd.cpp index d5695c7411c..dfccd130917 100644 --- a/base/shell/explorer/traywnd.cpp +++ b/base/shell/explorer/traywnd.cpp @@ -2391,18 +2391,29 @@ ChangePos: /* Set the initial lock state in the band site */ m_TrayBandSite->Lock(g_TaskbarSettings.bLock); - RegisterHotKey(m_hWnd, IDHK_RUN, MOD_WIN, 'R'); - RegisterHotKey(m_hWnd, IDHK_MINIMIZE_ALL, MOD_WIN, 'M'); - RegisterHotKey(m_hWnd, IDHK_RESTORE_ALL, MOD_WIN|MOD_SHIFT, 'M'); - RegisterHotKey(m_hWnd, IDHK_HELP, MOD_WIN, VK_F1); - RegisterHotKey(m_hWnd, IDHK_EXPLORE, MOD_WIN, 'E'); - RegisterHotKey(m_hWnd, IDHK_FIND, MOD_WIN, 'F'); - RegisterHotKey(m_hWnd, IDHK_FIND_COMPUTER, MOD_WIN|MOD_CONTROL, 'F'); - RegisterHotKey(m_hWnd, IDHK_NEXT_TASK, MOD_WIN, VK_TAB); - RegisterHotKey(m_hWnd, IDHK_PREV_TASK, MOD_WIN|MOD_SHIFT, VK_TAB); - RegisterHotKey(m_hWnd, IDHK_SYS_PROPERTIES, MOD_WIN, VK_PAUSE); - RegisterHotKey(m_hWnd, IDHK_DESKTOP, MOD_WIN, 'D'); - RegisterHotKey(m_hWnd, IDHK_PAGER, MOD_WIN, 'B'); + static const UINT winkeys[] = + { + MAKELONG(IDHK_RUN, MAKEWORD('R', MOD_WIN)), + MAKELONG(IDHK_MINIMIZE_ALL, MAKEWORD('M', MOD_WIN)), + MAKELONG(IDHK_RESTORE_ALL, MAKEWORD('M', MOD_WIN|MOD_SHIFT)), + MAKELONG(IDHK_HELP, MAKEWORD(VK_F1, MOD_WIN)), + MAKELONG(IDHK_EXPLORE, MAKEWORD('E', MOD_WIN)), + MAKELONG(IDHK_FIND, MAKEWORD('F', MOD_WIN)), + MAKELONG(IDHK_FIND_COMPUTER, MAKEWORD('F', MOD_WIN|MOD_CONTROL)), + MAKELONG(IDHK_NEXT_TASK, MAKEWORD(VK_TAB, MOD_WIN)), + MAKELONG(IDHK_PREV_TASK, MAKEWORD(VK_TAB, MOD_WIN|MOD_SHIFT)), + MAKELONG(IDHK_SYS_PROPERTIES, MAKEWORD(VK_PAUSE, MOD_WIN)), + MAKELONG(IDHK_DESKTOP, MAKEWORD('D', MOD_WIN)), + MAKELONG(IDHK_PAGER, MAKEWORD('B', MOD_WIN)), + }; + if (!SHRestricted(REST_NOWINKEYS)) + { + for (UINT i = 0; i < _countof(winkeys); ++i) + { + UINT mod = HIBYTE(HIWORD(winkeys[i])), key = LOBYTE(HIWORD(winkeys[i])); + RegisterHotKey(m_hWnd, LOWORD(winkeys[i]), mod, key); + } + } return TRUE; } @@ -2454,6 +2465,7 @@ ChangePos: CheckTrayWndPosition(); } + // Note: We rely on CDesktopBrowser to get this message and call SHSettingsChanged if (m_DesktopWnd) ::SendMessageW(m_DesktopWnd, uMsg, wParam, lParam);