[EXPLORER] Implement NoWinKeys and HideClock restrictions (#7926)

This commit is contained in:
Whindmar Saksit 2025-04-25 13:51:26 +02:00 committed by GitHub
parent 85afe48c3e
commit 8b6907f2a6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 59 additions and 33 deletions

View file

@ -367,6 +367,11 @@ CStartMenuSite_CreateInstance(IN OUT ITrayWindow *Tray, const IID & riid, PVOID
/* TrayClockWnd */ /* TrayClockWnd */
HRESULT CTrayClockWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv); HRESULT CTrayClockWnd_CreateInstance(HWND hwndParent, REFIID riid, void **ppv);
static inline BOOL GetHideClock()
{
return g_TaskbarSettings.sr.HideClock || SHRestricted(REST_HIDECLOCK);
}
/* TrayNotifyWnd */ /* TrayNotifyWnd */
#define TNWM_GETMINIMUMSIZE (WM_USER + 0x100) #define TNWM_GETMINIMUMSIZE (WM_USER + 0x100)
#define TNWM_CHANGETRAYPOS (WM_USER + 0x104) #define TNWM_CHANGETRAYPOS (WM_USER + 0x104)

View file

@ -666,7 +666,7 @@ LRESULT CTrayClockWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& b
m_tooltip.AddTool(&ti); m_tooltip.AddTool(&ti);
if (!g_TaskbarSettings.sr.HideClock) if (!GetHideClock())
{ {
ResetTime(); 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) LRESULT CTrayClockWnd::OnTaskbarSettingsChanged(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{ {
BOOL bRealign = FALSE; BOOL bRealign = FALSE;
BOOL bHideClock = GetHideClock();
TaskbarSettings* newSettings = (TaskbarSettings*)lParam; 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 != !IsWindowVisible())
}
}
if (newSettings->sr.HideClock != g_TaskbarSettings.sr.HideClock)
{ {
g_TaskbarSettings.sr.HideClock = newSettings->sr.HideClock; 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; bRealign = TRUE;
if (g_TaskbarSettings.sr.HideClock) if (bHideClock)
{ {
/* Disable all timers */ /* Disable all timers */
if (IsTimerEnabled) 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) if (newSettings->bPreferDate != g_TaskbarSettings.bPreferDate)
{ {
g_TaskbarSettings.bPreferDate = newSettings->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 /* Create the window. The tray window is going to move it to the correct
position and resize it as needed. */ position and resize it as needed. */
DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS; DWORD dwStyle = WS_CHILD | WS_CLIPSIBLINGS;
if (!g_TaskbarSettings.sr.HideClock) if (!GetHideClock())
dwStyle |= WS_VISIBLE; dwStyle |= WS_VISIBLE;
Create(hWndParent, 0, NULL, dwStyle); Create(hWndParent, 0, NULL, dwStyle);

View file

@ -139,8 +139,9 @@ public:
SIZE clockSize = { 0, 0 }; SIZE clockSize = { 0, 0 };
SIZE traySize = { 0, 0 }; SIZE traySize = { 0, 0 };
SIZE showDesktopSize = { 0, 0 }; SIZE showDesktopSize = { 0, 0 };
BOOL bHideClock = GetHideClock();
if (!g_TaskbarSettings.sr.HideClock) if (!bHideClock)
{ {
if (IsHorizontal) if (IsHorizontal)
{ {
@ -197,7 +198,7 @@ public:
{ {
pSize->cx = 2 * TRAY_NOTIFY_WND_SPACING_X; pSize->cx = 2 * TRAY_NOTIFY_WND_SPACING_X;
if (!g_TaskbarSettings.sr.HideClock) if (!bHideClock)
pSize->cx += TRAY_NOTIFY_WND_SPACING_X + trayClockMinSize.cx; pSize->cx += TRAY_NOTIFY_WND_SPACING_X + trayClockMinSize.cx;
if (g_TaskbarSettings.bShowDesktopButton) if (g_TaskbarSettings.bShowDesktopButton)
@ -210,7 +211,7 @@ public:
{ {
pSize->cy = 2 * TRAY_NOTIFY_WND_SPACING_Y; pSize->cy = 2 * TRAY_NOTIFY_WND_SPACING_Y;
if (!g_TaskbarSettings.sr.HideClock) if (!bHideClock)
pSize->cy += TRAY_NOTIFY_WND_SPACING_Y + trayClockMinSize.cy; pSize->cy += TRAY_NOTIFY_WND_SPACING_Y + trayClockMinSize.cy;
if (g_TaskbarSettings.bShowDesktopButton) if (g_TaskbarSettings.bShowDesktopButton)
@ -303,7 +304,7 @@ public:
swpFlags); swpFlags);
} }
if (!g_TaskbarSettings.sr.HideClock) if (!GetHideClock())
{ {
POINT ptClock = { rcClient.left, rcClient.top }; POINT ptClock = { rcClient.left, rcClient.top };
SIZE clockSize = { rcClient.right - rcClient.left, rcClient.bottom - rcClient.top }; SIZE clockSize = { rcClient.right - rcClient.left, rcClient.bottom - rcClient.top };
@ -482,6 +483,8 @@ public:
SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh); SendMessage(WM_NOTIFY, 0, (LPARAM) &nmh);
} }
g_TaskbarSettings.bHideInactiveIcons = newSettings->bHideInactiveIcons;
return OnClockMessage(uMsg, wParam, lParam, bHandled); return OnClockMessage(uMsg, wParam, lParam, bHandled);
} }

View file

@ -276,11 +276,16 @@ public:
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) 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_SECONDS, g_TaskbarSettings.bShowSeconds ? BST_CHECKED : BST_UNCHECKED);
CheckDlgButton(IDC_TASKBARPROP_HIDEICONS, g_TaskbarSettings.bHideInactiveIcons ? 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); 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(); _UpdateDialog();
return TRUE; return TRUE;
} }

View file

@ -2391,18 +2391,29 @@ ChangePos:
/* Set the initial lock state in the band site */ /* Set the initial lock state in the band site */
m_TrayBandSite->Lock(g_TaskbarSettings.bLock); m_TrayBandSite->Lock(g_TaskbarSettings.bLock);
RegisterHotKey(m_hWnd, IDHK_RUN, MOD_WIN, 'R'); static const UINT winkeys[] =
RegisterHotKey(m_hWnd, IDHK_MINIMIZE_ALL, MOD_WIN, 'M'); {
RegisterHotKey(m_hWnd, IDHK_RESTORE_ALL, MOD_WIN|MOD_SHIFT, 'M'); MAKELONG(IDHK_RUN, MAKEWORD('R', MOD_WIN)),
RegisterHotKey(m_hWnd, IDHK_HELP, MOD_WIN, VK_F1); MAKELONG(IDHK_MINIMIZE_ALL, MAKEWORD('M', MOD_WIN)),
RegisterHotKey(m_hWnd, IDHK_EXPLORE, MOD_WIN, 'E'); MAKELONG(IDHK_RESTORE_ALL, MAKEWORD('M', MOD_WIN|MOD_SHIFT)),
RegisterHotKey(m_hWnd, IDHK_FIND, MOD_WIN, 'F'); MAKELONG(IDHK_HELP, MAKEWORD(VK_F1, MOD_WIN)),
RegisterHotKey(m_hWnd, IDHK_FIND_COMPUTER, MOD_WIN|MOD_CONTROL, 'F'); MAKELONG(IDHK_EXPLORE, MAKEWORD('E', MOD_WIN)),
RegisterHotKey(m_hWnd, IDHK_NEXT_TASK, MOD_WIN, VK_TAB); MAKELONG(IDHK_FIND, MAKEWORD('F', MOD_WIN)),
RegisterHotKey(m_hWnd, IDHK_PREV_TASK, MOD_WIN|MOD_SHIFT, VK_TAB); MAKELONG(IDHK_FIND_COMPUTER, MAKEWORD('F', MOD_WIN|MOD_CONTROL)),
RegisterHotKey(m_hWnd, IDHK_SYS_PROPERTIES, MOD_WIN, VK_PAUSE); MAKELONG(IDHK_NEXT_TASK, MAKEWORD(VK_TAB, MOD_WIN)),
RegisterHotKey(m_hWnd, IDHK_DESKTOP, MOD_WIN, 'D'); MAKELONG(IDHK_PREV_TASK, MAKEWORD(VK_TAB, MOD_WIN|MOD_SHIFT)),
RegisterHotKey(m_hWnd, IDHK_PAGER, MOD_WIN, 'B'); 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; return TRUE;
} }
@ -2454,6 +2465,7 @@ ChangePos:
CheckTrayWndPosition(); CheckTrayWndPosition();
} }
// Note: We rely on CDesktopBrowser to get this message and call SHSettingsChanged
if (m_DesktopWnd) if (m_DesktopWnd)
::SendMessageW(m_DesktopWnd, uMsg, wParam, lParam); ::SendMessageW(m_DesktopWnd, uMsg, wParam, lParam);