https://git.reactos.org/?p=reactos.git;a=commitdiff;h=cdba812252d807c8aa64bc...
commit cdba812252d807c8aa64bc586055c03e9c39ff5a Author: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org AuthorDate: Wed Aug 16 17:01:13 2023 +0200 Commit: Hermès Bélusca-Maïto hermes.belusca-maito@reactos.org CommitDate: Thu Aug 24 16:47:32 2023 +0200
[TASKMGR] Simplify status-bar display when menus are shown (#5578) CORE-19061
Following PR #5571 (commit 2d53e953c), it became apparent that the management of the status-bar when showing the menu hints could be simplified further.
Use "simple-text" status-bar display mode when showing menu hints. The original status-bar panes state is "remembered" and are automatically restored when the "simple-text" mode is disabled. --- base/applications/taskmgr/perfpage.c | 10 ++-- base/applications/taskmgr/taskmgr.c | 95 +++++++++++++++--------------------- base/applications/taskmgr/taskmgr.h | 2 - 3 files changed, 43 insertions(+), 64 deletions(-)
diff --git a/base/applications/taskmgr/perfpage.c b/base/applications/taskmgr/perfpage.c index 9e601041bd4..c9abb74cd15 100644 --- a/base/applications/taskmgr/perfpage.c +++ b/base/applications/taskmgr/perfpage.c @@ -8,8 +8,6 @@ #include "precomp.h" #include <shlwapi.h>
-extern BOOL bInMenuLoop; /* Tells us if we are in the menu loop - from taskmgr.c */ - TM_GRAPH_CONTROL PerformancePageCpuUsageHistoryGraph; TM_GRAPH_CONTROL PerformancePageMemUsageHistoryGraph;
@@ -328,6 +326,8 @@ DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter)
while (1) { + extern BOOL bTrackMenu; // From taskmgr.c + int nBarsUsed1; int nBarsUsed2;
@@ -361,7 +361,7 @@ DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter) szChargeLimitFormat, ARRAYSIZE(szChargeLimitFormat));
- if (!bInMenuLoop) + if (!bTrackMenu) { wsprintfW(Text, szMemUsage, szChargeTotalFormat, szChargeLimitFormat, (CommitChargeLimit ? ((CommitChargeTotal * 100) / CommitChargeLimit) : 0)); @@ -406,7 +406,7 @@ DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter) SetWindowTextW(hTotalsThreadCountEdit, Text); _ultow(TotalProcesses, Text, 10); SetWindowTextW(hTotalsProcessCountEdit, Text); - if (!bInMenuLoop) + if (!bTrackMenu) { wsprintfW(Text, szProcesses, TotalProcesses); SendMessageW(hStatusWnd, SB_SETTEXT, 0, (LPARAM)Text); @@ -424,7 +424,7 @@ DWORD WINAPI PerformancePageRefreshThread(PVOID Parameter) CpuUsage = PerfDataGetProcessorUsage(); CpuKernelUsage = PerfDataGetProcessorSystemUsage();
- if (!bInMenuLoop) + if (!bTrackMenu) { wsprintfW(Text, szCpuUsage, CpuUsage); SendMessageW(hStatusWnd, SB_SETTEXT, 1, (LPARAM)Text); diff --git a/base/applications/taskmgr/taskmgr.c b/base/applications/taskmgr/taskmgr.c index 6cbf8c7994e..bf24eef8b39 100644 --- a/base/applications/taskmgr/taskmgr.c +++ b/base/applications/taskmgr/taskmgr.c @@ -31,7 +31,7 @@ int nMinimumHeight; /* Minimum height of the dialog (OnSize()'s cy) int nOldWidth; /* Holds the previous client area width */ int nOldHeight; /* Holds the previous client area height */
-BOOL bInMenuLoop = FALSE; /* Tells us if we are in the menu loop */ +BOOL bTrackMenu = FALSE; /* Signals when we display menu hints */ BOOL bWasKeyboardInput = FALSE; /* TabChange by Keyboard or Mouse ? */
TASKMANAGER_SETTINGS TaskManagerSettings; @@ -482,24 +482,10 @@ TaskManagerWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) TrayIcon_UpdateIcon(); break;
- case WM_INITMENUPOPUP: - /* Do not disable the status bar if we opened the system menu */ - if (!HIWORD(lParam)) - TaskManager_DisableStatusBar(hDlg); - else - TaskManager_EnableStatusBar(hDlg); - break; - case WM_ENTERMENULOOP: - bInMenuLoop = TRUE; - break; - case WM_EXITMENULOOP: - bInMenuLoop = FALSE; - TaskManager_EnableStatusBar(hDlg); - break; case WM_MENUSELECT: - if (!(HIWORD(wParam) & MF_SYSMENU)) - TaskManager_OnMenuSelect(hDlg, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam); + TaskManager_OnMenuSelect(hDlg, LOWORD(wParam), HIWORD(wParam), (HMENU)lParam); break; + case WM_SYSCOLORCHANGE: /* Forward WM_SYSCOLORCHANGE to common controls */ SendMessage(hApplicationPageListCtrl, WM_SYSCOLORCHANGE, 0, 0); @@ -569,7 +555,7 @@ BOOL OnCreate(HWND hWnd) nParts[0] = STATUS_SIZE1; nParts[1] = STATUS_SIZE2; nParts[2] = STATUS_SIZE3; - SendMessageW(hStatusWnd, SB_SETPARTS, 3, (LPARAM) (LPINT) nParts); + SendMessageW(hStatusWnd, SB_SETPARTS, _countof(nParts), (LPARAM)(LPINT)nParts);
/* Create tab pages */ hTabWnd = GetDlgItem(hWnd, IDC_TAB); @@ -758,10 +744,8 @@ void OnSize( WPARAM nType, int cx, int cy )
if (nType == SIZE_MINIMIZED) { - if(TaskManagerSettings.HideWhenMinimized) - { - ShowWindow(hMainWnd, SW_HIDE); - } + if (TaskManagerSettings.HideWhenMinimized) + ShowWindow(hMainWnd, SW_HIDE); return; }
@@ -775,10 +759,10 @@ void OnSize( WPARAM nType, int cx, int cy ) SendMessageW(hStatusWnd, WM_SIZE, nType, MAKELPARAM(cx,rc.bottom - rc.top));
/* Update the status bar pane sizes */ - nParts[0] = bInMenuLoop ? -1 : STATUS_SIZE1; + nParts[0] = STATUS_SIZE1; nParts[1] = STATUS_SIZE2; nParts[2] = cx; - SendMessageW(hStatusWnd, SB_SETPARTS, bInMenuLoop ? 1 : 3, (LPARAM) (LPINT) nParts); + SendMessageW(hStatusWnd, SB_SETPARTS, _countof(nParts), (LPARAM)(LPINT)nParts);
/* Resize the tab control */ GetWindowRect(hTabWnd, &rc); @@ -896,46 +880,43 @@ void TaskManager_OnRestoreMainWindow(void) SetWindowPos(hMainWnd, (OnTop ? HWND_TOPMOST : HWND_TOP), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW); }
-void TaskManager_DisableStatusBar(HWND hWnd) -{ - int nParts; - - /* Update the status bar pane sizes */ - nParts = -1; - SendMessageW(hStatusWnd, SB_SETPARTS, 1, (LPARAM) (LPINT)&nParts); - SendMessageW(hStatusWnd, SB_SETTEXT, (WPARAM)0, (LPARAM)L""); -} - -void TaskManager_EnableStatusBar(HWND hWnd) +void TaskManager_OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu) { - RECT rc; - int nParts[3]; + WCHAR str[100] = L"";
- /* Update the status bar pane sizes */ - GetClientRect(hWnd, &rc); - nParts[0] = STATUS_SIZE1; - nParts[1] = STATUS_SIZE2; - nParts[2] = rc.right; - SendMessageW(hStatusWnd, SB_SETPARTS, 3, (LPARAM) (LPINT) nParts); + /* + * Reset the status bar if we close the current menu, or + * we open the system menu or hover above a menu separator. + * Adapted from comctl32!MenuHelp(). + */ + if ((LOWORD(nFlags) == 0xFFFF && hSysMenu == NULL) || + (nFlags & (MF_SEPARATOR | MF_SYSMENU))) + { + /* Set the status bar for multiple-parts output */ + SendMessageW(hStatusWnd, SB_SIMPLE, (WPARAM)FALSE, (LPARAM)0); + bTrackMenu = FALSE;
- /* trigger update of status bar columns and performance page asynchronously */ - RefreshPerformancePage(); -} + /* Trigger update of status bar columns and performance page asynchronously */ + RefreshPerformancePage(); + return; + }
-void TaskManager_OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu) -{ - WCHAR str[100]; - - wcscpy(str, L""); - if (LoadStringW(hInst, nItemID, str, 100)) { - /* load appropriate string */ - LPWSTR lpsz = str; - /* first newline terminates actual string */ - lpsz = wcschr(lpsz, '\n'); + /* Otherwise, retrieve the appropriate menu hint string */ + if (LoadStringW(hInst, nItemID, str, _countof(str))) + { + /* First newline terminates actual string */ + LPWSTR lpsz = wcschr(str, '\n'); if (lpsz != NULL) *lpsz = '\0'; } - SendMessageW(hStatusWnd, SB_SETTEXT, 0, (LPARAM)str); + + /* Set the status bar for single-part output, if needed... */ + if (!bTrackMenu) + SendMessageW(hStatusWnd, SB_SIMPLE, (WPARAM)TRUE, (LPARAM)0); + bTrackMenu = TRUE; + + /* ... and display the menu hint */ + SendMessageW(hStatusWnd, SB_SETTEXT, SB_SIMPLEID | SBT_NOBORDERS, (LPARAM)str); }
void TaskManager_OnViewUpdateSpeed(DWORD dwSpeed) diff --git a/base/applications/taskmgr/taskmgr.h b/base/applications/taskmgr/taskmgr.h index a3b6220e8b9..e65ef30221f 100644 --- a/base/applications/taskmgr/taskmgr.h +++ b/base/applications/taskmgr/taskmgr.h @@ -94,8 +94,6 @@ void FillSolidRect(HDC hDC, LPCRECT lpRect, COLORREF clr); void LoadSettings(void); void SaveSettings(void); void TaskManager_OnRestoreMainWindow(void); -void TaskManager_DisableStatusBar(HWND hWnd); -void TaskManager_EnableStatusBar(HWND hWnd); void TaskManager_OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu); void TaskManager_OnViewUpdateSpeed(DWORD); void TaskManager_OnTabWndSelChange(void);