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