[EXPLORER_NEW]
[reactos.git] / base / shell / explorer-new / taskswnd.c
index 5b1abb7..fe3f896 100644 (file)
@@ -142,13 +142,13 @@ TaskSwitchWnd_DumpTasks(IN OUT PTASK_SWITCH_WND This)
     PTASK_GROUP CurrentGroup;
     PTASK_ITEM CurrentTaskItem, LastTaskItem;
 
-    DbgPrint("Tasks dump:\n");
+    TRACE("Tasks dump:\n");
     if (This->IsGroupingEnabled)
     {
         CurrentGroup = This->TaskGroups;
         while (CurrentGroup != NULL)
         {
-            DbgPrint("- Group PID: 0x%p Tasks: %d Index: %d\n", CurrentGroup->dwProcessId, CurrentGroup->dwTaskCount, CurrentGroup->Index);
+            TRACE("- Group PID: 0x%p Tasks: %d Index: %d\n", CurrentGroup->dwProcessId, CurrentGroup->dwTaskCount, CurrentGroup->Index);
 
             CurrentTaskItem = This->TaskItems;
             LastTaskItem = CurrentTaskItem + This->TaskItemCount;
@@ -156,7 +156,7 @@ TaskSwitchWnd_DumpTasks(IN OUT PTASK_SWITCH_WND This)
             {
                 if (CurrentTaskItem->Group == CurrentGroup)
                 {
-                    DbgPrint("  + Task hwnd: 0x%p Index: %d\n", CurrentTaskItem->hWnd, CurrentTaskItem->Index);
+                    TRACE("  + Task hwnd: 0x%p Index: %d\n", CurrentTaskItem->hWnd, CurrentTaskItem->Index);
                 }
                 CurrentTaskItem++;
             }
@@ -170,7 +170,7 @@ TaskSwitchWnd_DumpTasks(IN OUT PTASK_SWITCH_WND This)
         {
             if (CurrentTaskItem->Group == NULL)
             {
-                DbgPrint("- Task hwnd: 0x%p Index: %d\n", CurrentTaskItem->hWnd, CurrentTaskItem->Index);
+                TRACE("- Task hwnd: 0x%p Index: %d\n", CurrentTaskItem->hWnd, CurrentTaskItem->Index);
             }
             CurrentTaskItem++;
         }
@@ -181,7 +181,7 @@ TaskSwitchWnd_DumpTasks(IN OUT PTASK_SWITCH_WND This)
         LastTaskItem = CurrentTaskItem + This->TaskItemCount;
         while (CurrentTaskItem != LastTaskItem)
         {
-            DbgPrint("- Task hwnd: 0x%p Index: %d\n", CurrentTaskItem->hWnd, CurrentTaskItem->Index);
+            TRACE("- Task hwnd: 0x%p Index: %d\n", CurrentTaskItem->hWnd, CurrentTaskItem->Index);
             CurrentTaskItem++;
         }
     }
@@ -445,7 +445,7 @@ TaskSwitchWnd_UpdateTaskItemButton(IN OUT PTASK_SWITCH_WND This,
         return -1;
     }
 
-    DbgPrint("Updated button %d for hwnd 0x%p\n", TaskItem->Index, TaskItem->hWnd);
+    TRACE("Updated button %d for hwnd 0x%p\n", TaskItem->Index, TaskItem->hWnd);
     return TaskItem->Index;
 }
 
