6 * Copyright (C) 1999 - 2001 Brian Palmer <brianp@reactos.org>
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 #define WIN32_LEAN_AND_MEAN /* Exclude rarely-used stuff from Windows headers */
40 } APPLICATION_PAGE_LIST_ITEM
, *LPAPPLICATION_PAGE_LIST_ITEM
;
42 HWND hApplicationPage
; /* Application List Property Page */
43 HWND hApplicationPageListCtrl
; /* Application ListCtrl Window */
44 HWND hApplicationPageEndTaskButton
; /* Application End Task button */
45 HWND hApplicationPageSwitchToButton
; /* Application Switch To button */
46 HWND hApplicationPageNewTaskButton
; /* Application New Task button */
47 static int nApplicationPageWidth
;
48 static int nApplicationPageHeight
;
49 static HANDLE hApplicationPageEvent
= NULL
; /* When this event becomes signaled then we refresh the app list */
50 static BOOL bSortAscending
= TRUE
;
51 DWORD WINAPI
ApplicationPageRefreshThread(void *lpParameter
);
52 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
);
53 void AddOrUpdateHwnd(HWND hWnd
, TCHAR
*szTitle
, HICON hIcon
, BOOL bHung
);
54 void ApplicationPageUpdate(void);
55 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
);
56 void ApplicationPageShowContextMenu1(void);
57 void ApplicationPageShowContextMenu2(void);
58 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
);
61 void SwitchToThisWindow (
62 HWND hWnd
, /* Handle to the window that should be activated */
63 BOOL bRestore
/* Restore the window if it is minimized */
68 ApplicationPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
80 /* Save the width and height */
81 GetClientRect(hDlg
, &rc
);
82 nApplicationPageWidth
= rc
.right
;
83 nApplicationPageHeight
= rc
.bottom
;
85 /* Update window position */
86 SetWindowPos(hDlg
, NULL
, 15, 30, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
88 /* Get handles to the controls */
89 hApplicationPageListCtrl
= GetDlgItem(hDlg
, IDC_APPLIST
);
90 hApplicationPageEndTaskButton
= GetDlgItem(hDlg
, IDC_ENDTASK
);
91 hApplicationPageSwitchToButton
= GetDlgItem(hDlg
, IDC_SWITCHTO
);
92 hApplicationPageNewTaskButton
= GetDlgItem(hDlg
, IDC_NEWTASK
);
94 SetWindowText(hApplicationPageListCtrl
, _T("Tasks"));
96 /* Initialize the application page's controls */
97 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
98 _tcscpy(szTemp
, _T("Task"));
99 column
.pszText
= szTemp
;
101 ListView_InsertColumn(hApplicationPageListCtrl
, 0, &column
); /* Add the "Task" column */
102 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
103 _tcscpy(szTemp
, _T("Status"));
104 column
.pszText
= szTemp
;
106 ListView_InsertColumn(hApplicationPageListCtrl
, 1, &column
); /* Add the "Status" column */
108 ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(16, 16, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_SMALL
);
109 ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(32, 32, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_NORMAL
);
111 UpdateApplicationListControlViewSetting();
113 /* Start our refresh thread */
114 CreateThread(NULL
, 0, ApplicationPageRefreshThread
, NULL
, 0, NULL
);
119 /* Close the event handle, this will make the */
120 /* refresh thread exit when the wait fails */
121 CloseHandle(hApplicationPageEvent
);
126 /* Handle the button clicks */
127 switch (LOWORD(wParam
))
130 ApplicationPage_OnEndTask();
133 ApplicationPage_OnSwitchTo();
136 SendMessage(hMainWnd
, WM_COMMAND
, MAKEWPARAM(ID_FILE_NEW
, 0), 0);
143 if (wParam
== SIZE_MINIMIZED
)
148 nXDifference
= cx
- nApplicationPageWidth
;
149 nYDifference
= cy
- nApplicationPageHeight
;
150 nApplicationPageWidth
= cx
;
151 nApplicationPageHeight
= cy
;
153 /* Reposition the application page's controls */
154 GetWindowRect(hApplicationPageListCtrl
, &rc
);
155 cx
= (rc
.right
- rc
.left
) + nXDifference
;
156 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
157 SetWindowPos(hApplicationPageListCtrl
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
158 InvalidateRect(hApplicationPageListCtrl
, NULL
, TRUE
);
160 GetClientRect(hApplicationPageEndTaskButton
, &rc
);
161 MapWindowPoints(hApplicationPageEndTaskButton
, hDlg
, (LPPOINT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
162 cx
= rc
.left
+ nXDifference
;
163 cy
= rc
.top
+ nYDifference
;
164 SetWindowPos(hApplicationPageEndTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
165 InvalidateRect(hApplicationPageEndTaskButton
, NULL
, TRUE
);
167 GetClientRect(hApplicationPageSwitchToButton
, &rc
);
168 MapWindowPoints(hApplicationPageSwitchToButton
, hDlg
, (LPPOINT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
169 cx
= rc
.left
+ nXDifference
;
170 cy
= rc
.top
+ nYDifference
;
171 SetWindowPos(hApplicationPageSwitchToButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
172 InvalidateRect(hApplicationPageSwitchToButton
, NULL
, TRUE
);
174 GetClientRect(hApplicationPageNewTaskButton
, &rc
);
175 MapWindowPoints(hApplicationPageNewTaskButton
, hDlg
, (LPPOINT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
176 cx
= rc
.left
+ nXDifference
;
177 cy
= rc
.top
+ nYDifference
;
178 SetWindowPos(hApplicationPageNewTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
179 InvalidateRect(hApplicationPageNewTaskButton
, NULL
, TRUE
);
184 ApplicationPageOnNotify(wParam
, lParam
);
192 void RefreshApplicationPage(void)
194 /* Signal the event so that our refresh thread */
195 /* will wake up and refresh the application page */
196 SetEvent(hApplicationPageEvent
);
199 void UpdateApplicationListControlViewSetting(void)
201 DWORD dwStyle
= GetWindowLong(hApplicationPageListCtrl
, GWL_STYLE
);
203 dwStyle
&= ~LVS_REPORT
;
204 dwStyle
&= ~LVS_ICON
;
205 dwStyle
&= ~LVS_LIST
;
206 dwStyle
&= ~LVS_SMALLICON
;
208 if (TaskManagerSettings
.View_LargeIcons
)
210 else if (TaskManagerSettings
.View_SmallIcons
)
211 dwStyle
|= LVS_SMALLICON
;
213 dwStyle
|= LVS_REPORT
;
215 SetWindowLong(hApplicationPageListCtrl
, GWL_STYLE
, dwStyle
);
217 RefreshApplicationPage();
220 DWORD WINAPI
ApplicationPageRefreshThread(void *lpParameter
)
222 /* Create the event */
223 hApplicationPageEvent
= CreateEvent(NULL
, TRUE
, TRUE
, NULL
);
225 /* If we couldn't create the event then exit the thread */
226 if (!hApplicationPageEvent
)
233 /* Wait on the event */
234 dwWaitVal
= WaitForSingleObject(hApplicationPageEvent
, INFINITE
);
236 /* If the wait failed then the event object must have been */
237 /* closed and the task manager is exiting so exit this thread */
238 if (dwWaitVal
== WAIT_FAILED
)
241 if (dwWaitVal
== WAIT_OBJECT_0
)
243 /* Reset our event */
244 ResetEvent(hApplicationPageEvent
);
249 * Should this be EnumDesktopWindows() instead?
251 EnumWindows(EnumWindowsProc
, 0);
256 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
)
262 typedef int (__stdcall
*IsHungAppWindowProc
)(HWND
);
263 IsHungAppWindowProc IsHungAppWindow
;
266 /* Skip our window */
267 if (hWnd
== hMainWnd
)
270 bLargeIcon
= TaskManagerSettings
.View_LargeIcons
? TRUE
: FALSE
;
272 GetWindowText(hWnd
, szText
, 260); /* Get the window text */
274 /* Check and see if this is a top-level app window */
275 if ((_tcslen(szText
) <= 0) ||
276 !IsWindowVisible(hWnd
) ||
277 (GetParent(hWnd
) != NULL
) ||
278 (GetWindow(hWnd
, GW_OWNER
) != NULL
) ||
279 (GetWindowLong(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
281 return TRUE
; /* Skip this window */
284 /* Get the icon for this window */
286 SendMessageTimeout(hWnd
, WM_GETICON
, bLargeIcon
? ICON_BIG
/*1*/ : ICON_SMALL
/*0*/, 0, 0, 1000, (PDWORD_PTR
)&hIcon
);
290 hIcon
= (HICON
)GetClassLongPtr(hWnd
, bLargeIcon
? GCLP_HICON
: GCLP_HICONSM
);
291 if (!hIcon
) hIcon
= (HICON
)GetClassLongPtr(hWnd
, bLargeIcon
? GCLP_HICONSM
: GCLP_HICON
);
292 if (!hIcon
) SendMessageTimeout(hWnd
, WM_QUERYDRAGICON
, 0, 0, 0, 1000, (PDWORD_PTR
)&hIcon
);
293 if (!hIcon
) SendMessageTimeout(hWnd
, WM_GETICON
, bLargeIcon
? ICON_SMALL
/*0*/ : ICON_BIG
/*1*/, 0, 0, 1000, (PDWORD_PTR
)&hIcon
);
297 hIcon
= LoadIcon(hInst
, bLargeIcon
? MAKEINTRESOURCE(IDI_WINDOW
) : MAKEINTRESOURCE(IDI_WINDOWSM
));
301 IsHungAppWindow
= (IsHungAppWindowProc
)(FARPROC
)GetProcAddress(GetModuleHandle(_T("USER32.DLL")), "IsHungAppWindow");
304 bHung
= IsHungAppWindow(hWnd
);
306 AddOrUpdateHwnd(hWnd
, szText
, hIcon
, bHung
);
311 void AddOrUpdateHwnd(HWND hWnd
, TCHAR
*szTitle
, HICON hIcon
, BOOL bHung
)
313 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
314 HIMAGELIST hImageListLarge
;
315 HIMAGELIST hImageListSmall
;
318 BOOL bAlreadyInList
= FALSE
;
319 BOOL bItemRemoved
= FALSE
;
321 memset(&item
, 0, sizeof(LV_ITEM
));
323 /* Get the image lists */
324 hImageListLarge
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_NORMAL
);
325 hImageListSmall
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_SMALL
);
327 /* Check to see if it's already in our list */
328 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
330 memset(&item
, 0, sizeof(LV_ITEM
));
331 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
333 ListView_GetItem(hApplicationPageListCtrl
, &item
);
335 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
336 if (pAPLI
->hWnd
== hWnd
)
338 bAlreadyInList
= TRUE
;
343 /* If it is already in the list then update it if necessary */
346 /* Check to see if anything needs updating */
347 if ((pAPLI
->hIcon
!= hIcon
) ||
348 (_tcsicmp(pAPLI
->szTitle
, szTitle
) != 0) ||
349 (pAPLI
->bHung
!= bHung
))
351 /* Update the structure */
352 pAPLI
->hIcon
= hIcon
;
353 pAPLI
->bHung
= bHung
;
354 _tcscpy(pAPLI
->szTitle
, szTitle
);
356 /* Update the image list */
357 ImageList_ReplaceIcon(hImageListLarge
, item
.iItem
, hIcon
);
358 ImageList_ReplaceIcon(hImageListSmall
, item
.iItem
, hIcon
);
360 /* Update the list view */
361 ListView_RedrawItems(hApplicationPageListCtrl
, 0, ListView_GetItemCount(hApplicationPageListCtrl
));
362 /* UpdateWindow(hApplicationPageListCtrl); */
363 InvalidateRect(hApplicationPageListCtrl
, NULL
, 0);
366 /* It is not already in the list so add it */
369 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)malloc(sizeof(APPLICATION_PAGE_LIST_ITEM
));
372 pAPLI
->hIcon
= hIcon
;
373 pAPLI
->bHung
= bHung
;
374 _tcscpy(pAPLI
->szTitle
, szTitle
);
376 /* Add the item to the list */
377 memset(&item
, 0, sizeof(LV_ITEM
));
378 item
.mask
= LVIF_TEXT
|LVIF_IMAGE
|LVIF_PARAM
;
379 ImageList_AddIcon(hImageListLarge
, hIcon
);
380 item
.iImage
= ImageList_AddIcon(hImageListSmall
, hIcon
);
381 item
.pszText
= LPSTR_TEXTCALLBACK
;
382 item
.iItem
= ListView_GetItemCount(hApplicationPageListCtrl
);
383 item
.lParam
= (LPARAM
)pAPLI
;
384 ListView_InsertItem(hApplicationPageListCtrl
, &item
);
388 /* Check to see if we need to remove any items from the list */
389 for (i
=ListView_GetItemCount(hApplicationPageListCtrl
)-1; i
>=0; i
--)
391 memset(&item
, 0, sizeof(LV_ITEM
));
392 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
394 ListView_GetItem(hApplicationPageListCtrl
, &item
);
396 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
397 if (!IsWindow(pAPLI
->hWnd
)||
398 (_tcslen(pAPLI
->szTitle
) <= 0) ||
399 !IsWindowVisible(pAPLI
->hWnd
) ||
400 (GetParent(pAPLI
->hWnd
) != NULL
) ||
401 (GetWindow(pAPLI
->hWnd
, GW_OWNER
) != NULL
) ||
402 (GetWindowLong(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
404 ImageList_Remove(hImageListLarge
, item
.iItem
);
405 ImageList_Remove(hImageListSmall
, item
.iItem
);
407 ListView_DeleteItem(hApplicationPageListCtrl
, item
.iItem
);
414 * If an item was removed from the list then
415 * we need to resync all the items with the
420 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
422 memset(&item
, 0, sizeof(LV_ITEM
));
423 item
.mask
= LVIF_IMAGE
;
426 ListView_SetItem(hApplicationPageListCtrl
, &item
);
430 ApplicationPageUpdate();
433 void ApplicationPageUpdate(void)
435 /* Enable or disable the "End Task" & "Switch To" buttons */
436 if (ListView_GetSelectedCount(hApplicationPageListCtrl
))
438 EnableWindow(hApplicationPageEndTaskButton
, TRUE
);
439 EnableWindow(hApplicationPageSwitchToButton
, TRUE
);
443 EnableWindow(hApplicationPageEndTaskButton
, FALSE
);
444 EnableWindow(hApplicationPageSwitchToButton
, FALSE
);
447 /* If we are on the applications tab the the windows menu will */
448 /* be present on the menu bar so enable & disable the menu items */
449 if (TabCtrl_GetCurSel(hTabWnd
) == 0)
454 hMenu
= GetMenu(hMainWnd
);
455 hWindowsMenu
= GetSubMenu(hMenu
, 3);
457 /* Only one item selected */
458 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
460 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
461 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
462 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
463 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
464 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
465 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
467 /* More than one item selected */
468 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
470 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
471 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
472 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
473 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
474 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
475 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
477 /* No items selected */
480 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
481 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
482 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
483 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
484 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
485 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
490 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
)
496 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
;
499 idctrl
= (int) wParam
;
500 pnmh
= (LPNMHDR
) lParam
;
501 pnmv
= (LPNM_LISTVIEW
) lParam
;
502 pnmdi
= (LV_DISPINFO
*) lParam
;
504 if (pnmh
->hwndFrom
== hApplicationPageListCtrl
) {
505 switch (pnmh
->code
) {
506 case LVN_ITEMCHANGED
:
507 ApplicationPageUpdate();
510 case LVN_GETDISPINFO
:
511 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)pnmdi
->item
.lParam
;
513 /* Update the item text */
514 if (pnmdi
->item
.iSubItem
== 0)
516 _tcsncpy(pnmdi
->item
.pszText
, pAPLI
->szTitle
, pnmdi
->item
.cchTextMax
);
519 /* Update the item status */
520 else if (pnmdi
->item
.iSubItem
== 1)
523 _tcsncpy(pnmdi
->item
.pszText
, _T("Not Responding"), pnmdi
->item
.cchTextMax
);
525 _tcsncpy(pnmdi
->item
.pszText
, _T("Running"), pnmdi
->item
.cchTextMax
);
532 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
534 ApplicationPageShowContextMenu1();
538 ApplicationPageShowContextMenu2();
545 ApplicationPage_OnSwitchTo();
550 else if (pnmh
->hwndFrom
== ListView_GetHeader(hApplicationPageListCtrl
))
556 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
558 ApplicationPageShowContextMenu1();
562 ApplicationPageShowContextMenu2();
569 ListView_SortItems(hApplicationPageListCtrl
, ApplicationPageCompareFunc
, 0);
570 bSortAscending
= !bSortAscending
;
578 void ApplicationPageShowContextMenu1(void)
586 hMenu
= LoadMenu(hInst
, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT1
));
587 hSubMenu
= GetSubMenu(hMenu
, 0);
589 if (TaskManagerSettings
.View_LargeIcons
)
590 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
591 else if (TaskManagerSettings
.View_SmallIcons
)
592 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
594 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
596 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
601 void ApplicationPageShowContextMenu2(void)
609 hMenu
= LoadMenu(hInst
, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT2
));
610 hSubMenu
= GetSubMenu(hMenu
, 0);
612 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
614 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
615 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
616 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
617 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
618 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
619 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
621 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
623 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
624 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
625 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
626 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
627 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
628 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
632 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
633 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
634 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
635 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
636 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
637 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
640 SetMenuDefaultItem(hSubMenu
, ID_APPLICATION_PAGE_SWITCHTO
, MF_BYCOMMAND
);
642 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
647 void ApplicationPage_OnViewLargeIcons(void)
652 hMenu
= GetMenu(hMainWnd
);
653 hViewMenu
= GetSubMenu(hMenu
, 2);
655 TaskManagerSettings
.View_LargeIcons
= TRUE
;
656 TaskManagerSettings
.View_SmallIcons
= FALSE
;
657 TaskManagerSettings
.View_Details
= FALSE
;
658 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
660 UpdateApplicationListControlViewSetting();
663 void ApplicationPage_OnViewSmallIcons(void)
668 hMenu
= GetMenu(hMainWnd
);
669 hViewMenu
= GetSubMenu(hMenu
, 2);
671 TaskManagerSettings
.View_LargeIcons
= FALSE
;
672 TaskManagerSettings
.View_SmallIcons
= TRUE
;
673 TaskManagerSettings
.View_Details
= FALSE
;
674 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
676 UpdateApplicationListControlViewSetting();
679 void ApplicationPage_OnViewDetails(void)
684 hMenu
= GetMenu(hMainWnd
);
685 hViewMenu
= GetSubMenu(hMenu
, 2);
687 TaskManagerSettings
.View_LargeIcons
= FALSE
;
688 TaskManagerSettings
.View_SmallIcons
= FALSE
;
689 TaskManagerSettings
.View_Details
= TRUE
;
690 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
692 UpdateApplicationListControlViewSetting();
695 void ApplicationPage_OnWindowsTileHorizontally(void)
697 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
703 hWndArray
= (HWND
*)malloc(sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
706 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
707 memset(&item
, 0, sizeof(LV_ITEM
));
708 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
710 item
.stateMask
= (UINT
)-1;
711 ListView_GetItem(hApplicationPageListCtrl
, &item
);
713 if (item
.state
& LVIS_SELECTED
) {
714 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
717 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
722 TileWindows(NULL
, MDITILE_HORIZONTAL
, NULL
, nWndCount
, hWndArray
);
726 void ApplicationPage_OnWindowsTileVertically(void)
728 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
734 hWndArray
= (HWND
*)malloc(sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
737 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
738 memset(&item
, 0, sizeof(LV_ITEM
));
739 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
741 item
.stateMask
= (UINT
)-1;
742 ListView_GetItem(hApplicationPageListCtrl
, &item
);
744 if (item
.state
& LVIS_SELECTED
) {
745 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
747 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
753 TileWindows(NULL
, MDITILE_VERTICAL
, NULL
, nWndCount
, hWndArray
);
757 void ApplicationPage_OnWindowsMinimize(void)
759 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
763 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
764 memset(&item
, 0, sizeof(LV_ITEM
));
765 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
767 item
.stateMask
= (UINT
)-1;
768 ListView_GetItem(hApplicationPageListCtrl
, &item
);
769 if (item
.state
& LVIS_SELECTED
) {
770 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
772 ShowWindow(pAPLI
->hWnd
, SW_MINIMIZE
);
778 void ApplicationPage_OnWindowsMaximize(void)
780 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
784 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
785 memset(&item
, 0, sizeof(LV_ITEM
));
786 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
788 item
.stateMask
= (UINT
)-1;
789 ListView_GetItem(hApplicationPageListCtrl
, &item
);
790 if (item
.state
& LVIS_SELECTED
) {
791 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
793 ShowWindow(pAPLI
->hWnd
, SW_MAXIMIZE
);
799 void ApplicationPage_OnWindowsCascade(void)
801 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
807 hWndArray
= (HWND
*)malloc(sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
810 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
811 memset(&item
, 0, sizeof(LV_ITEM
));
812 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
814 item
.stateMask
= (UINT
)-1;
815 ListView_GetItem(hApplicationPageListCtrl
, &item
);
816 if (item
.state
& LVIS_SELECTED
) {
817 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
819 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
824 CascadeWindows(NULL
, 0, NULL
, nWndCount
, hWndArray
);
828 void ApplicationPage_OnWindowsBringToFront(void)
830 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
834 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
835 memset(&item
, 0, sizeof(LV_ITEM
));
836 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
838 item
.stateMask
= (UINT
)-1;
839 ListView_GetItem(hApplicationPageListCtrl
, &item
);
840 if (item
.state
& LVIS_SELECTED
) {
841 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
846 if (IsIconic(pAPLI
->hWnd
))
847 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
848 BringWindowToTop(pAPLI
->hWnd
);
852 void ApplicationPage_OnSwitchTo(void)
854 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
858 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
859 memset(&item
, 0, sizeof(LV_ITEM
));
860 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
862 item
.stateMask
= (UINT
)-1;
863 ListView_GetItem(hApplicationPageListCtrl
, &item
);
865 if (item
.state
& LVIS_SELECTED
) {
866 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
871 typedef void (WINAPI
*PROCSWITCHTOTHISWINDOW
) (HWND
, BOOL
);
872 PROCSWITCHTOTHISWINDOW SwitchToThisWindow
;
874 HMODULE hUser32
= GetModuleHandle(_T("USER32"));
875 SwitchToThisWindow
= (PROCSWITCHTOTHISWINDOW
)GetProcAddress(hUser32
, "SwitchToThisWindow");
876 if (SwitchToThisWindow
) {
877 SwitchToThisWindow(pAPLI
->hWnd
, TRUE
);
879 if (IsIconic(pAPLI
->hWnd
))
880 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
881 BringWindowToTop(pAPLI
->hWnd
);
882 SetForegroundWindow(pAPLI
->hWnd
);
884 if (TaskManagerSettings
.MinimizeOnUse
)
885 ShowWindow(hMainWnd
, SW_MINIMIZE
);
889 void ApplicationPage_OnEndTask(void)
891 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
895 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
896 memset(&item
, 0, sizeof(LV_ITEM
));
897 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
899 item
.stateMask
= (UINT
)-1;
900 ListView_GetItem(hApplicationPageListCtrl
, &item
);
901 if (item
.state
& LVIS_SELECTED
) {
902 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
904 PostMessage(pAPLI
->hWnd
, WM_CLOSE
, 0, 0);
910 void ApplicationPage_OnGotoProcess(void)
912 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
917 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
918 memset(&item
, 0, sizeof(LV_ITEM
));
919 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
921 item
.stateMask
= (UINT
)-1;
922 ListView_GetItem(hApplicationPageListCtrl
, &item
);
923 if (item
.state
& LVIS_SELECTED
) {
924 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
931 GetWindowThreadProcessId(pAPLI
->hWnd
, &dwProcessId
);
933 * Switch to the process tab
935 TabCtrl_SetCurFocus(hTabWnd
, 1);
937 * FIXME: Select the process item in the list
939 for (i
=0; i
<ListView_GetItemCount(hProcessPage
); i
++) {
944 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
946 LPAPPLICATION_PAGE_LIST_ITEM Param1
;
947 LPAPPLICATION_PAGE_LIST_ITEM Param2
;
949 if (bSortAscending
) {
950 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
951 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
953 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
954 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
956 return _tcscmp(Param1
->szTitle
, Param2
->szTitle
);