Hook up "Hide on Minimize" & Add context menu to the tray icon.

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;