Hook up "Hide on Minimize" & Add context menu to the tray icon.
diff --git a/programs/taskmgr/En.rc b/programs/taskmgr/En.rc
index 3be7174..476e321 100644
--- a/programs/taskmgr/En.rc
+++ b/programs/taskmgr/En.rc
@@ -129,10 +129,13 @@
IDR_TRAY_POPUP MENU DISCARDABLE
BEGIN
- MENUITEM "&Restore", ID_RESTORE
- MENUITEM "&Close", ID_FILE_EXIT
- MENUITEM SEPARATOR
- MENUITEM "&Always On Top", ID_OPTIONS_ALWAYSONTOP, CHECKED
+ POPUP "DUMMY"
+ BEGIN
+ MENUITEM "&Restore", ID_RESTORE
+ MENUITEM "&Close", ID_FILE_EXIT
+ MENUITEM SEPARATOR
+ MENUITEM "&Always On Top", ID_OPTIONS_ALWAYSONTOP
+ END
END
IDR_PROCESS_PAGE_CONTEXT MENU DISCARDABLE
diff --git a/programs/taskmgr/optnmenu.c b/programs/taskmgr/optnmenu.c
index bb0ec12..f1498fa 100644
--- a/programs/taskmgr/optnmenu.c
+++ b/programs/taskmgr/optnmenu.c
@@ -37,8 +37,6 @@
#include "taskmgr.h"
-#define OPTIONS_MENU_INDEX 1
-
void TaskManager_OnOptionsAlwaysOnTop(void)
{
HMENU hMenu;
@@ -51,7 +49,7 @@
* Check or uncheck the always on top menu item
* and update main window.
*/
- if (GetMenuState(hOptionsMenu, ID_OPTIONS_ALWAYSONTOP, MF_BYCOMMAND) & MF_CHECKED)
+ if ((GetWindowLong(hMainWnd, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0)
{
CheckMenuItem(hOptionsMenu, ID_OPTIONS_ALWAYSONTOP, MF_BYCOMMAND|MF_UNCHECKED);
TaskManagerSettings.AlwaysOnTop = FALSE;
diff --git a/programs/taskmgr/taskmgr.c b/programs/taskmgr/taskmgr.c
index 66674ec..c784d04 100644
--- a/programs/taskmgr/taskmgr.c
+++ b/programs/taskmgr/taskmgr.c
@@ -144,6 +144,9 @@
case ID_OPTIONS_SHOW16BITTASKS:
TaskManager_OnOptionsShow16BitTasks();
break;
+ case ID_RESTORE:
+ TaskManager_OnRestoreMainWindow();
+ break;
case ID_VIEW_LARGE:
ApplicationPage_OnViewLargeIcons();
break;
@@ -249,6 +252,48 @@
}
break;
+ case WM_ONTRAYICON:
+ switch(lParam)
+ {
+ case WM_RBUTTONDOWN:
+ {
+ POINT pt;
+ BOOL OnTop;
+ HMENU hMenu, hPopupMenu;
+
+ GetCursorPos(&pt);
+
+ OnTop = ((GetWindowLong(hMainWnd, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0);
+
+ hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_TRAY_POPUP));
+ hPopupMenu = GetSubMenu(hMenu, 0);
+
+ if(IsWindowVisible(hMainWnd))
+ {
+ DeleteMenu(hPopupMenu, ID_RESTORE, MF_BYCOMMAND);
+ }
+ else
+ {
+ SetMenuDefaultItem(hPopupMenu, ID_RESTORE, FALSE);
+ }
+
+ if(OnTop)
+ {
+ CheckMenuItem(hPopupMenu, ID_OPTIONS_ALWAYSONTOP, MF_BYCOMMAND | MF_CHECKED);
+ }
+
+ SetForegroundWindow(hMainWnd);
+ TrackPopupMenuEx(hPopupMenu, 0, pt.x, pt.y, hMainWnd, NULL);
+
+ DestroyMenu(hMenu);
+ break;
+ }
+ case WM_LBUTTONDBLCLK:
+ TaskManager_OnRestoreMainWindow();
+ break;
+ }
+ break;
+
case WM_NOTIFY:
idctrl = (int)wParam;
pnmh = (LPNMHDR)lParam;
@@ -613,7 +658,13 @@
RECT rc;
if (nType == SIZE_MINIMIZED)
+ {
+ if(TaskManagerSettings.HideWhenMinimized)
+ {
+ ShowWindow(hMainWnd, SW_HIDE);
+ }
return;
+ }
nXDifference = cx - nOldWidth;
nYDifference = cy - nOldHeight;
@@ -778,6 +829,20 @@
RegCloseKey(hKey);
}
+void TaskManager_OnRestoreMainWindow(void)
+{
+ HMENU hMenu, hOptionsMenu;
+ BOOL OnTop;
+
+ hMenu = GetMenu(hMainWnd);
+ hOptionsMenu = GetSubMenu(hMenu, OPTIONS_MENU_INDEX);
+ OnTop = ((GetWindowLong(hMainWnd, GWL_EXSTYLE) & WS_EX_TOPMOST) != 0);
+
+ OpenIcon(hMainWnd);
+ SetForegroundWindow(hMainWnd);
+ SetWindowPos(hMainWnd, (OnTop ? HWND_TOPMOST : HWND_TOP), 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_SHOWWINDOW);
+}
+
void TaskManager_OnEnterMenuLoop(HWND hWnd)
{
int nParts;
diff --git a/programs/taskmgr/taskmgr.h b/programs/taskmgr/taskmgr.h
index 8891d48..f9a80c7 100644
--- a/programs/taskmgr/taskmgr.h
+++ b/programs/taskmgr/taskmgr.h
@@ -153,6 +153,7 @@
void Font_DrawText(HDC hDC, LPCTSTR lpszText, int x, int y);
void LoadSettings(void);
void SaveSettings(void);
+void TaskManager_OnRestoreMainWindow(void);
void TaskManager_OnEnterMenuLoop(HWND hWnd);
void TaskManager_OnExitMenuLoop(HWND hWnd);
void TaskManager_OnMenuSelect(HWND hWnd, UINT nItemID, UINT nFlags, HMENU hSysMenu);
@@ -162,6 +163,9 @@
void TaskManager_OnViewUpdateSpeedPaused(void);
void TaskManager_OnViewRefresh(void);
void TaskManager_OnTabWndSelChange(void);
+
+#define OPTIONS_MENU_INDEX 1
+
void TaskManager_OnOptionsAlwaysOnTop(void);
void TaskManager_OnOptionsMinimizeOnUse(void);
void TaskManager_OnOptionsHideWhenMinimized(void);
@@ -186,6 +190,8 @@
void ProcessPage_OnSetPriorityLow(void);
void ProcessPage_OnDebugChannels(void);
+#define WM_ONTRAYICON WM_USER + 5
+
HICON TrayIcon_GetProcessorUsageIcon(void);
BOOL TrayIcon_ShellAddTrayIcon(void);
BOOL TrayIcon_ShellRemoveTrayIcon(void);
diff --git a/programs/taskmgr/trayicon.c b/programs/taskmgr/trayicon.c
index 6dbb504..372b478 100644
--- a/programs/taskmgr/trayicon.c
+++ b/programs/taskmgr/trayicon.c
@@ -155,7 +155,7 @@
nid.hWnd = hMainWnd;
nid.uID = 0;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
- /* nid.uCallbackMessage = ??; */
+ nid.uCallbackMessage = WM_ONTRAYICON;
nid.hIcon = hIcon;
wsprintf(nid.szTip, _T("CPU Usage: %d%%"), PerfDataGetProcessorUsage());
@@ -178,7 +178,7 @@
nid.hWnd = hMainWnd;
nid.uID = 0;
nid.uFlags = 0;
- /* nid.uCallbackMessage = ??; */
+ nid.uCallbackMessage = WM_ONTRAYICON;
bRetVal = Shell_NotifyIcon(NIM_DELETE, &nid);
@@ -199,7 +199,7 @@
nid.hWnd = hMainWnd;
nid.uID = 0;
nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;
- /* nid.uCallbackMessage = ??; */
+ nid.uCallbackMessage = WM_ONTRAYICON;
nid.hIcon = hIcon;
wsprintf(nid.szTip, _T("CPU Usage: %d%%"), PerfDataGetProcessorUsage());