6 * Copyright (C) 1999 - 2001 Brian Palmer <brianp@reactos.org>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
13 * This program 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
16 * GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
38 #include "ApplicationPage.h"
39 #include "ProcessPage.h"
47 } APPLICATION_PAGE_LIST_ITEM
, *LPAPPLICATION_PAGE_LIST_ITEM
;
49 HWND hApplicationPage
; // Application List Property Page
51 HWND hApplicationPageListCtrl
; // Application ListCtrl Window
52 HWND hApplicationPageEndTaskButton
; // Application End Task button
53 HWND hApplicationPageSwitchToButton
; // Application Switch To button
54 HWND hApplicationPageNewTaskButton
; // Application New Task button
56 static int nApplicationPageWidth
;
57 static int nApplicationPageHeight
;
59 static HANDLE hApplicationPageEvent
= NULL
; // When this event becomes signaled then we refresh the app list
61 static BOOL bSortAscending
= TRUE
;
63 void ApplicationPageRefreshThread(void *lpParameter
);
64 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
);
65 void AddOrUpdateHwnd(HWND hWnd
, char *szTitle
, HICON hIcon
, BOOL bHung
);
66 void ApplicationPageUpdate(void);
67 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
);
68 void ApplicationPageShowContextMenu1(void);
69 void ApplicationPageShowContextMenu2(void);
70 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
);
72 void SwitchToThisWindow (
73 HWND hWnd
, // Handle to the window that should be activated
74 BOOL bRestore
// Restore the window if it is minimized
77 LRESULT CALLBACK
ApplicationPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
89 // Save the width and height
90 GetClientRect(hDlg
, &rc
);
91 nApplicationPageWidth
= rc
.right
;
92 nApplicationPageHeight
= rc
.bottom
;
94 // Update window position
95 SetWindowPos(hDlg
, NULL
, 15, 30, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
97 // Get handles to the controls
98 hApplicationPageListCtrl
= GetDlgItem(hDlg
, IDC_APPLIST
);
99 hApplicationPageEndTaskButton
= GetDlgItem(hDlg
, IDC_ENDTASK
);
100 hApplicationPageSwitchToButton
= GetDlgItem(hDlg
, IDC_SWITCHTO
);
101 hApplicationPageNewTaskButton
= GetDlgItem(hDlg
, IDC_NEWTASK
);
103 SetWindowText(hApplicationPageListCtrl
, "Tasks");
105 // Initialize the application page's controls
106 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
107 strcpy(szTemp
, "Task");
108 column
.pszText
= szTemp
;
110 ListView_InsertColumn(hApplicationPageListCtrl
, 0, &column
); // Add the "Task" column
111 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
112 strcpy(szTemp
, "Status");
113 column
.pszText
= szTemp
;
115 ListView_InsertColumn(hApplicationPageListCtrl
, 1, &column
); // Add the "Status" column
117 ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(16, 16, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_SMALL
);
118 ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(32, 32, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_NORMAL
);
120 UpdateApplicationListControlViewSetting();
122 // Start our refresh thread
123 _beginthread(ApplicationPageRefreshThread
, 0, NULL
);
128 // Close the event handle, this will make the
129 // refresh thread exit when the wait fails
130 CloseHandle(hApplicationPageEvent
);
135 // Handle the button clicks
136 switch (LOWORD(wParam
))
139 ApplicationPage_OnEndTask();
142 ApplicationPage_OnSwitchTo();
145 SendMessage(hMainWnd
, WM_COMMAND
, MAKEWPARAM(ID_FILE_NEW
, 0), 0);
154 if (wParam
== SIZE_MINIMIZED
)
159 nXDifference
= cx
- nApplicationPageWidth
;
160 nYDifference
= cy
- nApplicationPageHeight
;
161 nApplicationPageWidth
= cx
;
162 nApplicationPageHeight
= cy
;
164 // Reposition the application page's controls
165 GetWindowRect(hApplicationPageListCtrl
, &rc
);
166 cx
= (rc
.right
- rc
.left
) + nXDifference
;
167 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
168 SetWindowPos(hApplicationPageListCtrl
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
169 InvalidateRect(hApplicationPageListCtrl
, NULL
, TRUE
);
171 GetClientRect(hApplicationPageEndTaskButton
, &rc
);
172 MapWindowPoints(hApplicationPageEndTaskButton
, hDlg
, (LPPOINT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
173 cx
= rc
.left
+ nXDifference
;
174 cy
= rc
.top
+ nYDifference
;
175 SetWindowPos(hApplicationPageEndTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
176 InvalidateRect(hApplicationPageEndTaskButton
, NULL
, TRUE
);
178 GetClientRect(hApplicationPageSwitchToButton
, &rc
);
179 MapWindowPoints(hApplicationPageSwitchToButton
, hDlg
, (LPPOINT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
180 cx
= rc
.left
+ nXDifference
;
181 cy
= rc
.top
+ nYDifference
;
182 SetWindowPos(hApplicationPageSwitchToButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
183 InvalidateRect(hApplicationPageSwitchToButton
, NULL
, TRUE
);
185 GetClientRect(hApplicationPageNewTaskButton
, &rc
);
186 MapWindowPoints(hApplicationPageNewTaskButton
, hDlg
, (LPPOINT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
187 cx
= rc
.left
+ nXDifference
;
188 cy
= rc
.top
+ nYDifference
;
189 SetWindowPos(hApplicationPageNewTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
190 InvalidateRect(hApplicationPageNewTaskButton
, NULL
, TRUE
);
195 ApplicationPageOnNotify(wParam
, lParam
);
203 void RefreshApplicationPage(void)
205 // Signal the event so that our refresh thread
206 // will wake up and refresh the application page
207 SetEvent(hApplicationPageEvent
);
210 void UpdateApplicationListControlViewSetting(void)
212 DWORD dwStyle
= GetWindowLong(hApplicationPageListCtrl
, GWL_STYLE
);
214 dwStyle
&= ~LVS_REPORT
;
215 dwStyle
&= ~LVS_ICON
;
216 dwStyle
&= ~LVS_LIST
;
217 dwStyle
&= ~LVS_SMALLICON
;
219 if (TaskManagerSettings
.View_LargeIcons
)
221 else if (TaskManagerSettings
.View_SmallIcons
)
222 dwStyle
|= LVS_SMALLICON
;
224 dwStyle
|= LVS_REPORT
;
226 SetWindowLong(hApplicationPageListCtrl
, GWL_STYLE
, dwStyle
);
228 RefreshApplicationPage();
231 void ApplicationPageRefreshThread(void *lpParameter
)
234 hApplicationPageEvent
= CreateEvent(NULL
, TRUE
, TRUE
, "Application Page Event");
236 // If we couldn't create the event then exit the thread
237 if (!hApplicationPageEvent
)
245 dwWaitVal
= WaitForSingleObject(hApplicationPageEvent
, INFINITE
);
247 // If the wait failed then the event object must have been
248 // closed and the task manager is exiting so exit this thread
249 if (dwWaitVal
== WAIT_FAILED
)
252 if (dwWaitVal
== WAIT_OBJECT_0
)
255 ResetEvent(hApplicationPageEvent
);
260 * Should this be EnumDesktopWindows() instead?
262 EnumWindows(EnumWindowsProc
, 0);
267 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
)
274 if (hWnd
== hMainWnd
)
277 bLargeIcon
= TaskManagerSettings
.View_LargeIcons
? TRUE
: FALSE
;
279 GetWindowText(hWnd
, szText
, 260); // Get the window text
281 // Get the icon for this window
283 SendMessageTimeout(hWnd
, WM_GETICON
, bLargeIcon
? ICON_BIG
/*1*/ : ICON_SMALL
/*0*/, 0, 0, 1000, (unsigned long*)&hIcon
);
287 hIcon
= (HICON
)GetClassLong(hWnd
, bLargeIcon
? GCL_HICON
: GCL_HICONSM
);
288 if (!hIcon
) hIcon
= (HICON
)GetClassLong(hWnd
, bLargeIcon
? GCL_HICONSM
: GCL_HICON
);
289 if (!hIcon
) SendMessageTimeout(hWnd
, WM_QUERYDRAGICON
, 0, 0, 0, 1000, (unsigned long*)&hIcon
);
290 if (!hIcon
) SendMessageTimeout(hWnd
, WM_GETICON
, bLargeIcon
? ICON_SMALL
/*0*/ : ICON_BIG
/*1*/, 0, 0, 1000, (unsigned long*)&hIcon
);
294 hIcon
= LoadIcon(hInst
, bLargeIcon
? MAKEINTRESOURCE(IDI_WINDOW
) : MAKEINTRESOURCE(IDI_WINDOWSM
));
296 // Check and see if this is a top-level app window
297 if ((strlen(szText
) <= 0) ||
298 !IsWindowVisible(hWnd
) ||
299 (GetParent(hWnd
) != NULL
) ||
300 (GetWindow(hWnd
, GW_OWNER
) != NULL
) ||
301 (GetWindowLong(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
303 return TRUE
; // Skip this window
308 typedef int (FAR __stdcall
*IsHungAppWindowProc
)(HWND
);
309 IsHungAppWindowProc IsHungAppWindow
;
311 IsHungAppWindow
= (IsHungAppWindowProc
)(FARPROC
)GetProcAddress(GetModuleHandle("USER32.DLL"), "IsHungAppWindow");
314 bHung
= IsHungAppWindow(hWnd
);
316 AddOrUpdateHwnd(hWnd
, szText
, hIcon
, bHung
);
321 void AddOrUpdateHwnd(HWND hWnd
, char *szTitle
, HICON hIcon
, BOOL bHung
)
323 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
324 HIMAGELIST hImageListLarge
;
325 HIMAGELIST hImageListSmall
;
328 BOOL bAlreadyInList
= FALSE
;
329 BOOL bItemRemoved
= FALSE
;
331 memset(&item
, 0, sizeof(LV_ITEM
));
333 // Get the image lists
334 hImageListLarge
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_NORMAL
);
335 hImageListSmall
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_SMALL
);
337 // Check to see if it's already in our list
338 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
340 memset(&item
, 0, sizeof(LV_ITEM
));
341 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
343 ListView_GetItem(hApplicationPageListCtrl
, &item
);
345 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
346 if (pAPLI
->hWnd
== hWnd
)
348 bAlreadyInList
= TRUE
;
353 // If it is already in the list then update it if necessary
356 // Check to see if anything needs updating
357 if ((pAPLI
->hIcon
!= hIcon
) ||
358 (stricmp(pAPLI
->szTitle
, szTitle
) != 0) ||
359 (pAPLI
->bHung
!= bHung
))
361 // Update the structure
362 pAPLI
->hIcon
= hIcon
;
363 pAPLI
->bHung
= bHung
;
364 strcpy(pAPLI
->szTitle
, szTitle
);
366 // Update the image list
367 ImageList_ReplaceIcon(hImageListLarge
, item
.iItem
, hIcon
);
368 ImageList_ReplaceIcon(hImageListSmall
, item
.iItem
, hIcon
);
370 // Update the list view
371 ListView_RedrawItems(hApplicationPageListCtrl
, 0, ListView_GetItemCount(hApplicationPageListCtrl
));
372 //UpdateWindow(hApplicationPageListCtrl);
373 InvalidateRect(hApplicationPageListCtrl
, NULL
, 0);
376 // It is not already in the list so add it
379 pAPLI
= new APPLICATION_PAGE_LIST_ITEM
;
382 pAPLI
->hIcon
= hIcon
;
383 pAPLI
->bHung
= bHung
;
384 strcpy(pAPLI
->szTitle
, szTitle
);
386 // Add the item to the list
387 memset(&item
, 0, sizeof(LV_ITEM
));
388 item
.mask
= LVIF_TEXT
|LVIF_IMAGE
|LVIF_PARAM
;
389 ImageList_AddIcon(hImageListLarge
, hIcon
);
390 item
.iImage
= ImageList_AddIcon(hImageListSmall
, hIcon
);
391 item
.pszText
= LPSTR_TEXTCALLBACK
;
392 item
.iItem
= ListView_GetItemCount(hApplicationPageListCtrl
);
393 item
.lParam
= (LPARAM
)pAPLI
;
394 ListView_InsertItem(hApplicationPageListCtrl
, &item
);
398 // Check to see if we need to remove any items from the list
399 for (i
=ListView_GetItemCount(hApplicationPageListCtrl
)-1; i
>=0; i
--)
401 memset(&item
, 0, sizeof(LV_ITEM
));
402 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
404 ListView_GetItem(hApplicationPageListCtrl
, &item
);
406 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
407 if (!IsWindow(pAPLI
->hWnd
)||
408 (strlen(pAPLI
->szTitle
) <= 0) ||
409 !IsWindowVisible(pAPLI
->hWnd
) ||
410 (GetParent(pAPLI
->hWnd
) != NULL
) ||
411 (GetWindow(pAPLI
->hWnd
, GW_OWNER
) != NULL
) ||
412 (GetWindowLong(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
414 ImageList_Remove(hImageListLarge
, item
.iItem
);
415 ImageList_Remove(hImageListSmall
, item
.iItem
);
417 ListView_DeleteItem(hApplicationPageListCtrl
, item
.iItem
);
424 // If an item was removed from the list then
425 // we need to resync all the items with the
430 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
432 memset(&item
, 0, sizeof(LV_ITEM
));
433 item
.mask
= LVIF_IMAGE
;
436 ListView_SetItem(hApplicationPageListCtrl
, &item
);
440 ApplicationPageUpdate();
443 void ApplicationPageUpdate(void)
445 // Enable or disable the "End Task" & "Switch To" buttons
446 if (ListView_GetSelectedCount(hApplicationPageListCtrl
))
448 EnableWindow(hApplicationPageEndTaskButton
, TRUE
);
449 EnableWindow(hApplicationPageSwitchToButton
, TRUE
);
453 EnableWindow(hApplicationPageEndTaskButton
, FALSE
);
454 EnableWindow(hApplicationPageSwitchToButton
, FALSE
);
457 // If we are on the applications tab the the windows menu will
458 // be present on the menu bar so enable & disable the menu items
459 if (TabCtrl_GetCurSel(hTabWnd
) == 0)
464 hMenu
= GetMenu(hMainWnd
);
465 hWindowsMenu
= GetSubMenu(hMenu
, 3);
467 // Only one item selected
468 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
470 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
471 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
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_DISABLED
|MF_GRAYED
);
475 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
477 // More than one item selected
478 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
480 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
481 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
482 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
483 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
484 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
485 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
490 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
491 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
492 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
493 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
494 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
495 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
500 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
)
507 idctrl
= (int) wParam
;
508 pnmh
= (LPNMHDR
) lParam
;
509 pnmv
= (LPNM_LISTVIEW
) lParam
;
510 pnmdi
= (LV_DISPINFO
*) lParam
;
512 if (pnmh
->hwndFrom
== hApplicationPageListCtrl
)
516 case LVN_ITEMCHANGED
:
517 ApplicationPageUpdate();
520 case LVN_GETDISPINFO
:
521 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
;
523 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)pnmdi
->item
.lParam
;
525 // Update the item text
526 if (pnmdi
->item
.iSubItem
== 0)
528 strncpy(pnmdi
->item
.pszText
, pAPLI
->szTitle
, pnmdi
->item
.cchTextMax
);
531 // Update the item status
532 else if (pnmdi
->item
.iSubItem
== 1)
535 strncpy(pnmdi
->item
.pszText
, "Not Responding", pnmdi
->item
.cchTextMax
);
537 strncpy(pnmdi
->item
.pszText
, "Running", pnmdi
->item
.cchTextMax
);
544 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
546 ApplicationPageShowContextMenu1();
550 ApplicationPageShowContextMenu2();
557 ApplicationPage_OnSwitchTo();
562 else if (pnmh
->hwndFrom
== ListView_GetHeader(hApplicationPageListCtrl
))
568 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
570 ApplicationPageShowContextMenu1();
574 ApplicationPageShowContextMenu2();
581 ListView_SortItems(hApplicationPageListCtrl
, ApplicationPageCompareFunc
, 0);
582 bSortAscending
= !bSortAscending
;
590 void ApplicationPageShowContextMenu1(void)
598 hMenu
= LoadMenu(hInst
, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT1
));
599 hSubMenu
= GetSubMenu(hMenu
, 0);
601 if (TaskManagerSettings
.View_LargeIcons
)
602 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
603 else if (TaskManagerSettings
.View_SmallIcons
)
604 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
606 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
608 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
613 void ApplicationPageShowContextMenu2(void)
621 hMenu
= LoadMenu(hInst
, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT2
));
622 hSubMenu
= GetSubMenu(hMenu
, 0);
624 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
626 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
627 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
628 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
629 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
630 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
631 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
633 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
635 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
636 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
637 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
638 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
639 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
640 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
644 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
645 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
646 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
647 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
648 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
649 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
652 SetMenuDefaultItem(hSubMenu
, ID_APPLICATION_PAGE_SWITCHTO
, MF_BYCOMMAND
);
654 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
659 void ApplicationPage_OnViewLargeIcons(void)
664 hMenu
= GetMenu(hMainWnd
);
665 hViewMenu
= GetSubMenu(hMenu
, 2);
667 TaskManagerSettings
.View_LargeIcons
= TRUE
;
668 TaskManagerSettings
.View_SmallIcons
= FALSE
;
669 TaskManagerSettings
.View_Details
= FALSE
;
670 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
672 UpdateApplicationListControlViewSetting();
675 void ApplicationPage_OnViewSmallIcons(void)
680 hMenu
= GetMenu(hMainWnd
);
681 hViewMenu
= GetSubMenu(hMenu
, 2);
683 TaskManagerSettings
.View_LargeIcons
= FALSE
;
684 TaskManagerSettings
.View_SmallIcons
= TRUE
;
685 TaskManagerSettings
.View_Details
= FALSE
;
686 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
688 UpdateApplicationListControlViewSetting();
691 void ApplicationPage_OnViewDetails(void)
696 hMenu
= GetMenu(hMainWnd
);
697 hViewMenu
= GetSubMenu(hMenu
, 2);
699 TaskManagerSettings
.View_LargeIcons
= FALSE
;
700 TaskManagerSettings
.View_SmallIcons
= FALSE
;
701 TaskManagerSettings
.View_Details
= TRUE
;
702 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
704 UpdateApplicationListControlViewSetting();
707 void ApplicationPage_OnWindowsTileHorizontally(void)
709 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
715 hWndArray
= new HWND
[ListView_GetItemCount(hApplicationPageListCtrl
)];
718 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
720 memset(&item
, 0, sizeof(LV_ITEM
));
721 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
723 item
.stateMask
= (UINT
)-1;
724 ListView_GetItem(hApplicationPageListCtrl
, &item
);
726 if (item
.state
& LVIS_SELECTED
)
728 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
732 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
738 TileWindows(NULL
, MDITILE_HORIZONTAL
, NULL
, nWndCount
, hWndArray
);
743 void ApplicationPage_OnWindowsTileVertically(void)
745 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
751 hWndArray
= new HWND
[ListView_GetItemCount(hApplicationPageListCtrl
)];
754 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
756 memset(&item
, 0, sizeof(LV_ITEM
));
757 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
759 item
.stateMask
= (UINT
)-1;
760 ListView_GetItem(hApplicationPageListCtrl
, &item
);
762 if (item
.state
& LVIS_SELECTED
)
764 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
768 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
774 TileWindows(NULL
, MDITILE_VERTICAL
, NULL
, nWndCount
, hWndArray
);
779 void ApplicationPage_OnWindowsMinimize(void)
781 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
785 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
787 memset(&item
, 0, sizeof(LV_ITEM
));
788 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
790 item
.stateMask
= (UINT
)-1;
791 ListView_GetItem(hApplicationPageListCtrl
, &item
);
793 if (item
.state
& LVIS_SELECTED
)
795 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
799 ShowWindow(pAPLI
->hWnd
, SW_MINIMIZE
);
805 void ApplicationPage_OnWindowsMaximize(void)
807 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
811 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
813 memset(&item
, 0, sizeof(LV_ITEM
));
814 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
816 item
.stateMask
= (UINT
)-1;
817 ListView_GetItem(hApplicationPageListCtrl
, &item
);
819 if (item
.state
& LVIS_SELECTED
)
821 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
825 ShowWindow(pAPLI
->hWnd
, SW_MAXIMIZE
);
831 void ApplicationPage_OnWindowsCascade(void)
833 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
839 hWndArray
= new HWND
[ListView_GetItemCount(hApplicationPageListCtrl
)];
842 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
844 memset(&item
, 0, sizeof(LV_ITEM
));
845 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
847 item
.stateMask
= (UINT
)-1;
848 ListView_GetItem(hApplicationPageListCtrl
, &item
);
850 if (item
.state
& LVIS_SELECTED
)
852 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
856 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
862 CascadeWindows(NULL
, 0, NULL
, nWndCount
, hWndArray
);
867 void ApplicationPage_OnWindowsBringToFront(void)
869 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
873 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
875 memset(&item
, 0, sizeof(LV_ITEM
));
876 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
878 item
.stateMask
= (UINT
)-1;
879 ListView_GetItem(hApplicationPageListCtrl
, &item
);
881 if (item
.state
& LVIS_SELECTED
)
883 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
890 if (IsIconic(pAPLI
->hWnd
))
891 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
893 BringWindowToTop(pAPLI
->hWnd
);
897 void ApplicationPage_OnSwitchTo(void)
899 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
903 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
905 memset(&item
, 0, sizeof(LV_ITEM
));
906 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
908 item
.stateMask
= (UINT
)-1;
909 ListView_GetItem(hApplicationPageListCtrl
, &item
);
911 if (item
.state
& LVIS_SELECTED
)
913 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
920 typedef void (WINAPI
*PROCSWITCHTOTHISWINDOW
) (HWND
, BOOL
);
921 PROCSWITCHTOTHISWINDOW SwitchToThisWindow
;
923 HMODULE hUser32
= GetModuleHandle("user32");
925 SwitchToThisWindow
= (PROCSWITCHTOTHISWINDOW
)GetProcAddress(hUser32
, "SwitchToThisWindow");
928 if (SwitchToThisWindow
)
929 SwitchToThisWindow(pAPLI
->hWnd
, TRUE
);
932 if (IsIconic(pAPLI
->hWnd
))
933 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
935 BringWindowToTop(pAPLI
->hWnd
);
936 SetForegroundWindow(pAPLI
->hWnd
);
939 if (TaskManagerSettings
.MinimizeOnUse
)
940 ShowWindow(hMainWnd
, SW_MINIMIZE
);
944 void ApplicationPage_OnEndTask(void)
946 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
950 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
952 memset(&item
, 0, sizeof(LV_ITEM
));
953 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
955 item
.stateMask
= (UINT
)-1;
956 ListView_GetItem(hApplicationPageListCtrl
, &item
);
958 if (item
.state
& LVIS_SELECTED
)
960 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
964 PostMessage(pAPLI
->hWnd
, WM_CLOSE
, 0, 0);
970 void ApplicationPage_OnGotoProcess(void)
972 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
977 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
979 memset(&item
, 0, sizeof(LV_ITEM
));
980 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
982 item
.stateMask
= (UINT
)-1;
983 ListView_GetItem(hApplicationPageListCtrl
, &item
);
985 if (item
.state
& LVIS_SELECTED
)
987 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
996 GetWindowThreadProcessId(pAPLI
->hWnd
, &dwProcessId
);
999 // Switch to the process tab
1001 TabCtrl_SetCurFocus(hTabWnd
, 1);
1004 // FIXME: Select the process item in the list
1006 for (i
=0; i
<ListView_GetItemCount(hProcessPage
); i
++)
1013 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
1015 LPAPPLICATION_PAGE_LIST_ITEM Param1
;
1016 LPAPPLICATION_PAGE_LIST_ITEM Param2
;
1020 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
1021 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
1025 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
1026 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
1028 return strcmp(Param1
->szTitle
, Param2
->szTitle
);