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.
23 #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
43 } APPLICATION_PAGE_LIST_ITEM
, *LPAPPLICATION_PAGE_LIST_ITEM
;
45 HWND hApplicationPage
; // Application List Property Page
47 HWND hApplicationPageListCtrl
; // Application ListCtrl Window
48 HWND hApplicationPageEndTaskButton
; // Application End Task button
49 HWND hApplicationPageSwitchToButton
; // Application Switch To button
50 HWND hApplicationPageNewTaskButton
; // Application New Task button
52 static int nApplicationPageWidth
;
53 static int nApplicationPageHeight
;
55 static HANDLE hApplicationPageEvent
= NULL
; // When this event becomes signaled then we refresh the app list
57 static BOOL bSortAscending
= TRUE
;
59 void ApplicationPageRefreshThread(void *lpParameter
);
60 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
);
61 void AddOrUpdateHwnd(HWND hWnd
, TCHAR
*szTitle
, HICON hIcon
, BOOL bHung
);
62 void ApplicationPageUpdate(void);
63 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
);
64 void ApplicationPageShowContextMenu1(void);
65 void ApplicationPageShowContextMenu2(void);
66 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
);
68 //void SwitchToThisWindow (
69 //HWND hWnd, // Handle to the window that should be activated
70 //BOOL bRestore // Restore the window if it is minimized
73 LRESULT CALLBACK
ApplicationPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
85 // Save the width and height
86 GetClientRect(hDlg
, &rc
);
87 nApplicationPageWidth
= rc
.right
;
88 nApplicationPageHeight
= rc
.bottom
;
90 // Update window position
91 SetWindowPos(hDlg
, NULL
, 15, 30, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
93 // Get handles to the controls
94 hApplicationPageListCtrl
= GetDlgItem(hDlg
, IDC_APPLIST
);
95 hApplicationPageEndTaskButton
= GetDlgItem(hDlg
, IDC_ENDTASK
);
96 hApplicationPageSwitchToButton
= GetDlgItem(hDlg
, IDC_SWITCHTO
);
97 hApplicationPageNewTaskButton
= GetDlgItem(hDlg
, IDC_NEWTASK
);
99 SetWindowText(hApplicationPageListCtrl
, _T("Tasks"));
101 // Initialize the application page's controls
102 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
103 _tcscpy(szTemp
, _T("Task"));
104 column
.pszText
= szTemp
;
106 ListView_InsertColumn(hApplicationPageListCtrl
, 0, &column
); // Add the "Task" column
107 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
108 _tcscpy(szTemp
, _T("Status"));
109 column
.pszText
= szTemp
;
111 ListView_InsertColumn(hApplicationPageListCtrl
, 1, &column
); // Add the "Status" column
113 ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(16, 16, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_SMALL
);
114 ListView_SetImageList(hApplicationPageListCtrl
, ImageList_Create(32, 32, ILC_COLOR8
|ILC_MASK
, 0, 1), LVSIL_NORMAL
);
116 UpdateApplicationListControlViewSetting();
118 // Start our refresh thread
119 _beginthread(ApplicationPageRefreshThread
, 0, NULL
);
124 // Close the event handle, this will make the
125 // refresh thread exit when the wait fails
126 CloseHandle(hApplicationPageEvent
);
131 // Handle the button clicks
132 switch (LOWORD(wParam
))
135 ApplicationPage_OnEndTask();
138 ApplicationPage_OnSwitchTo();
141 SendMessage(hMainWnd
, WM_COMMAND
, MAKEWPARAM(ID_FILE_NEW
, 0), 0);
148 if (wParam
== SIZE_MINIMIZED
)
153 nXDifference
= cx
- nApplicationPageWidth
;
154 nYDifference
= cy
- nApplicationPageHeight
;
155 nApplicationPageWidth
= cx
;
156 nApplicationPageHeight
= cy
;
158 // Reposition the application page's controls
159 GetWindowRect(hApplicationPageListCtrl
, &rc
);
160 cx
= (rc
.right
- rc
.left
) + nXDifference
;
161 cy
= (rc
.bottom
- rc
.top
) + nYDifference
;
162 SetWindowPos(hApplicationPageListCtrl
, NULL
, 0, 0, cx
, cy
, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOMOVE
|SWP_NOZORDER
);
163 InvalidateRect(hApplicationPageListCtrl
, NULL
, TRUE
);
165 GetClientRect(hApplicationPageEndTaskButton
, &rc
);
166 MapWindowPoints(hApplicationPageEndTaskButton
, hDlg
, (LPPOINT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
167 cx
= rc
.left
+ nXDifference
;
168 cy
= rc
.top
+ nYDifference
;
169 SetWindowPos(hApplicationPageEndTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
170 InvalidateRect(hApplicationPageEndTaskButton
, NULL
, TRUE
);
172 GetClientRect(hApplicationPageSwitchToButton
, &rc
);
173 MapWindowPoints(hApplicationPageSwitchToButton
, hDlg
, (LPPOINT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
174 cx
= rc
.left
+ nXDifference
;
175 cy
= rc
.top
+ nYDifference
;
176 SetWindowPos(hApplicationPageSwitchToButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
177 InvalidateRect(hApplicationPageSwitchToButton
, NULL
, TRUE
);
179 GetClientRect(hApplicationPageNewTaskButton
, &rc
);
180 MapWindowPoints(hApplicationPageNewTaskButton
, hDlg
, (LPPOINT
)(&rc
), (sizeof(RECT
)/sizeof(POINT
)) );
181 cx
= rc
.left
+ nXDifference
;
182 cy
= rc
.top
+ nYDifference
;
183 SetWindowPos(hApplicationPageNewTaskButton
, NULL
, cx
, cy
, 0, 0, SWP_NOACTIVATE
|SWP_NOOWNERZORDER
|SWP_NOSIZE
|SWP_NOZORDER
);
184 InvalidateRect(hApplicationPageNewTaskButton
, NULL
, TRUE
);
189 ApplicationPageOnNotify(wParam
, lParam
);
197 void RefreshApplicationPage(void)
199 // Signal the event so that our refresh thread
200 // will wake up and refresh the application page
201 SetEvent(hApplicationPageEvent
);
204 void UpdateApplicationListControlViewSetting(void)
206 DWORD dwStyle
= GetWindowLong(hApplicationPageListCtrl
, GWL_STYLE
);
208 dwStyle
&= ~LVS_REPORT
;
209 dwStyle
&= ~LVS_ICON
;
210 dwStyle
&= ~LVS_LIST
;
211 dwStyle
&= ~LVS_SMALLICON
;
213 if (TaskManagerSettings
.View_LargeIcons
)
215 else if (TaskManagerSettings
.View_SmallIcons
)
216 dwStyle
|= LVS_SMALLICON
;
218 dwStyle
|= LVS_REPORT
;
220 SetWindowLong(hApplicationPageListCtrl
, GWL_STYLE
, dwStyle
);
222 RefreshApplicationPage();
225 void ApplicationPageRefreshThread(void *lpParameter
)
228 hApplicationPageEvent
= CreateEvent(NULL
, TRUE
, TRUE
, _T("Application Page Event"));
230 // If we couldn't create the event then exit the thread
231 if (!hApplicationPageEvent
)
239 dwWaitVal
= WaitForSingleObject(hApplicationPageEvent
, INFINITE
);
241 // If the wait failed then the event object must have been
242 // closed and the task manager is exiting so exit this thread
243 if (dwWaitVal
== WAIT_FAILED
)
246 if (dwWaitVal
== WAIT_OBJECT_0
)
249 ResetEvent(hApplicationPageEvent
);
254 * Should this be EnumDesktopWindows() instead?
256 EnumWindows(EnumWindowsProc
, 0);
261 BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
)
267 typedef int (FAR __stdcall
*IsHungAppWindowProc
)(HWND
);
268 IsHungAppWindowProc IsHungAppWindow
;
272 if (hWnd
== hMainWnd
)
275 bLargeIcon
= TaskManagerSettings
.View_LargeIcons
? TRUE
: FALSE
;
277 GetWindowText(hWnd
, szText
, 260); // Get the window text
279 // Get the icon for this window
281 SendMessageTimeout(hWnd
, WM_GETICON
, bLargeIcon
? ICON_BIG
/*1*/ : ICON_SMALL
/*0*/, 0, 0, 1000, (unsigned long*)&hIcon
);
285 hIcon
= (HICON
)GetClassLong(hWnd
, bLargeIcon
? GCL_HICON
: GCL_HICONSM
);
286 if (!hIcon
) hIcon
= (HICON
)GetClassLong(hWnd
, bLargeIcon
? GCL_HICONSM
: GCL_HICON
);
287 if (!hIcon
) SendMessageTimeout(hWnd
, WM_QUERYDRAGICON
, 0, 0, 0, 1000, (unsigned long*)&hIcon
);
288 if (!hIcon
) SendMessageTimeout(hWnd
, WM_GETICON
, bLargeIcon
? ICON_SMALL
/*0*/ : ICON_BIG
/*1*/, 0, 0, 1000, (unsigned long*)&hIcon
);
292 hIcon
= LoadIcon(hInst
, bLargeIcon
? MAKEINTRESOURCE(IDI_WINDOW
) : MAKEINTRESOURCE(IDI_WINDOWSM
));
294 // Check and see if this is a top-level app window
295 if ((_tcslen(szText
) <= 0) ||
296 !IsWindowVisible(hWnd
) ||
297 (GetParent(hWnd
) != NULL
) ||
298 (GetWindow(hWnd
, GW_OWNER
) != NULL
) ||
299 (GetWindowLong(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
301 return TRUE
; // Skip this window
306 //IsHungAppWindow = (IsHungAppWindowProc)(FARPROC)GetProcAddress(GetModuleHandle(_T("USER32.DLL")), _T("IsHungAppWindow"));
307 //IsHungAppWindow = (IsHungAppWindowProc)(FARPROC)GetProcAddress(GetModuleHandle("USER32.DLL"), _T("IsHungAppWindow"));
308 IsHungAppWindow
= (IsHungAppWindowProc
)(FARPROC
)GetProcAddress(GetModuleHandle(_T("USER32.DLL")), "IsHungAppWindow");
311 bHung
= IsHungAppWindow(hWnd
);
313 AddOrUpdateHwnd(hWnd
, szText
, hIcon
, bHung
);
318 void AddOrUpdateHwnd(HWND hWnd
, TCHAR
*szTitle
, HICON hIcon
, BOOL bHung
)
320 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
321 HIMAGELIST hImageListLarge
;
322 HIMAGELIST hImageListSmall
;
325 BOOL bAlreadyInList
= FALSE
;
326 BOOL bItemRemoved
= FALSE
;
328 memset(&item
, 0, sizeof(LV_ITEM
));
330 // Get the image lists
331 hImageListLarge
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_NORMAL
);
332 hImageListSmall
= ListView_GetImageList(hApplicationPageListCtrl
, LVSIL_SMALL
);
334 // Check to see if it's already in our list
335 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
337 memset(&item
, 0, sizeof(LV_ITEM
));
338 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
340 ListView_GetItem(hApplicationPageListCtrl
, &item
);
342 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
343 if (pAPLI
->hWnd
== hWnd
)
345 bAlreadyInList
= TRUE
;
350 // If it is already in the list then update it if necessary
353 // Check to see if anything needs updating
354 if ((pAPLI
->hIcon
!= hIcon
) ||
355 (_tcsicmp(pAPLI
->szTitle
, szTitle
) != 0) ||
356 (pAPLI
->bHung
!= bHung
))
358 // Update the structure
359 pAPLI
->hIcon
= hIcon
;
360 pAPLI
->bHung
= bHung
;
361 _tcscpy(pAPLI
->szTitle
, szTitle
);
363 // Update the image list
364 ImageList_ReplaceIcon(hImageListLarge
, item
.iItem
, hIcon
);
365 ImageList_ReplaceIcon(hImageListSmall
, item
.iItem
, hIcon
);
367 // Update the list view
368 ListView_RedrawItems(hApplicationPageListCtrl
, 0, ListView_GetItemCount(hApplicationPageListCtrl
));
369 //UpdateWindow(hApplicationPageListCtrl);
370 InvalidateRect(hApplicationPageListCtrl
, NULL
, 0);
373 // It is not already in the list so add it
376 //pAPLI = new APPLICATION_PAGE_LIST_ITEM;
377 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)malloc(sizeof(APPLICATION_PAGE_LIST_ITEM
));
380 pAPLI
->hIcon
= hIcon
;
381 pAPLI
->bHung
= bHung
;
382 _tcscpy(pAPLI
->szTitle
, szTitle
);
384 // Add the item to the list
385 memset(&item
, 0, sizeof(LV_ITEM
));
386 item
.mask
= LVIF_TEXT
|LVIF_IMAGE
|LVIF_PARAM
;
387 ImageList_AddIcon(hImageListLarge
, hIcon
);
388 item
.iImage
= ImageList_AddIcon(hImageListSmall
, hIcon
);
389 item
.pszText
= LPSTR_TEXTCALLBACK
;
390 item
.iItem
= ListView_GetItemCount(hApplicationPageListCtrl
);
391 item
.lParam
= (LPARAM
)pAPLI
;
392 ListView_InsertItem(hApplicationPageListCtrl
, &item
);
396 // Check to see if we need to remove any items from the list
397 for (i
=ListView_GetItemCount(hApplicationPageListCtrl
)-1; i
>=0; i
--)
399 memset(&item
, 0, sizeof(LV_ITEM
));
400 item
.mask
= LVIF_IMAGE
|LVIF_PARAM
;
402 ListView_GetItem(hApplicationPageListCtrl
, &item
);
404 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
405 if (!IsWindow(pAPLI
->hWnd
)||
406 (_tcslen(pAPLI
->szTitle
) <= 0) ||
407 !IsWindowVisible(pAPLI
->hWnd
) ||
408 (GetParent(pAPLI
->hWnd
) != NULL
) ||
409 (GetWindow(pAPLI
->hWnd
, GW_OWNER
) != NULL
) ||
410 (GetWindowLong(hWnd
, GWL_EXSTYLE
) & WS_EX_TOOLWINDOW
))
412 ImageList_Remove(hImageListLarge
, item
.iItem
);
413 ImageList_Remove(hImageListSmall
, item
.iItem
);
415 ListView_DeleteItem(hApplicationPageListCtrl
, item
.iItem
);
423 // If an item was removed from the list then
424 // we need to resync all the items with the
429 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++)
431 memset(&item
, 0, sizeof(LV_ITEM
));
432 item
.mask
= LVIF_IMAGE
;
435 ListView_SetItem(hApplicationPageListCtrl
, &item
);
439 ApplicationPageUpdate();
442 void ApplicationPageUpdate(void)
444 // Enable or disable the "End Task" & "Switch To" buttons
445 if (ListView_GetSelectedCount(hApplicationPageListCtrl
))
447 EnableWindow(hApplicationPageEndTaskButton
, TRUE
);
448 EnableWindow(hApplicationPageSwitchToButton
, TRUE
);
452 EnableWindow(hApplicationPageEndTaskButton
, FALSE
);
453 EnableWindow(hApplicationPageSwitchToButton
, FALSE
);
456 // If we are on the applications tab the the windows menu will
457 // be present on the menu bar so enable & disable the menu items
458 if (TabCtrl_GetCurSel(hTabWnd
) == 0)
463 hMenu
= GetMenu(hMainWnd
);
464 hWindowsMenu
= GetSubMenu(hMenu
, 3);
466 // Only one item selected
467 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
469 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
470 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
471 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
472 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
473 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
474 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
476 // More than one item selected
477 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
479 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
480 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
481 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
482 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
483 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
484 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
489 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
490 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
491 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
492 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
493 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
494 EnableMenuItem(hWindowsMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
499 void ApplicationPageOnNotify(WPARAM wParam
, LPARAM lParam
)
505 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
;
508 idctrl
= (int) wParam
;
509 pnmh
= (LPNMHDR
) lParam
;
510 pnmv
= (LPNM_LISTVIEW
) lParam
;
511 pnmdi
= (LV_DISPINFO
*) lParam
;
513 if (pnmh
->hwndFrom
== hApplicationPageListCtrl
) {
514 switch (pnmh
->code
) {
515 case LVN_ITEMCHANGED
:
516 ApplicationPageUpdate();
519 case LVN_GETDISPINFO
:
520 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)pnmdi
->item
.lParam
;
522 // Update the item text
523 if (pnmdi
->item
.iSubItem
== 0)
525 _tcsncpy(pnmdi
->item
.pszText
, pAPLI
->szTitle
, pnmdi
->item
.cchTextMax
);
528 // Update the item status
529 else if (pnmdi
->item
.iSubItem
== 1)
532 _tcsncpy(pnmdi
->item
.pszText
, _T("Not Responding"), pnmdi
->item
.cchTextMax
);
534 _tcsncpy(pnmdi
->item
.pszText
, _T("Running"), pnmdi
->item
.cchTextMax
);
541 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
543 ApplicationPageShowContextMenu1();
547 ApplicationPageShowContextMenu2();
554 ApplicationPage_OnSwitchTo();
559 else if (pnmh
->hwndFrom
== ListView_GetHeader(hApplicationPageListCtrl
))
565 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) < 1)
567 ApplicationPageShowContextMenu1();
571 ApplicationPageShowContextMenu2();
578 ListView_SortItems(hApplicationPageListCtrl
, ApplicationPageCompareFunc
, 0);
579 bSortAscending
= !bSortAscending
;
587 void ApplicationPageShowContextMenu1(void)
595 hMenu
= LoadMenu(hInst
, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT1
));
596 hSubMenu
= GetSubMenu(hMenu
, 0);
598 if (TaskManagerSettings
.View_LargeIcons
)
599 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
600 else if (TaskManagerSettings
.View_SmallIcons
)
601 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
603 CheckMenuRadioItem(hSubMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
605 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
610 void ApplicationPageShowContextMenu2(void)
618 hMenu
= LoadMenu(hInst
, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT2
));
619 hSubMenu
= GetSubMenu(hMenu
, 0);
621 if (ListView_GetSelectedCount(hApplicationPageListCtrl
) == 1)
623 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
624 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
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_DISABLED
|MF_GRAYED
);
628 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_ENABLED
);
630 else if (ListView_GetSelectedCount(hApplicationPageListCtrl
) > 1)
632 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_ENABLED
);
633 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_ENABLED
);
634 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
635 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_ENABLED
);
636 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_ENABLED
);
637 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
641 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEHORIZONTALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
642 EnableMenuItem(hSubMenu
, ID_WINDOWS_TILEVERTICALLY
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
643 EnableMenuItem(hSubMenu
, ID_WINDOWS_MINIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
644 EnableMenuItem(hSubMenu
, ID_WINDOWS_MAXIMIZE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
645 EnableMenuItem(hSubMenu
, ID_WINDOWS_CASCADE
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
646 EnableMenuItem(hSubMenu
, ID_WINDOWS_BRINGTOFRONT
, MF_BYCOMMAND
|MF_DISABLED
|MF_GRAYED
);
649 SetMenuDefaultItem(hSubMenu
, ID_APPLICATION_PAGE_SWITCHTO
, MF_BYCOMMAND
);
651 TrackPopupMenu(hSubMenu
, TPM_LEFTALIGN
|TPM_TOPALIGN
|TPM_LEFTBUTTON
, pt
.x
, pt
.y
, 0, hMainWnd
, NULL
);
656 void ApplicationPage_OnViewLargeIcons(void)
661 hMenu
= GetMenu(hMainWnd
);
662 hViewMenu
= GetSubMenu(hMenu
, 2);
664 TaskManagerSettings
.View_LargeIcons
= TRUE
;
665 TaskManagerSettings
.View_SmallIcons
= FALSE
;
666 TaskManagerSettings
.View_Details
= FALSE
;
667 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_LARGE
, MF_BYCOMMAND
);
669 UpdateApplicationListControlViewSetting();
672 void ApplicationPage_OnViewSmallIcons(void)
677 hMenu
= GetMenu(hMainWnd
);
678 hViewMenu
= GetSubMenu(hMenu
, 2);
680 TaskManagerSettings
.View_LargeIcons
= FALSE
;
681 TaskManagerSettings
.View_SmallIcons
= TRUE
;
682 TaskManagerSettings
.View_Details
= FALSE
;
683 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_SMALL
, MF_BYCOMMAND
);
685 UpdateApplicationListControlViewSetting();
688 void ApplicationPage_OnViewDetails(void)
693 hMenu
= GetMenu(hMainWnd
);
694 hViewMenu
= GetSubMenu(hMenu
, 2);
696 TaskManagerSettings
.View_LargeIcons
= FALSE
;
697 TaskManagerSettings
.View_SmallIcons
= FALSE
;
698 TaskManagerSettings
.View_Details
= TRUE
;
699 CheckMenuRadioItem(hViewMenu
, ID_VIEW_LARGE
, ID_VIEW_DETAILS
, ID_VIEW_DETAILS
, MF_BYCOMMAND
);
701 UpdateApplicationListControlViewSetting();
704 void ApplicationPage_OnWindowsTileHorizontally(void)
706 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
712 hWndArray
= (HWND
*)malloc(sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
715 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
716 memset(&item
, 0, sizeof(LV_ITEM
));
717 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
719 item
.stateMask
= (UINT
)-1;
720 ListView_GetItem(hApplicationPageListCtrl
, &item
);
722 if (item
.state
& LVIS_SELECTED
) {
723 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
726 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
731 TileWindows(NULL
, MDITILE_HORIZONTAL
, NULL
, nWndCount
, hWndArray
);
732 //delete[] hWndArray;
736 void ApplicationPage_OnWindowsTileVertically(void)
738 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
744 //hWndArray = new HWND[ListView_GetItemCount(hApplicationPageListCtrl)];
745 hWndArray
= (HWND
*)malloc(sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
748 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
749 memset(&item
, 0, sizeof(LV_ITEM
));
750 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
752 item
.stateMask
= (UINT
)-1;
753 ListView_GetItem(hApplicationPageListCtrl
, &item
);
755 if (item
.state
& LVIS_SELECTED
) {
756 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
758 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
764 TileWindows(NULL
, MDITILE_VERTICAL
, NULL
, nWndCount
, hWndArray
);
765 //delete[] hWndArray;
769 void ApplicationPage_OnWindowsMinimize(void)
771 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
775 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
776 memset(&item
, 0, sizeof(LV_ITEM
));
777 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
779 item
.stateMask
= (UINT
)-1;
780 ListView_GetItem(hApplicationPageListCtrl
, &item
);
781 if (item
.state
& LVIS_SELECTED
) {
782 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
784 ShowWindow(pAPLI
->hWnd
, SW_MINIMIZE
);
790 void ApplicationPage_OnWindowsMaximize(void)
792 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
796 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
797 memset(&item
, 0, sizeof(LV_ITEM
));
798 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
800 item
.stateMask
= (UINT
)-1;
801 ListView_GetItem(hApplicationPageListCtrl
, &item
);
802 if (item
.state
& LVIS_SELECTED
) {
803 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
805 ShowWindow(pAPLI
->hWnd
, SW_MAXIMIZE
);
811 void ApplicationPage_OnWindowsCascade(void)
813 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
819 //hWndArray = new HWND[ListView_GetItemCount(hApplicationPageListCtrl)];
820 hWndArray
= (HWND
*)malloc(sizeof(HWND
) * ListView_GetItemCount(hApplicationPageListCtrl
));
823 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
824 memset(&item
, 0, sizeof(LV_ITEM
));
825 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
827 item
.stateMask
= (UINT
)-1;
828 ListView_GetItem(hApplicationPageListCtrl
, &item
);
829 if (item
.state
& LVIS_SELECTED
) {
830 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
832 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
837 CascadeWindows(NULL
, 0, NULL
, nWndCount
, hWndArray
);
838 //delete[] hWndArray;
842 void ApplicationPage_OnWindowsBringToFront(void)
844 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
848 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
849 memset(&item
, 0, sizeof(LV_ITEM
));
850 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
852 item
.stateMask
= (UINT
)-1;
853 ListView_GetItem(hApplicationPageListCtrl
, &item
);
854 if (item
.state
& LVIS_SELECTED
) {
855 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
860 if (IsIconic(pAPLI
->hWnd
))
861 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
862 BringWindowToTop(pAPLI
->hWnd
);
866 void ApplicationPage_OnSwitchTo(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 ListView_GetItem(hApplicationPageListCtrl
, &item
);
879 if (item
.state
& LVIS_SELECTED
) {
880 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
885 typedef void (WINAPI
*PROCSWITCHTOTHISWINDOW
) (HWND
, BOOL
);
886 PROCSWITCHTOTHISWINDOW SwitchToThisWindow
;
888 HMODULE hUser32
= GetModuleHandle(_T("USER32"));
889 SwitchToThisWindow
= (PROCSWITCHTOTHISWINDOW
)GetProcAddress(hUser32
, "SwitchToThisWindow");
890 if (SwitchToThisWindow
) {
891 SwitchToThisWindow(pAPLI
->hWnd
, TRUE
);
893 if (IsIconic(pAPLI
->hWnd
))
894 ShowWindow(pAPLI
->hWnd
, SW_RESTORE
);
895 BringWindowToTop(pAPLI
->hWnd
);
896 SetForegroundWindow(pAPLI
->hWnd
);
898 if (TaskManagerSettings
.MinimizeOnUse
)
899 ShowWindow(hMainWnd
, SW_MINIMIZE
);
903 void ApplicationPage_OnEndTask(void)
905 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
909 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
910 memset(&item
, 0, sizeof(LV_ITEM
));
911 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
913 item
.stateMask
= (UINT
)-1;
914 ListView_GetItem(hApplicationPageListCtrl
, &item
);
915 if (item
.state
& LVIS_SELECTED
) {
916 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
918 PostMessage(pAPLI
->hWnd
, WM_CLOSE
, 0, 0);
924 void ApplicationPage_OnGotoProcess(void)
926 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
931 for (i
=0; i
<ListView_GetItemCount(hApplicationPageListCtrl
); i
++) {
932 memset(&item
, 0, sizeof(LV_ITEM
));
933 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
935 item
.stateMask
= (UINT
)-1;
936 ListView_GetItem(hApplicationPageListCtrl
, &item
);
937 if (item
.state
& LVIS_SELECTED
) {
938 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
945 GetWindowThreadProcessId(pAPLI
->hWnd
, &dwProcessId
);
947 // Switch to the process tab
949 TabCtrl_SetCurFocus(hTabWnd
, 1);
951 // FIXME: Select the process item in the list
953 for (i
=0; i
<ListView_GetItemCount(hProcessPage
); i
++) {
958 int CALLBACK
ApplicationPageCompareFunc(LPARAM lParam1
, LPARAM lParam2
, LPARAM lParamSort
)
960 LPAPPLICATION_PAGE_LIST_ITEM Param1
;
961 LPAPPLICATION_PAGE_LIST_ITEM Param2
;
963 if (bSortAscending
) {
964 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
965 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
967 Param1
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam2
;
968 Param2
= (LPAPPLICATION_PAGE_LIST_ITEM
)lParam1
;
970 return _tcscmp(Param1
->szTitle
, Param2
->szTitle
);