[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 */
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)

View file

@ -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);

View file

@ -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);
}

View file

@ -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;
}

View file

@ -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);