6 * Copyright (C) 1999 - 2001 Brian Palmer <brianp@reactos.org>
7 * 2005 Klemens Friedl <frik85@reactos.at>
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
32 } APPLICATION_PAGE_LIST_ITEM
, *LPAPPLICATION_PAGE_LIST_ITEM
;
34 HWND hApplicationPage
; /* Application List Property Page */
35 HWND hApplicationPageListCtrl
; /* Application ListCtrl Window */
36 HWND hApplicationPageEndTaskButton
; /* Application End Task button */
37 HWND hApplicationPageSwitchToButton
; /* Application Switch To button */
38 HWND hApplicationPageNewTaskButton
; /* Application New Task button */
39 static int nApplicationPageWidth
;
40 static int nApplicationPageHeight
;
41 static HANDLE hApplicationPageEvent
= NULL
; /* When this event becomes signaled then we refresh the app list */
42 static BOOL bSortAscending
= TRUE
;
43 DWORD WINAPI
ApplicationPageRefreshThread(void *lpParameter
);
45 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
);
46 void AddOrUpdateHwnd(HWND hWnd
, WCHAR
*szTitle
, HICON hIcon
, BOOL bHung
);
47 void ApplicationPageUpdate(void);
48 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
);
49 void ApplicationPageShowContextMenu1(void);
50 void ApplicationPageShowContextMenu2(void);
51 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
);
52 int ProcGetIndexByProcessId(DWORD dwProcessId
);
55 void SwitchToThisWindow (
56 HWND hWnd
, /* Handle to the window that should be activated */
57 BOOL bRestore
/* Restore the window if it is minimized */
62 GetSystemColorDepth(VOID
)
67 pDevMode
.dmSize
= sizeof(DEVMODE
);
68 pDevMode
.dmDriverExtra
= 0;
70 if (!EnumDisplaySettings(NULL
, ENUM_CURRENT_SETTINGS
, &pDevMode
))
73 switch (pDevMode
.dmBitsPerPel
)
75 case 32: ColorDepth
= ILC_COLOR32
; break;
76 case 24: ColorDepth
= ILC_COLOR24
; break;
77 case 16: ColorDepth
= ILC_COLOR16
; break;
78 case 8: ColorDepth
= ILC_COLOR8
; break;
79 case 4: ColorDepth
= ILC_COLOR4
; break;
80 default: ColorDepth
= ILC_COLOR
; break;
87 ApplicationPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
95 HANDLE hRefreshThread
= NULL
;
100 /* Save the width and height */
101 GetClientRect(hDlg
, &rc
);
102 nApplicationPageWidth
= rc
.right
;
103 nApplicationPageHeight
= rc
.bottom
;
105 /* Update window position */
106 SetWindowPos(hDlg
, NULL
, 15, 30, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
108 /* Get handles to the controls */
109 hApplicationPageListCtrl
= GetDlgItem(hDlg
, IDC_APPLIST
);
110 hApplicationPageEndTaskButton
= GetDlgItem(hDlg
, IDC_ENDTASK
);
111 hApplicationPageSwitchToButton
= GetDlgItem(hDlg
, IDC_SWITCHTO
);
112 hApplicationPageNewTaskButton
= GetDlgItem(hDlg
, IDC_NEWTASK
);
114 SetWindowTextW(hApplicationPageListCtrl
, L
"Tasks");
116 /* Initialize the application page's controls */
117 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
119 LoadStringW(hInst
, IDS_TAB_TASK
, szTemp
, 256);
120 column
.pszText
= szTemp
;
122 (void)ListView_InsertColumn(hApplicationPageListCtrl
, 0, &column
); /* Add the "Task" column */
123 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
124 LoadStringW(hInst
, IDS_TAB_STATUS
, szTemp
, 256);
125 column
.pszText
= szTemp
;
127 (void)ListView_InsertColumn(hApplicationPageListCtrl
, 1, &column
); /* Add the "Status" column */
129 (void)ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(16, 16, GetSystemColorDepth()|ILC_MASK
, 0, 1), LVSIL_SMALL
);
130 (void)ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(32, 32, GetSystemColorDepth()|ILC_MASK
, 0, 1), LVSIL_NORMAL
);
132 UpdateApplicationListControlViewSetting();
134 /* Start our refresh thread */
135 hRefreshThread
= CreateThread(NULL
, 0, ApplicationPageRefreshThread
, NULL
, 0, NULL
);
140 /* Close the event handle, this will make the */
141 /* refresh thread exit when the wait fails */
142 CloseHandle(hApplicationPageEvent
);
143 CloseHandle(hRefreshThread
);
148 /* Handle the button clicks */
149 switch (LOWORD(wParam
))
152 ApplicationPage_OnEndTask();
155 ApplicationPage_OnSwitchTo();
158 SendMessageW(hMainWnd
, WM_COMMAND
, MAKEWPARAM(ID_FILE_NEW
, 0), 0);
165 if (wParam
== SIZE_MINIMIZED
)
170 nXDifference
= cx
- nApplicationPageWidth
;
171 nYDifference
= cy
- nApplicationPageHeight
;
172 nApplicationPageWidth
= cx
;
173 nApplicationPageHeight
= cy
;
175 /* Reposition the application page's controls */
176 GetWindowRect(hApplicationPageListCtrl
, &rc
);
177 cx
= (rc
.right
- rc
.left
) + nXDifference
;
178 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
179 SetWindowPos(hApplicationPageListCtrl
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
180 InvalidateRect(hApplicationPageListCtrl
, NULL
, TRUE
);
182 GetClientRect(hApplicationPageEndTaskButton
, &rc
);
183 MapWindowPoints(hApplicationPageEndTaskButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
184 cx
= rc
.left
+ nXDifference
;
185 cy
= rc
.top
+ nYDifference
;
186 SetWindowPos(hApplicationPageEndTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
187 InvalidateRect(hApplicationPageEndTaskButton
, NULL
, TRUE
);
189 GetClientRect(hApplicationPageSwitchToButton
, &rc
);
190 MapWindowPoints(hApplicationPageSwitchToButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
191 cx
= rc
.left
+ nXDifference
;
192 cy
= rc
.top
+ nYDifference
;
193 SetWindowPos(hApplicationPageSwitchToButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
194 InvalidateRect(hApplicationPageSwitchToButton
, NULL
, TRUE
);
196 GetClientRect(hApplicationPageNewTaskButton
, &rc
);
197 MapWindowPoints(hApplicationPageNewTaskButton
, hDlg
, (LPPOINT
)(PRECT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
198 cx
= rc
.left
+ nXDifference
;
199 cy
= rc
.top
+ nYDifference
;
200 SetWindowPos(hApplicationPageNewTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
201 InvalidateRect(hApplicationPageNewTaskButton
, NULL
, TRUE
);
206 ApplicationPageOnNotify(wParam
, lParam
);
214 void RefreshApplicationPage(void)
216 /* Signal the event so that our refresh thread */
217 /* will wake up and refresh the application page */
218 SetEvent(hApplicationPageEvent
);
221 void UpdateApplicationListControlViewSetting(void)
223 DWORD dwStyle
= GetWindowLongPtrW(hApplicationPageListCtrl
, GWL_STYLE
);
225 dwStyle
&= ~(LVS_REPORT
| LVS_ICON
| LVS_LIST
| LVS_SMALLICON
);
227 switch (TaskManagerSettings
.ViewMode
) {
228 case ID_VIEW_LARGE
: dwStyle
|= LVS_ICON
; break;
229 case ID_VIEW_SMALL
: dwStyle
|= LVS_SMALLICON
; break;
230 case ID_VIEW_DETAILS
: dwStyle
|= LVS_REPORT
; break;
232 SetWindowLongPtrW(hApplicationPageListCtrl
, GWL_STYLE
, dwStyle
);
234 RefreshApplicationPage();
237 DWORD WINAPI
ApplicationPageRefreshThread(void *lpParameter
)
240 BOOL bItemRemoved
= FALSE
;
242 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
243 HIMAGELIST hImageListLarge
;
244 HIMAGELIST hImageListSmall
;
246 /* Create the event */
247 hApplicationPageEvent
= CreateEventW(NULL
, TRUE
, TRUE
, NULL
);
249 /* If we couldn't create the event then exit the thread */
250 if (!hApplicationPageEvent
)
257 /* Wait on the event */
258 dwWaitVal
= WaitForSingleObject(hApplicationPageEvent
, INFINITE
);
260 /* If the wait failed then the event object must have been */
261 /* closed and the task manager is exiting so exit this thread */
262 if (dwWaitVal
== WAIT_FAILED
)
265 if (dwWaitVal
== WAIT_OBJECT_0
)
267 /* Reset our event */
268 ResetEvent(hApplicationPageEvent
);
273 * Should this be EnumDesktopWindows() instead?
276 EnumWindows(EnumWindowsProc
, 0);
278 (void)ListView_DeleteAllItems(hApplicationPageListCtrl
);
280 /* Get the image lists */
281 hImageListLarge
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_NORMAL
);
282 hImageListSmall
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_SMALL
);
284 /* Check to see if we need to remove any items from the list */
285 for (i
=ListView_GetItemCount(hApplicationPageListCtrl
)-1; i
>=0; i
--)
287 memset(&item
, 0, sizeof(LV_ITEM
));
288 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
290 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
292 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
293 if (!IsWindow(pAPLI
->hWnd
)||
294 (wcslen(pAPLI
->szTitle
) <= 0) ||
295 !IsWindowVisible(pAPLI
->hWnd
) ||
296 (GetParent(pAPLI
->hWnd
) != NULL
) ||
297 (GetWindow(pAPLI
->hWnd
, GW_OWNER
) != NULL
) ||
298 (GetWindowLongPtr(pAPLI
->hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
300 ImageList_Remove(hImageListLarge
, item
.iItem
);
301 ImageList_Remove(hImageListSmall
, item
.iItem
);
303 (void)ListView_DeleteItem(hApplicationPageListCtrl
, item
.iItem
);
304 HeapFree(GetProcessHeap(), 0, pAPLI
);
310 * If an item was removed from the list then
311 * we need to resync all the items with the
316 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
318 memset(&item
, 0, sizeof(LV_ITEM
));
319 item
.mask
= LVIF_IMAGE
;
322 (void)ListView_SetItem(hApplicationPageListCtrl
, &item
);
324 bItemRemoved
= FALSE
;
327 ApplicationPageUpdate();
332 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
)
338 HICON
* xhIcon
= (HICON
*)&hIcon
;
340 typedef int (FAR __stdcall
*IsHungAppWindowProc
)(HWND
);
341 IsHungAppWindowProc IsHungAppWindow
;
344 /* Skip our window */
345 if (hWnd
== hMainWnd
)
348 bLargeIcon
= (TaskManagerSettings
.ViewMode
== ID_VIEW_LARGE
);
350 GetWindowTextW(hWnd
, szText
, 260); /* Get the window text */
352 /* Check and see if this is a top-level app window */
353 if ((wcslen(szText
) <= 0) ||
354 !IsWindowVisible(hWnd
) ||
355 (GetParent(hWnd
) != NULL
) ||
356 (GetWindow(hWnd
, GW_OWNER
) != NULL
) ||
357 (GetWindowLongPtrW(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
359 return TRUE
; /* Skip this window */
363 /* Get the icon for this window */
365 SendMessageTimeoutW(hWnd
, WM_GETICON
,bLargeIcon
? ICON_BIG
/*1*/ : ICON_SMALL
/*0*/, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
369 hIcon
= (HICON
)(LONG_PTR
)GetClassLongPtrW(hWnd
, bLargeIcon
? GCL_HICON
: GCL_HICONSM
);
370 if (!hIcon
) hIcon
= (HICON
)(LONG_PTR
)GetClassLongPtrW(hWnd
, bLargeIcon
? GCL_HICONSM
: GCL_HICON
);
371 if (!hIcon
) SendMessageTimeoutW(hWnd
, WM_QUERYDRAGICON
, 0, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
372 if (!hIcon
) SendMessageTimeoutW(hWnd
, WM_GETICON
, bLargeIcon
? ICON_SMALL
/*0*/ : ICON_BIG
/*1*/, 0, 0, 1000, (PDWORD_PTR
)xhIcon
);
376 hIcon
= LoadIconW(hInst
, bLargeIcon
? MAKEINTRESOURCEW(IDI_WINDOW
) : MAKEINTRESOURCEW(IDI_WINDOWSM
));
380 IsHungAppWindow
= (IsHungAppWindowProc
)(FARPROC
)GetProcAddress(GetModuleHandleW(L
"USER32.DLL"), "IsHungAppWindow");
383 bHung
= IsHungAppWindow(hWnd
);
385 AddOrUpdateHwnd(hWnd
, szText
, hIcon
, bHung
);
390 void AddOrUpdateHwnd(HWND hWnd
, WCHAR
*szTitle
, HICON hIcon
, BOOL bHung
)
392 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
393 HIMAGELIST hImageListLarge
;
394 HIMAGELIST hImageListSmall
;
397 BOOL bAlreadyInList
= FALSE
;
399 memset(&item
, 0, sizeof(LV_ITEM
));
401 /* Get the image lists */
402 hImageListLarge
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_NORMAL
);
403 hImageListSmall
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_SMALL
);
405 /* Check to see if it's already in our list */
406 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
408 memset(&item
, 0, sizeof(LV_ITEM
));
409 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
411 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
413 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
414 if (pAPLI
->hWnd
== hWnd
)
416 bAlreadyInList
= TRUE
;
421 /* If it is already in the list then update it if necessary */
424 /* Check to see if anything needs updating */
425 if ((pAPLI
->hIcon
!= hIcon
) ||
426 (_wcsicmp(pAPLI
->szTitle
, szTitle
) != 0) ||
427 (pAPLI
->bHung
!= bHung
))
429 /* Update the structure */
430 pAPLI
->hIcon
= hIcon
;
431 pAPLI
->bHung
= bHung
;
432 wcscpy(pAPLI
->szTitle
, szTitle
);
434 /* Update the image list */
435 ImageList_ReplaceIcon(hImageListLarge
, item
.iItem
, hIcon
);
436 ImageList_ReplaceIcon(hImageListSmall
, item
.iItem
, hIcon
);
438 /* Update the list view */
439 (void)ListView_RedrawItems(hApplicationPageListCtrl
, 0, ListView_GetItemCount(hApplicationPageListCtrl
));
440 /* UpdateWindow(hApplicationPageListCtrl); */
441 InvalidateRect(hApplicationPageListCtrl
, NULL
, 0);
444 /* It is not already in the list so add it */
447 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM
));
450 pAPLI
->hIcon
= hIcon
;
451 pAPLI
->bHung
= bHung
;
452 wcscpy(pAPLI
->szTitle
, szTitle
);
454 /* Add the item to the list */
455 memset(&item
, 0, sizeof(LV_ITEM
));
456 item
.mask
= LVIF_TEXT
|LVIF_IMAGE
|LVIF_PARAM
;
457 ImageList_AddIcon(hImageListLarge
, hIcon
);
458 item
.iImage
= ImageList_AddIcon(hImageListSmall
, hIcon
);
459 item
.pszText
= LPSTR_TEXTCALLBACK
;
460 item
.iItem
= ListView_GetItemCount(hApplicationPageListCtrl
);
461 item
.lParam
= (LPARAM
)pAPLI
;
462 (void)ListView_InsertItem(hApplicationPageListCtrl
, &item
);
467 void ApplicationPageUpdate(void)
469 /* Enable or disable the "End Task" & "Switch To" buttons */
470 if (ListView_GetSelectedCount(hApplicationPageListCtrl
))
472 EnableWindow(hApplicationPageEndTaskButton
, TRUE
);
476 EnableWindow(hApplicationPageEndTaskButton
, FALSE
);
478 /* Enable "Switch To" button only if one app is selected */
479 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1 )
481 EnableWindow(hApplicationPageSwitchToButton
, TRUE
);
485 EnableWindow(hApplicationPageSwitchToButton
, FALSE
);
488 /* If we are on the applications tab the windows menu will be */
489 /* present on the menu bar so enable & disable the menu items */
490 if (TabCtrl_GetCurSel(hTabWnd
) == 0)
495 hMenu
= GetMenu(hMainWnd
);
496 hWindowsMenu
= GetSubMenu(hMenu
, 3);
498 /* Only one item selected */
499 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
501 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
502 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
503 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
504 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
505 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
506 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
508 /* More than one item selected */
509 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
511 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
512 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
513 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
514 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
515 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
516 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
518 /* No items selected */
521 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
522 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
523 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
524 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
525 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
526 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
531 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
)
537 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
;
541 idctrl
= (int) wParam
;
542 pnmh
= (LPNMHDR
) lParam
;
543 pnmv
= (LPNM_LISTVIEW
) lParam
;
544 pnmdi
= (LV_DISPINFO
*) lParam
;
546 if (pnmh
->hwndFrom
== hApplicationPageListCtrl
) {
547 switch (pnmh
->code
) {
548 case LVN_ITEMCHANGED
:
549 ApplicationPageUpdate();
552 case LVN_GETDISPINFO
:
553 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)pnmdi
->item
.lParam
;
555 /* Update the item text */
556 if (pnmdi
->item
.iSubItem
== 0)
558 wcsncpy(pnmdi
->item
.pszText
, pAPLI
->szTitle
, pnmdi
->item
.cchTextMax
);
561 /* Update the item status */
562 else if (pnmdi
->item
.iSubItem
== 1)
566 LoadStringW( GetModuleHandleW(NULL
), IDS_Not_Responding
, szMsg
, sizeof(szMsg
) / sizeof(szMsg
[0]));
570 LoadStringW( GetModuleHandleW(NULL
), IDS_Running
, (LPWSTR
) szMsg
, sizeof(szMsg
) / sizeof(szMsg
[0]));
572 wcsncpy(pnmdi
->item
.pszText
, szMsg
, pnmdi
->item
.cchTextMax
);
579 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
581 ApplicationPageShowContextMenu1();
585 ApplicationPageShowContextMenu2();
592 ApplicationPage_OnSwitchTo();
597 else if (pnmh
->hwndFrom
== ListView_GetHeader(hApplicationPageListCtrl
))
603 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
605 ApplicationPageShowContextMenu1();
609 ApplicationPageShowContextMenu2();
616 (void)ListView_SortItems(hApplicationPageListCtrl
, ApplicationPageCompareFunc
, 0);
617 bSortAscending
= !bSortAscending
;
625 void ApplicationPageShowContextMenu1(void)
633 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT1
));
634 hSubMenu
= GetSubMenu(hMenu
, 0);
636 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, TaskManagerSettings
.ViewMode
, MF_BYCOMMAND
);
638 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
643 void ApplicationPageShowContextMenu2(void)
651 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT2
));
652 hSubMenu
= GetSubMenu(hMenu
, 0);
654 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
656 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
657 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
658 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
659 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
660 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
661 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
663 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
665 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
666 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
667 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
668 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
669 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
670 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
674 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
675 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
676 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
677 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
678 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
679 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
682 SetMenuDefaultItem(hSubMenu
, ID_APPLICATION_PAGE_SWITCHTO
, MF_BYCOMMAND
);
684 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
689 void ApplicationPage_OnView(DWORD dwMode
)
694 hMenu
= GetMenu(hMainWnd
);
695 hViewMenu
= GetSubMenu(hMenu
, 2);
697 TaskManagerSettings
.ViewMode
= dwMode
;
698 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, dwMode
, MF_BYCOMMAND
);
700 UpdateApplicationListControlViewSetting();
703 void ApplicationPage_OnWindowsTile(DWORD dwMode
)
705 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
711 hWndArray
= (HWND
*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
714 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
715 memset(&item
, 0, sizeof(LV_ITEM
));
716 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
718 item
.stateMask
= (UINT
)-1;
719 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
721 if (item
.state
& LVIS_SELECTED
) {
722 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
724 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
730 TileWindows(NULL
, dwMode
, NULL
, nWndCount
, hWndArray
);
731 HeapFree(GetProcessHeap(), 0, hWndArray
);
734 void ApplicationPage_OnWindowsMinimize(void)
736 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
740 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
741 memset(&item
, 0, sizeof(LV_ITEM
));
742 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
744 item
.stateMask
= (UINT
)-1;
745 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
746 if (item
.state
& LVIS_SELECTED
) {
747 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
749 ShowWindow(pAPLI
->hWnd
, SW_MINIMIZE
);
755 void ApplicationPage_OnWindowsMaximize(void)
757 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
761 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
762 memset(&item
, 0, sizeof(LV_ITEM
));
763 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
765 item
.stateMask
= (UINT
)-1;
766 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
767 if (item
.state
& LVIS_SELECTED
) {
768 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
770 ShowWindow(pAPLI
->hWnd
, SW_MAXIMIZE
);
776 void ApplicationPage_OnWindowsCascade(void)
778 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
784 hWndArray
= (HWND
*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
787 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
788 memset(&item
, 0, sizeof(LV_ITEM
));
789 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
791 item
.stateMask
= (UINT
)-1;
792 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
793 if (item
.state
& LVIS_SELECTED
) {
794 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
796 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
801 CascadeWindows(NULL
, 0, NULL
, nWndCount
, hWndArray
);
802 HeapFree(GetProcessHeap(), 0, hWndArray
);
805 void ApplicationPage_OnWindowsBringToFront(void)
807 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
811 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
812 memset(&item
, 0, sizeof(LV_ITEM
));
813 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
815 item
.stateMask
= (UINT
)-1;
816 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
817 if (item
.state
& LVIS_SELECTED
) {
818 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
823 if (IsIconic(pAPLI
->hWnd
))
824 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
825 BringWindowToTop(pAPLI
->hWnd
);
829 void ApplicationPage_OnSwitchTo(void)
831 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
835 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
836 memset(&item
, 0, sizeof(LV_ITEM
));
837 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
839 item
.stateMask
= (UINT
)-1;
840 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
842 if (item
.state
& LVIS_SELECTED
) {
843 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
848 typedef void (WINAPI
*PROCSWITCHTOTHISWINDOW
) (HWND
, BOOL
);
849 PROCSWITCHTOTHISWINDOW SwitchToThisWindow
;
851 HMODULE hUser32
= GetModuleHandleW(L
"USER32");
852 SwitchToThisWindow
= (PROCSWITCHTOTHISWINDOW
)GetProcAddress(hUser32
, "SwitchToThisWindow");
853 if (SwitchToThisWindow
) {
854 SwitchToThisWindow(pAPLI
->hWnd
, TRUE
);
856 if (IsIconic(pAPLI
->hWnd
))
857 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
858 BringWindowToTop(pAPLI
->hWnd
);
859 SetForegroundWindow(pAPLI
->hWnd
);
861 if (TaskManagerSettings
.MinimizeOnUse
)
862 ShowWindow(hMainWnd
, SW_MINIMIZE
);
866 void ApplicationPage_OnEndTask(void)
868 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
872 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
873 memset(&item
, 0, sizeof(LV_ITEM
));
874 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
876 item
.stateMask
= (UINT
)-1;
877 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
878 if (item
.state
& LVIS_SELECTED
) {
879 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
881 PostMessageW(pAPLI
->hWnd
, WM_CLOSE
, 0, 0);
887 void ApplicationPage_OnGotoProcess(void)
889 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
893 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
894 memset(&item
, 0, sizeof(LV_ITEM
));
895 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
897 item
.stateMask
= (UINT
)-1;
898 (void)ListView_GetItem(hApplicationPageListCtrl
, &item
);
899 if (item
.state
& LVIS_SELECTED
) {
900 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
907 GetWindowThreadProcessId(pAPLI
->hWnd
, &dwProcessId
);
909 * Switch to the process tab
911 TabCtrl_SetCurFocus(hTabWnd
, 1);
913 * Select the process item in the list
915 i
= ProcGetIndexByProcessId(dwProcessId
);
918 ListView_SetItemState(hProcessPageListCtrl
,
920 LVIS_SELECTED
| LVIS_FOCUSED
,
921 LVIS_SELECTED
| LVIS_FOCUSED
);
922 (void)ListView_EnsureVisible(hProcessPageListCtrl
,
929 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
931 LPAPPLICATION_PAGE_LIST_ITEM Param1
;
932 LPAPPLICATION_PAGE_LIST_ITEM Param2
;
934 if (bSortAscending
) {
935 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
936 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
938 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
939 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
941 return wcscmp(Param1
->szTitle
, Param2
->szTitle
);