@@ -620,7 +620,7 @@ TaskSwitchWnd_AddTaskItemButton(IN OUT PTASK_SWITCH_WND This,
         TaskSwitchWnd_UpdateIndexesAfterButtonInserted(This,
                                                        iIndex);
 
-        DbgPrint("Added button %d for hwnd 0x%p\n", iIndex, TaskItem->hWnd);
+        TRACE("Added button %d for hwnd 0x%p\n", iIndex, TaskItem->hWnd);
 
         TaskItem->Index = iIndex;
         This->ToolbarBtnCount++;
@@ -688,7 +688,7 @@ TaskSwitchWnd_AddToTaskGroup(IN OUT PTASK_SWITCH_WND This,
     if (!GetWindowThreadProcessId(hWnd,
                                   &dwProcessId))
     {
-        DbgPrint("Cannot get process id of hwnd 0x%p\n", hWnd);
+        TRACE("Cannot get process id of hwnd 0x%p\n", hWnd);
         return NULL;
     }
 
@@ -934,10 +934,10 @@ static VOID
 TaskSwitchWnd_CheckActivateTaskItem(IN OUT PTASK_SWITCH_WND This,
                                     IN OUT PTASK_ITEM TaskItem)
 {
-    PTASK_ITEM ActiveTaskItem;
+    PTASK_ITEM CurrentTaskItem;
     PTASK_GROUP TaskGroup = NULL;
 
-    ActiveTaskItem = This->ActiveTaskItem;
+    CurrentTaskItem = This->ActiveTaskItem;
 
     if (TaskItem != NULL)
         TaskGroup = TaskItem->Group;
@@ -950,20 +950,20 @@ TaskSwitchWnd_CheckActivateTaskItem(IN OUT PTASK_SWITCH_WND This,
         return;
     }
 
-    if (ActiveTaskItem != NULL)
+    if (CurrentTaskItem != NULL)
     {
-        PTASK_GROUP ActiveTaskGroup;
+        PTASK_GROUP CurrentTaskGroup;
 
-        if (ActiveTaskItem == TaskItem)
+        if (CurrentTaskItem == TaskItem)
             return;
 
-        ActiveTaskGroup = ActiveTaskItem->Group;
+        CurrentTaskGroup = CurrentTaskItem->Group;
 
         if (This->IsGroupingEnabled &&
-            ActiveTaskGroup != NULL &&
-            ActiveTaskGroup->IsCollapsed)
+            CurrentTaskGroup != NULL &&
+            CurrentTaskGroup->IsCollapsed)
         {
-            if (ActiveTaskGroup == TaskGroup)
+            if (CurrentTaskGroup == TaskGroup)
                 return;
 
             /* FIXME */
@@ -971,10 +971,9 @@ TaskSwitchWnd_CheckActivateTaskItem(IN OUT PTASK_SWITCH_WND This,
         else
         {
             This->ActiveTaskItem = NULL;
-            if (ActiveTaskItem->Index >= 0)
+            if (CurrentTaskItem->Index >= 0)
             {
-                TaskSwitchWnd_UpdateTaskItemButton(This,
-                                                   ActiveTaskItem);
+                TaskSwitchWnd_UpdateTaskItemButton(This, CurrentTaskItem);
             }
         }
     }
@@ -983,8 +982,11 @@ TaskSwitchWnd_CheckActivateTaskItem(IN OUT PTASK_SWITCH_WND This,
 
     if (TaskItem != NULL && TaskItem->Index >= 0)
     {
-        TaskSwitchWnd_UpdateTaskItemButton(This,
-                                           TaskItem);
+        TaskSwitchWnd_UpdateTaskItemButton(This, TaskItem);
+    }
+    else if (TaskItem == NULL)
+    {
+        TRACE("Active TaskItem now NULL\n");
     }
 }
 
@@ -1031,11 +1033,14 @@ TaskSwitchWnd_AddTask(IN OUT PTASK_SWITCH_WND This,
 {
     PTASK_ITEM TaskItem;
 
+    if (!IsWindow(hWnd) || ITrayWindow_IsSpecialHWND(This->Tray, hWnd))
+        return FALSE;
+
     TaskItem = TaskSwitchWnd_FindTaskItem(This,
                                           hWnd);
     if (TaskItem == NULL)
     {
-        DbgPrint("Add window 0x%p\n", hWnd);
+        TRACE("Add window 0x%p\n", hWnd);
         TaskItem = TaskSwitchWnd_AllocTaskItem(This);
         if (TaskItem != NULL)
         {
@@ -1063,11 +1068,10 @@ TaskSwitchWnd_ActivateTaskItem(IN OUT PTASK_SWITCH_WND This,
 {
     if (TaskItem != NULL)
     {
-        DbgPrint("Activate window 0x%p on button %d\n", TaskItem->hWnd, TaskItem->Index);
+        TRACE("Activate window 0x%p on button %d\n", TaskItem->hWnd, TaskItem->Index);
     }
 
-    TaskSwitchWnd_CheckActivateTaskItem(This,
-                                        TaskItem);
+    TaskSwitchWnd_CheckActivateTaskItem(This, TaskItem);
 
     return FALSE;
 }
@@ -1078,6 +1082,11 @@ TaskSwitchWnd_ActivateTask(IN OUT PTASK_SWITCH_WND This,
 {
     PTASK_ITEM TaskItem;
 
+    if (!hWnd)
+    {
+        return TaskSwitchWnd_ActivateTaskItem(This, NULL);
+    }
+
     TaskItem = TaskSwitchWnd_FindTaskItem(This,
                                           hWnd);
     if (TaskItem == NULL)
@@ -1088,11 +1097,10 @@ TaskSwitchWnd_ActivateTask(IN OUT PTASK_SWITCH_WND This,
 
     if (TaskItem == NULL)
     {
-        DbgPrint("Activate window 0x%p, could not find task\n", hWnd);
+        TRACE("Activate window 0x%p, could not find task\n", hWnd);
     }
 
-    return TaskSwitchWnd_ActivateTaskItem(This,
-                                          TaskItem);
+    return TaskSwitchWnd_ActivateTaskItem(This, TaskItem);
 }
 
 static BOOL
@@ -1105,13 +1113,13 @@ TaskSwitchWnd_DeleteTask(IN OUT PTASK_SWITCH_WND This,
                                           hWnd);
     if (TaskItem != NULL)
     {
-        DbgPrint("Delete window 0x%p on button %d\n", hWnd, TaskItem->Index);
+        TRACE("Delete window 0x%p on button %d\n", hWnd, TaskItem->Index);
         TaskSwitchWnd_DeleteTaskItem(This,
                                      TaskItem);
         return TRUE;
     }
     //else
-        //DbgPrint("Failed to delete window 0x%p\n", hWnd);
+        //TRACE("Failed to delete window 0x%p\n", hWnd);
 
     return FALSE;
 }
@@ -1151,7 +1159,7 @@ TaskSwitchWnd_FlashTask(IN OUT PTASK_SWITCH_WND This,
                                           hWnd);
     if (TaskItem != NULL)
     {
-        DbgPrint("Flashing window 0x%p on button %d\n", hWnd, TaskItem->Index);
+        TRACE("Flashing window 0x%p on button %d\n", hWnd, TaskItem->Index);
         TaskSwitchWnd_FlashTaskItem(This,
                                     TaskItem);
         return TRUE;
@@ -1361,14 +1369,12 @@ TaskSwitchWnd_EnumWindowsProc(IN HWND hWnd,
     /* Only show windows that still exist and are visible and none of explorer's
        special windows (such as the desktop or the tray window) */
     if (IsWindow(hWnd) && IsWindowVisible(hWnd) &&
-        !ITrayWindow_IsSpecialHWND(This->Tray,
-                                   hWnd))
+        !ITrayWindow_IsSpecialHWND(This->Tray, hWnd))
     {
+        DWORD exStyle = GetWindowLong(hWnd, GWL_EXSTYLE);
         /* Don't list popup windows and also no tool windows */
-        if (GetWindow(hWnd,
-                      GW_OWNER) == NULL &&
-            !(GetWindowLong(hWnd,
-                            GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
+        if ((GetWindow(hWnd, GW_OWNER) == NULL || exStyle & WS_EX_APPWINDOW) &&
+            !(exStyle & WS_EX_TOOLWINDOW))
         {
             TaskSwitchWnd_AddTask(This,
                                   hWnd);
@@ -1379,7 +1385,7 @@ TaskSwitchWnd_EnumWindowsProc(IN HWND hWnd,
 }
 
 static LRESULT CALLBACK
-TaskSwichWnd_ToolbarSubclassedProc(IN HWND hWnd,
+TaskSwitchWnd_ToolbarSubclassedProc(IN HWND hWnd,
                                    IN UINT msg,
                                    IN WPARAM wParam,
                                    IN LPARAM lParam,
@@ -1437,9 +1443,8 @@ TaskSwitchWnd_Create(IN OUT PTASK_SWITCH_WND This)
                                        TOOLBARCLASSNAME,
                                        szRunningApps,
                                        WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN |
-                                           TBSTYLE_TOOLTIPS | TBSTYLE_WRAPABLE | TBSTYLE_LIST |
-                                           TBSTYLE_TRANSPARENT |
-                                           CCS_TOP | CCS_NORESIZE | CCS_NODIVIDER,
+                                       TBSTYLE_TOOLTIPS | TBSTYLE_WRAPABLE | TBSTYLE_LIST | TBSTYLE_TRANSPARENT |
+                                       CCS_TOP | CCS_NORESIZE | CCS_NODIVIDER,
                                        0,
                                        0,
                                        0,
@@ -1517,7 +1522,7 @@ TaskSwitchWnd_Create(IN OUT PTASK_SWITCH_WND This)
         /* Subclass the toolbar control because it doesn't provide a
            NM_NCHITTEST notification */
         This->IsToolbarSubclassed = SetWindowSubclass(This->hWndToolbar,
-                                                      TaskSwichWnd_ToolbarSubclassedProc,
+                                                      TaskSwitchWnd_ToolbarSubclassedProc,
                                                       TSW_TOOLBAR_SUBCLASS_ID,
                                                       (DWORD_PTR)This);
     }
@@ -1567,7 +1572,7 @@ TaskSwitchWnd_HandleAppCommand(IN OUT PTASK_SWITCH_WND This,
         case APPCOMMAND_BROWSER_HOME:
         case APPCOMMAND_LAUNCH_MAIL:
         default:
-            DbgPrint("Shell app command %d unhandled!\n", (INT)GET_APPCOMMAND_LPARAM(lParam));
+            TRACE("Shell app command %d unhandled!\n", (INT)GET_APPCOMMAND_LPARAM(lParam));
             break;
     }
 
@@ -1592,28 +1597,23 @@ TaskSwitchWnd_HandleShellHookMsg(IN OUT PTASK_SWITCH_WND This,
             break;
 
         case HSHELL_WINDOWCREATED:
-            TaskSwitchWnd_AddTask(This,
+            Ret = TaskSwitchWnd_AddTask(This,
                                   (HWND)lParam);
-            Ret = TRUE;
             break;
 
         case HSHELL_WINDOWDESTROYED:
             /* The window still exists! Delay destroying it a bit */
-            TaskSwitchWnd_DeleteTask(This,
-                                     (HWND)lParam);
+            TaskSwitchWnd_DeleteTask(This, (HWND)lParam);
             Ret = TRUE;
             break;
 
-        case HSHELL_ACTIVATESHELLWINDOW:
-            goto UnhandledShellMessage;
-
         case HSHELL_RUDEAPPACTIVATED:
-            goto UnhandledShellMessage;
-
         case HSHELL_WINDOWACTIVATED:
-            TaskSwitchWnd_ActivateTask(This,
-                                       (HWND)lParam);
-            Ret = TRUE;
+            if (lParam)
+            {
+                TaskSwitchWnd_ActivateTask(This, (HWND) lParam);
+                Ret = TRUE;
+            }
             break;
 
         case HSHELL_GETMINRECT:
@@ -1632,6 +1632,10 @@ TaskSwitchWnd_HandleShellHookMsg(IN OUT PTASK_SWITCH_WND This,
             break;
 
         case HSHELL_TASKMAN:
+            PostMessage(ITrayWindow_GetHWND(This->Tray), TWM_OPENSTARTMENU,0, 0);
+            break;
+
+        case HSHELL_ACTIVATESHELLWINDOW:
         case HSHELL_LANGUAGE:
         case HSHELL_SYSMENU:
         case HSHELL_ENDTASK:
@@ -1666,14 +1670,14 @@ UnhandledShellMessage:
             {
                 if (hshell_msg[i].msg == (INT)wParam)
                 {
-                    DbgPrint("Shell message %ws unhandled (lParam = 0x%p)!\n", hshell_msg[i].msg_name, lParam);
+                    TRACE("Shell message %ws unhandled (lParam = 0x%p)!\n", hshell_msg[i].msg_name, lParam);
                     found = 1;
                     break;
                 }
             }
             if (!found)
             {
-                DbgPrint("Shell message %d unhandled (lParam = 0x%p)!\n", (INT)wParam, lParam);
+                TRACE("Shell message %d unhandled (lParam = 0x%p)!\n", (INT)wParam, lParam);
             }
             break;
         }
@@ -1705,12 +1709,20 @@ TaskSwitchWnd_HandleTaskItemClick(IN OUT PTASK_SWITCH_WND This,
         bIsMinimized = IsIconic(TaskItem->hWnd);
         bIsActive = (TaskItem == This->ActiveTaskItem);
 
+        TRACE("Active TaskItem %p, selected TaskItem %p\n", This->ActiveTaskItem, TaskItem);
+        if (This->ActiveTaskItem)
+            TRACE("Active TaskItem hWnd=%p, TaskItem hWnd %p\n", This->ActiveTaskItem->hWnd, TaskItem->hWnd);
+
+        TRACE("Valid button clicked. HWND=%p, IsMinimized=%s, IsActive=%s...\n",
+            TaskItem->hWnd, bIsMinimized ? "Yes" : "No", bIsActive ? "Yes" : "No");
+
         if (!bIsMinimized && bIsActive)
         {
             PostMessage(TaskItem->hWnd,
                         WM_SYSCOMMAND,
                         SC_MINIMIZE,
                         0);
+            TRACE("Valid button clicked. App window Minimized.\n");
         }
         else
         {
@@ -1720,9 +1732,11 @@ TaskSwitchWnd_HandleTaskItemClick(IN OUT PTASK_SWITCH_WND This,
                              WM_SYSCOMMAND,
                              SC_RESTORE,
                              0);
+                 TRACE("Valid button clicked. App window Restored.\n");
             }
 
             SetForegroundWindow(TaskItem->hWnd);
+            TRACE("Valid button clicked. App window Activated.\n");
         }
     }
 }
@@ -1825,7 +1839,7 @@ TaskSwitchWnd_HandleButtonRightClick(IN OUT PTASK_SWITCH_WND This,
 
 
 static LRESULT
-TaskSwichWnd_HandleItemPaint(IN OUT PTASK_SWITCH_WND This,
+TaskSwitchWnd_HandleItemPaint(IN OUT PTASK_SWITCH_WND This,
                              IN OUT NMTBCUSTOMDRAW *nmtbcd)
 {
     LRESULT Ret = CDRF_DODEFAULT;
@@ -1887,7 +1901,7 @@ TaskSwitchWnd_HandleToolbarNotification(IN OUT PTASK_SWITCH_WND This,
             {
 
                 case CDDS_ITEMPREPAINT:
-                    Ret = TaskSwichWnd_HandleItemPaint(This,
+                    Ret = TaskSwitchWnd_HandleItemPaint(This,
                                                        nmtbcd);
                     break;
 
@@ -1927,8 +1941,7 @@ TaskSwitchWndProc(IN HWND hwnd,
 
     if (uMsg != WM_NCCREATE)
     {
-        This = (PTASK_SWITCH_WND)GetWindowLongPtr(hwnd,
-                                                  0);
+        This = (PTASK_SWITCH_WND)GetWindowLongPtr(hwnd, 0);
     }
 
     if (This != NULL || uMsg == WM_NCCREATE)
@@ -1939,8 +1952,10 @@ TaskSwitchWndProc(IN HWND hwnd,
                 TaskSwitchWnd_UpdateTheme(This);
                 break;
             case WM_ERASEBKGND:
-                TaskSwitchWnd_DrawBackground(hwnd, (HDC)wParam);
-                break;
+                if (!This->TaskBandTheme)
+                    break;
+                TaskSwitchWnd_DrawBackground(hwnd, (HDC) wParam);
+                return TRUE;
             case WM_SIZE:
             {
                 SIZE szClient;
@@ -1957,8 +1972,7 @@ TaskSwitchWndProc(IN HWND hwnd,
                                  szClient.cy,
                                  SWP_NOZORDER);
 
-                    TaskSwitchWnd_UpdateButtonsSize(This,
-                                                    FALSE);
+                    TaskSwitchWnd_UpdateButtonsSize(This, FALSE);
                 }
                 break;
             }
@@ -1967,21 +1981,17 @@ TaskSwitchWndProc(IN HWND hwnd,
             {
                 /* We want the tray window to be draggable everywhere, so make the control
                    appear transparent */
-                Ret = DefWindowProc(hwnd,
-                                    uMsg,
-                                    wParam,
-                                    lParam);
+                Ret = DefWindowProc(hwnd, uMsg, wParam, lParam);
                 if (Ret != HTVSCROLL && Ret != HTHSCROLL)
-                    Ret = HTTRANSPARENT;
-                break;
+                    return HTTRANSPARENT;
+                return Ret;
             }
 
             case WM_COMMAND:
             {
                 if (lParam != 0 && (HWND)lParam == This->hWndToolbar)
                 {
-                    TaskSwitchWnd_HandleButtonClick(This,
-                                                    LOWORD(wParam));
+                    TaskSwitchWnd_HandleButtonClick(This, LOWORD(wParam));
                 }
                 break;
             }
@@ -1992,10 +2002,9 @@ TaskSwitchWndProc(IN HWND hwnd,
 
                 if (nmh->hwndFrom == This->hWndToolbar)
                 {
-                    Ret = TaskSwitchWnd_HandleToolbarNotification(This,
-                                                                  nmh);
+                    return TaskSwitchWnd_HandleToolbarNotification(This, nmh);
                 }
-                break;
+                return 0;
             }
 
             case TSWM_ENABLEGROUPING:
@@ -2006,16 +2015,13 @@ TaskSwitchWndProc(IN HWND hwnd,
                     TaskSwitchWnd_EnableGrouping(This,
                                                  (BOOL)wParam);
                 }
-                break;
+                return Ret;
             }
 
             case TSWM_UPDATETASKBARPOS:
             {
                 /* Update the button spacing */
-                TaskSwitchWnd_UpdateTbButtonSpacing(This,
-                                                    ITrayWindow_IsHorizontal(This->Tray),
-                                                    0,
-                                                    0);
+                TaskSwitchWnd_UpdateTbButtonSpacing(This, ITrayWindow_IsHorizontal(This->Tray), 0, 0);
                 break;
             }
 
@@ -2029,19 +2035,12 @@ TaskSwitchWndProc(IN HWND hwnd,
                     pt.x = (LONG)LOWORD(lParam);
                     pt.y = (LONG)HIWORD(lParam);
 
-                    MapWindowPoints(NULL,
-                                    This->hWndToolbar,
-                                    &pt,
-                                    1);
+                    MapWindowPoints(NULL, This->hWndToolbar, &pt, 1);
 
-                    iBtn = (INT_PTR)SendMessage(This->hWndToolbar,
-                                                TB_HITTEST,
-                                                0,
-                                                (LPARAM)&pt);
+                    iBtn = (INT_PTR) SendMessage(This->hWndToolbar, TB_HITTEST, 0, (LPARAM) &pt);
                     if (iBtn >= 0)
                     {
-                        TaskSwitchWnd_HandleButtonRightClick(This,
-                                                    iBtn);
+                        TaskSwitchWnd_HandleButtonRightClick(This, iBtn);
                     }
                     else
                         goto ForwardContextMenuMsg;
@@ -2050,10 +2049,7 @@ TaskSwitchWndProc(IN HWND hwnd,
                 {
 ForwardContextMenuMsg:
                     /* Forward message */
-                    Ret = SendMessage(ITrayWindow_GetHWND(This->Tray),
-                                      uMsg,
-                                      wParam,
-                                      lParam);
+                    Ret = SendMessage(ITrayWindow_GetHWND(This->Tray), uMsg, wParam, lParam);
                 }
                 break;
             }
@@ -2082,10 +2078,7 @@ ForwardContextMenuMsg:
                 TaskSwitchWnd_Create(This);
 
 #if DUMP_TASKS != 0
-                SetTimer(hwnd,
-                         1,
-                         5000,
-                         NULL);
+                SetTimer(hwnd, 1, 5000, NULL);
 #endif
 
                 break;
@@ -2094,7 +2087,7 @@ ForwardContextMenuMsg:
                 if (This->IsToolbarSubclassed)
                 {
                     if (RemoveWindowSubclass(This->hWndToolbar,
-                                             TaskSwichWnd_ToolbarSubclassedProc,
+                                             TaskSwitchWnd_ToolbarSubclassedProc,
                                              TSW_TOOLBAR_SUBCLASS_ID))
                     {
                         This->IsToolbarSubclassed = FALSE;
@@ -2104,12 +2097,8 @@ ForwardContextMenuMsg:
 
             case WM_NCDESTROY:
                 TaskSwitchWnd_NCDestroy(This);
-                HeapFree(hProcessHeap,
-                         0,
-                         This);
-                SetWindowLongPtr(hwnd,
-                                 0,
-                                 0);
+                HeapFree(hProcessHeap, 0, This);
+                SetWindowLongPtr(hwnd, 0, 0);
                 break;
 
 #if DUMP_TASKS != 0
@@ -2123,33 +2112,37 @@ ForwardContextMenuMsg:
                 break;
 #endif
 
+            case WM_KLUDGEMINRECT:
+            {
+                PTASK_ITEM TaskItem = TaskSwitchWnd_FindTaskItem(This, (HWND)wParam);
+                if (TaskItem)
+                {
+                    RECT* prcMinRect = (RECT*)lParam;
+                    RECT rcItem, rcToolbar;
+                    SendMessageW(This->hWndToolbar,TB_GETITEMRECT, TaskItem->Index, (LPARAM)&rcItem);
+                    GetWindowRect(This->hWndToolbar, &rcToolbar);
+
+                    OffsetRect(&rcItem, rcToolbar.left, rcToolbar.top);
+
+                    *prcMinRect = rcItem;
+                    return TRUE;
+                }
+                return FALSE;
+            }
+
             default:
 /* HandleDefaultMessage: */
                 if (uMsg == This->ShellHookMsg && This->ShellHookMsg != 0)
                 {
                     /* Process shell messages */
-                    Ret = (LRESULT)TaskSwitchWnd_HandleShellHookMsg(This,
-                                                                    wParam,
-                                                                    lParam);
-                    break;
+                    return (LRESULT) TaskSwitchWnd_HandleShellHookMsg(This, wParam, lParam);
                 }
 
-                Ret = DefWindowProc(hwnd,
-                                    uMsg,
-                                    wParam,
-                                    lParam);
                 break;
         }
     }
-    else
-    {
-        Ret = DefWindowProc(hwnd,
-                            uMsg,
-                            wParam,
-                            lParam);
-    }
 
-    return Ret;
+    return DefWindowProc(hwnd, uMsg, wParam, lParam);
 }