fixed some compile problems with msvc 2003/2005
[reactos.git] / reactos / subsys / system / taskmgr / applpage.c
1 /*
2 * ReactOS Task Manager
3 *
4 * applicationpage.cpp
5 *
6 * Copyright (C) 1999 - 2001 Brian Palmer <brianp@reactos.org>
7 * 2005 Klemens Friedl <frik85@reactos.at>
8 *
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.
13 *
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.
18 *
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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
22 */
23
24 #include "precomp.h"
25
26 typedef struct
27 {
28 HWND hWnd;
29 TCHAR szTitle[260];
30 HICON hIcon;
31 BOOL bHung;
32 } APPLICATION_PAGE_LIST_ITEM, *LPAPPLICATION_PAGE_LIST_ITEM;
33
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);
44 BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam);
45 void AddOrUpdateHwnd(HWND hWnd, TCHAR *szTitle, HICON hIcon, BOOL bHung);
46 void ApplicationPageUpdate(void);
47 void ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam);
48 void ApplicationPageShowContextMenu1(void);
49 void ApplicationPageShowContextMenu2(void);
50 int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
51 int PerfGetIndexByProcessId(DWORD dwProcessId);
52
53 #if 0
54 void SwitchToThisWindow (
55 HWND hWnd, /* Handle to the window that should be activated */
56 BOOL bRestore /* Restore the window if it is minimized */
57 );
58 #endif
59
60 INT_PTR CALLBACK
61 ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
62 {
63 RECT rc;
64 int nXDifference;
65 int nYDifference;
66 LV_COLUMN column;
67 TCHAR szTemp[256];
68 int cx, cy;
69
70 switch (message) {
71 case WM_INITDIALOG:
72
73 /* Save the width and height */
74 GetClientRect(hDlg, &rc);
75 nApplicationPageWidth = rc.right;
76 nApplicationPageHeight = rc.bottom;
77
78 /* Update window position */
79 SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
80
81 /* Get handles to the controls */
82 hApplicationPageListCtrl = GetDlgItem(hDlg, IDC_APPLIST);
83 hApplicationPageEndTaskButton = GetDlgItem(hDlg, IDC_ENDTASK);
84 hApplicationPageSwitchToButton = GetDlgItem(hDlg, IDC_SWITCHTO);
85 hApplicationPageNewTaskButton = GetDlgItem(hDlg, IDC_NEWTASK);
86
87 SetWindowText(hApplicationPageListCtrl, _T("Tasks"));
88
89 /* Initialize the application page's controls */
90 column.mask = LVCF_TEXT|LVCF_WIDTH;
91
92 LoadString(hInst, IDS_TAB_TASK, szTemp, 256);
93 column.pszText = szTemp;
94 column.cx = 250;
95 ListView_InsertColumn(hApplicationPageListCtrl, 0, &column); /* Add the "Task" column */
96 column.mask = LVCF_TEXT|LVCF_WIDTH;
97 LoadString(hInst, IDS_TAB_STATUS, szTemp, 256);
98 column.pszText = szTemp;
99 column.cx = 95;
100 ListView_InsertColumn(hApplicationPageListCtrl, 1, &column); /* Add the "Status" column */
101
102 ListView_SetImageList(hApplicationPageListCtrl, ImageList_Create(16, 16, ILC_COLOR8|ILC_MASK, 0, 1), LVSIL_SMALL);
103 ListView_SetImageList(hApplicationPageListCtrl, ImageList_Create(32, 32, ILC_COLOR8|ILC_MASK, 0, 1), LVSIL_NORMAL);
104
105 UpdateApplicationListControlViewSetting();
106
107 /* Start our refresh thread */
108 CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, NULL);
109
110 return TRUE;
111
112 case WM_DESTROY:
113 /* Close the event handle, this will make the */
114 /* refresh thread exit when the wait fails */
115 CloseHandle(hApplicationPageEvent);
116 break;
117
118 case WM_COMMAND:
119
120 /* Handle the button clicks */
121 switch (LOWORD(wParam))
122 {
123 case IDC_ENDTASK:
124 ApplicationPage_OnEndTask();
125 break;
126 case IDC_SWITCHTO:
127 ApplicationPage_OnSwitchTo();
128 break;
129 case IDC_NEWTASK:
130 SendMessage(hMainWnd, WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), 0);
131 break;
132 }
133
134 break;
135
136 case WM_SIZE:
137 if (wParam == SIZE_MINIMIZED)
138 return 0;
139
140 cx = LOWORD(lParam);
141 cy = HIWORD(lParam);
142 nXDifference = cx - nApplicationPageWidth;
143 nYDifference = cy - nApplicationPageHeight;
144 nApplicationPageWidth = cx;
145 nApplicationPageHeight = cy;
146
147 /* Reposition the application page's controls */
148 GetWindowRect(hApplicationPageListCtrl, &rc);
149 cx = (rc.right - rc.left) + nXDifference;
150 cy = (rc.bottom - rc.top) + nYDifference;
151 SetWindowPos(hApplicationPageListCtrl, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER);
152 InvalidateRect(hApplicationPageListCtrl, NULL, TRUE);
153
154 GetClientRect(hApplicationPageEndTaskButton, &rc);
155 MapWindowPoints(hApplicationPageEndTaskButton, hDlg, (LPPOINT)(PRECT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
156 cx = rc.left + nXDifference;
157 cy = rc.top + nYDifference;
158 SetWindowPos(hApplicationPageEndTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
159 InvalidateRect(hApplicationPageEndTaskButton, NULL, TRUE);
160
161 GetClientRect(hApplicationPageSwitchToButton, &rc);
162 MapWindowPoints(hApplicationPageSwitchToButton, hDlg, (LPPOINT)(PRECT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
163 cx = rc.left + nXDifference;
164 cy = rc.top + nYDifference;
165 SetWindowPos(hApplicationPageSwitchToButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
166 InvalidateRect(hApplicationPageSwitchToButton, NULL, TRUE);
167
168 GetClientRect(hApplicationPageNewTaskButton, &rc);
169 MapWindowPoints(hApplicationPageNewTaskButton, hDlg, (LPPOINT)(PRECT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
170 cx = rc.left + nXDifference;
171 cy = rc.top + nYDifference;
172 SetWindowPos(hApplicationPageNewTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
173 InvalidateRect(hApplicationPageNewTaskButton, NULL, TRUE);
174
175 break;
176
177 case WM_NOTIFY:
178 ApplicationPageOnNotify(wParam, lParam);
179 break;
180
181 }
182
183 return 0;
184 }
185
186 void RefreshApplicationPage(void)
187 {
188 /* Signal the event so that our refresh thread */
189 /* will wake up and refresh the application page */
190 SetEvent(hApplicationPageEvent);
191 }
192
193 void UpdateApplicationListControlViewSetting(void)
194 {
195 DWORD dwStyle = GetWindowLong(hApplicationPageListCtrl, GWL_STYLE);
196
197 dwStyle &= ~LVS_REPORT;
198 dwStyle &= ~LVS_ICON;
199 dwStyle &= ~LVS_LIST;
200 dwStyle &= ~LVS_SMALLICON;
201
202 if (TaskManagerSettings.View_LargeIcons)
203 dwStyle |= LVS_ICON;
204 else if (TaskManagerSettings.View_SmallIcons)
205 dwStyle |= LVS_SMALLICON;
206 else
207 dwStyle |= LVS_REPORT;
208
209 SetWindowLong(hApplicationPageListCtrl, GWL_STYLE, dwStyle);
210
211 RefreshApplicationPage();
212 }
213
214 DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
215 {
216 /* Create the event */
217 hApplicationPageEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
218
219 /* If we couldn't create the event then exit the thread */
220 if (!hApplicationPageEvent)
221 return 0;
222
223 while (1)
224 {
225 DWORD dwWaitVal;
226
227 /* Wait on the event */
228 dwWaitVal = WaitForSingleObject(hApplicationPageEvent, INFINITE);
229
230 /* If the wait failed then the event object must have been */
231 /* closed and the task manager is exiting so exit this thread */
232 if (dwWaitVal == WAIT_FAILED)
233 return 0;
234
235 if (dwWaitVal == WAIT_OBJECT_0)
236 {
237 /* Reset our event */
238 ResetEvent(hApplicationPageEvent);
239
240 /*
241 * FIXME:
242 *
243 * Should this be EnumDesktopWindows() instead?
244 */
245 EnumWindows(EnumWindowsProc, 0);
246 }
247 }
248 }
249
250 BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
251 {
252 HICON hIcon;
253 TCHAR szText[260];
254 BOOL bLargeIcon;
255 BOOL bHung = FALSE;
256 HICON* xhIcon = (HICON*)&hIcon;
257
258 typedef int (FAR __stdcall *IsHungAppWindowProc)(HWND);
259 IsHungAppWindowProc IsHungAppWindow;
260
261
262 /* Skip our window */
263 if (hWnd == hMainWnd)
264 return TRUE;
265
266 bLargeIcon = TaskManagerSettings.View_LargeIcons ? TRUE : FALSE;
267
268 GetWindowText(hWnd, szText, 260); /* Get the window text */
269
270 /* Check and see if this is a top-level app window */
271 if ((_tcslen(szText) <= 0) ||
272 !IsWindowVisible(hWnd) ||
273 (GetParent(hWnd) != NULL) ||
274 (GetWindow(hWnd, GW_OWNER) != NULL) ||
275 (GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
276 {
277 return TRUE; /* Skip this window */
278 }
279
280 /* Get the icon for this window */
281 hIcon = NULL;
282 SendMessageTimeout(hWnd, WM_GETICON,bLargeIcon ? ICON_BIG /*1*/ : ICON_SMALL /*0*/, 0, 0, 1000, (PDWORD_PTR)xhIcon);
283
284 if (!hIcon)
285 {
286 hIcon = (HICON)GetClassLong(hWnd, bLargeIcon ? GCL_HICON : GCL_HICONSM);
287 if (!hIcon) hIcon = (HICON)GetClassLong(hWnd, bLargeIcon ? GCL_HICONSM : GCL_HICON);
288 if (!hIcon) SendMessageTimeout(hWnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (PDWORD_PTR)xhIcon);
289 if (!hIcon) SendMessageTimeout(hWnd, WM_GETICON, bLargeIcon ? ICON_SMALL /*0*/ : ICON_BIG /*1*/, 0, 0, 1000, (PDWORD_PTR)xhIcon);
290 }
291
292 if (!hIcon)
293 hIcon = LoadIcon(hInst, bLargeIcon ? MAKEINTRESOURCE(IDI_WINDOW) : MAKEINTRESOURCE(IDI_WINDOWSM));
294
295 bHung = FALSE;
296
297 IsHungAppWindow = (IsHungAppWindowProc)(FARPROC)GetProcAddress(GetModuleHandle(_T("USER32.DLL")), "IsHungAppWindow");
298
299 if (IsHungAppWindow)
300 bHung = IsHungAppWindow(hWnd);
301
302 AddOrUpdateHwnd(hWnd, szText, hIcon, bHung);
303
304 return TRUE;
305 }
306
307 void AddOrUpdateHwnd(HWND hWnd, TCHAR *szTitle, HICON hIcon, BOOL bHung)
308 {
309 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
310 HIMAGELIST hImageListLarge;
311 HIMAGELIST hImageListSmall;
312 LV_ITEM item;
313 int i;
314 BOOL bAlreadyInList = FALSE;
315 BOOL bItemRemoved = FALSE;
316
317 memset(&item, 0, sizeof(LV_ITEM));
318
319 /* Get the image lists */
320 hImageListLarge = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_NORMAL);
321 hImageListSmall = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_SMALL);
322
323 /* Check to see if it's already in our list */
324 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++)
325 {
326 memset(&item, 0, sizeof(LV_ITEM));
327 item.mask = LVIF_IMAGE|LVIF_PARAM;
328 item.iItem = i;
329 ListView_GetItem(hApplicationPageListCtrl, &item);
330
331 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
332 if (pAPLI->hWnd == hWnd)
333 {
334 bAlreadyInList = TRUE;
335 break;
336 }
337 }
338
339 /* If it is already in the list then update it if necessary */
340 if (bAlreadyInList)
341 {
342 /* Check to see if anything needs updating */
343 if ((pAPLI->hIcon != hIcon) ||
344 (_tcsicmp(pAPLI->szTitle, szTitle) != 0) ||
345 (pAPLI->bHung != bHung))
346 {
347 /* Update the structure */
348 pAPLI->hIcon = hIcon;
349 pAPLI->bHung = bHung;
350 _tcscpy(pAPLI->szTitle, szTitle);
351
352 /* Update the image list */
353 ImageList_ReplaceIcon(hImageListLarge, item.iItem, hIcon);
354 ImageList_ReplaceIcon(hImageListSmall, item.iItem, hIcon);
355
356 /* Update the list view */
357 ListView_RedrawItems(hApplicationPageListCtrl, 0, ListView_GetItemCount(hApplicationPageListCtrl));
358 /* UpdateWindow(hApplicationPageListCtrl); */
359 InvalidateRect(hApplicationPageListCtrl, NULL, 0);
360 }
361 }
362 /* It is not already in the list so add it */
363 else
364 {
365 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM));
366
367 pAPLI->hWnd = hWnd;
368 pAPLI->hIcon = hIcon;
369 pAPLI->bHung = bHung;
370 _tcscpy(pAPLI->szTitle, szTitle);
371
372 /* Add the item to the list */
373 memset(&item, 0, sizeof(LV_ITEM));
374 item.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
375 ImageList_AddIcon(hImageListLarge, hIcon);
376 item.iImage = ImageList_AddIcon(hImageListSmall, hIcon);
377 item.pszText = LPSTR_TEXTCALLBACK;
378 item.iItem = ListView_GetItemCount(hApplicationPageListCtrl);
379 item.lParam = (LPARAM)pAPLI;
380 ListView_InsertItem(hApplicationPageListCtrl, &item);
381 }
382
383
384 /* Check to see if we need to remove any items from the list */
385 for (i=ListView_GetItemCount(hApplicationPageListCtrl)-1; i>=0; i--)
386 {
387 memset(&item, 0, sizeof(LV_ITEM));
388 item.mask = LVIF_IMAGE|LVIF_PARAM;
389 item.iItem = i;
390 ListView_GetItem(hApplicationPageListCtrl, &item);
391
392 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
393 if (!IsWindow(pAPLI->hWnd)||
394 (_tcslen(pAPLI->szTitle) <= 0) ||
395 !IsWindowVisible(pAPLI->hWnd) ||
396 (GetParent(pAPLI->hWnd) != NULL) ||
397 (GetWindow(pAPLI->hWnd, GW_OWNER) != NULL) ||
398 (GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
399 {
400 ImageList_Remove(hImageListLarge, item.iItem);
401 ImageList_Remove(hImageListSmall, item.iItem);
402
403 ListView_DeleteItem(hApplicationPageListCtrl, item.iItem);
404 HeapFree(GetProcessHeap(), 0, pAPLI);
405 bItemRemoved = TRUE;
406 }
407 }
408
409 /*
410 * If an item was removed from the list then
411 * we need to resync all the items with the
412 * image list
413 */
414 if (bItemRemoved)
415 {
416 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++)
417 {
418 memset(&item, 0, sizeof(LV_ITEM));
419 item.mask = LVIF_IMAGE;
420 item.iItem = i;
421 item.iImage = i;
422 ListView_SetItem(hApplicationPageListCtrl, &item);
423 }
424 }
425
426 ApplicationPageUpdate();
427 }
428
429 void ApplicationPageUpdate(void)
430 {
431 /* Enable or disable the "End Task" & "Switch To" buttons */
432 if (ListView_GetSelectedCount(hApplicationPageListCtrl))
433 {
434 EnableWindow(hApplicationPageEndTaskButton, TRUE);
435 EnableWindow(hApplicationPageSwitchToButton, TRUE);
436 }
437 else
438 {
439 EnableWindow(hApplicationPageEndTaskButton, FALSE);
440 EnableWindow(hApplicationPageSwitchToButton, FALSE);
441 }
442
443 /* If we are on the applications tab the the windows menu will */
444 /* be present on the menu bar so enable & disable the menu items */
445 if (TabCtrl_GetCurSel(hTabWnd) == 0)
446 {
447 HMENU hMenu;
448 HMENU hWindowsMenu;
449
450 hMenu = GetMenu(hMainWnd);
451 hWindowsMenu = GetSubMenu(hMenu, 3);
452
453 /* Only one item selected */
454 if (ListView_GetSelectedCount(hApplicationPageListCtrl) == 1)
455 {
456 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
457 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
458 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
459 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
460 EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
461 EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_ENABLED);
462 }
463 /* More than one item selected */
464 else if (ListView_GetSelectedCount(hApplicationPageListCtrl) > 1)
465 {
466 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_ENABLED);
467 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_ENABLED);
468 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
469 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
470 EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_ENABLED);
471 EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
472 }
473 /* No items selected */
474 else
475 {
476 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
477 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
478 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
479 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
480 EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
481 EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
482 }
483 }
484 }
485
486 void ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam)
487 {
488 int idctrl;
489 LPNMHDR pnmh;
490 LPNM_LISTVIEW pnmv;
491 LV_DISPINFO* pnmdi;
492 LPAPPLICATION_PAGE_LIST_ITEM pAPLI;
493 TCHAR szMsg[256];
494
495
496 idctrl = (int) wParam;
497 pnmh = (LPNMHDR) lParam;
498 pnmv = (LPNM_LISTVIEW) lParam;
499 pnmdi = (LV_DISPINFO*) lParam;
500
501 if (pnmh->hwndFrom == hApplicationPageListCtrl) {
502 switch (pnmh->code) {
503 case LVN_ITEMCHANGED:
504 ApplicationPageUpdate();
505 break;
506
507 case LVN_GETDISPINFO:
508 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)pnmdi->item.lParam;
509
510 /* Update the item text */
511 if (pnmdi->item.iSubItem == 0)
512 {
513 _tcsncpy(pnmdi->item.pszText, pAPLI->szTitle, pnmdi->item.cchTextMax);
514 }
515
516 /* Update the item status */
517 else if (pnmdi->item.iSubItem == 1)
518 {
519 if (pAPLI->bHung)
520 {
521 LoadString( GetModuleHandle(NULL), IDS_Not_Responding , szMsg, sizeof(szMsg) / sizeof(szMsg[0]));
522 _tcsncpy(pnmdi->item.pszText, szMsg, pnmdi->item.cchTextMax);
523 }
524 else
525 {
526 LoadString( GetModuleHandle(NULL), IDS_Running, (LPTSTR) szMsg, sizeof(szMsg) / sizeof(szMsg[0]));
527 _tcsncpy(pnmdi->item.pszText, szMsg, pnmdi->item.cchTextMax);
528 }
529 }
530
531 break;
532
533 case NM_RCLICK:
534
535 if (ListView_GetSelectedCount(hApplicationPageListCtrl) < 1)
536 {
537 ApplicationPageShowContextMenu1();
538 }
539 else
540 {
541 ApplicationPageShowContextMenu2();
542 }
543
544 break;
545
546 case NM_DBLCLK:
547
548 ApplicationPage_OnSwitchTo();
549
550 break;
551 }
552 }
553 else if (pnmh->hwndFrom == ListView_GetHeader(hApplicationPageListCtrl))
554 {
555 switch (pnmh->code)
556 {
557 case NM_RCLICK:
558
559 if (ListView_GetSelectedCount(hApplicationPageListCtrl) < 1)
560 {
561 ApplicationPageShowContextMenu1();
562 }
563 else
564 {
565 ApplicationPageShowContextMenu2();
566 }
567
568 break;
569
570 case HDN_ITEMCLICK:
571
572 ListView_SortItems(hApplicationPageListCtrl, ApplicationPageCompareFunc, 0);
573 bSortAscending = !bSortAscending;
574
575 break;
576 }
577 }
578
579 }
580
581 void ApplicationPageShowContextMenu1(void)
582 {
583 HMENU hMenu;
584 HMENU hSubMenu;
585 POINT pt;
586
587 GetCursorPos(&pt);
588
589 hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT1));
590 hSubMenu = GetSubMenu(hMenu, 0);
591
592 if (TaskManagerSettings.View_LargeIcons)
593 CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_LARGE, MF_BYCOMMAND);
594 else if (TaskManagerSettings.View_SmallIcons)
595 CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_SMALL, MF_BYCOMMAND);
596 else
597 CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND);
598
599 TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL);
600
601 DestroyMenu(hMenu);
602 }
603
604 void ApplicationPageShowContextMenu2(void)
605 {
606 HMENU hMenu;
607 HMENU hSubMenu;
608 POINT pt;
609
610 GetCursorPos(&pt);
611
612 hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT2));
613 hSubMenu = GetSubMenu(hMenu, 0);
614
615 if (ListView_GetSelectedCount(hApplicationPageListCtrl) == 1)
616 {
617 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
618 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
619 EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
620 EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
621 EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
622 EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_ENABLED);
623 }
624 else if (ListView_GetSelectedCount(hApplicationPageListCtrl) > 1)
625 {
626 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_ENABLED);
627 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_ENABLED);
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_ENABLED);
631 EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
632 }
633 else
634 {
635 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
636 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
637 EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
638 EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
639 EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
640 EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
641 }
642
643 SetMenuDefaultItem(hSubMenu, ID_APPLICATION_PAGE_SWITCHTO, MF_BYCOMMAND);
644
645 TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL);
646
647 DestroyMenu(hMenu);
648 }
649
650 void ApplicationPage_OnViewLargeIcons(void)
651 {
652 HMENU hMenu;
653 HMENU hViewMenu;
654
655 hMenu = GetMenu(hMainWnd);
656 hViewMenu = GetSubMenu(hMenu, 2);
657
658 TaskManagerSettings.View_LargeIcons = TRUE;
659 TaskManagerSettings.View_SmallIcons = FALSE;
660 TaskManagerSettings.View_Details = FALSE;
661 CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_LARGE, MF_BYCOMMAND);
662
663 UpdateApplicationListControlViewSetting();
664 }
665
666 void ApplicationPage_OnViewSmallIcons(void)
667 {
668 HMENU hMenu;
669 HMENU hViewMenu;
670
671 hMenu = GetMenu(hMainWnd);
672 hViewMenu = GetSubMenu(hMenu, 2);
673
674 TaskManagerSettings.View_LargeIcons = FALSE;
675 TaskManagerSettings.View_SmallIcons = TRUE;
676 TaskManagerSettings.View_Details = FALSE;
677 CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_SMALL, MF_BYCOMMAND);
678
679 UpdateApplicationListControlViewSetting();
680 }
681
682 void ApplicationPage_OnViewDetails(void)
683 {
684 HMENU hMenu;
685 HMENU hViewMenu;
686
687 hMenu = GetMenu(hMainWnd);
688 hViewMenu = GetSubMenu(hMenu, 2);
689
690 TaskManagerSettings.View_LargeIcons = FALSE;
691 TaskManagerSettings.View_SmallIcons = FALSE;
692 TaskManagerSettings.View_Details = TRUE;
693 CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND);
694
695 UpdateApplicationListControlViewSetting();
696 }
697
698 void ApplicationPage_OnWindowsTileHorizontally(void)
699 {
700 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
701 LV_ITEM item;
702 int i;
703 HWND* hWndArray;
704 int nWndCount;
705
706 hWndArray = (HWND*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND) * ListView_GetItemCount(hApplicationPageListCtrl));
707 nWndCount = 0;
708
709 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
710 memset(&item, 0, sizeof(LV_ITEM));
711 item.mask = LVIF_STATE|LVIF_PARAM;
712 item.iItem = i;
713 item.stateMask = (UINT)-1;
714 ListView_GetItem(hApplicationPageListCtrl, &item);
715
716 if (item.state & LVIS_SELECTED) {
717 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
718
719 if (pAPLI) {
720 hWndArray[nWndCount] = pAPLI->hWnd;
721 nWndCount++;
722 }
723 }
724 }
725 TileWindows(NULL, MDITILE_HORIZONTAL, NULL, nWndCount, hWndArray);
726 HeapFree(GetProcessHeap(), 0, hWndArray);
727 }
728
729 void ApplicationPage_OnWindowsTileVertically(void)
730 {
731 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
732 LV_ITEM item;
733 int i;
734 HWND* hWndArray;
735 int nWndCount;
736
737 hWndArray = (HWND*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND) * ListView_GetItemCount(hApplicationPageListCtrl));
738 nWndCount = 0;
739
740 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
741 memset(&item, 0, sizeof(LV_ITEM));
742 item.mask = LVIF_STATE|LVIF_PARAM;
743 item.iItem = i;
744 item.stateMask = (UINT)-1;
745 ListView_GetItem(hApplicationPageListCtrl, &item);
746
747 if (item.state & LVIS_SELECTED) {
748 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
749 if (pAPLI) {
750 hWndArray[nWndCount] = pAPLI->hWnd;
751 nWndCount++;
752 }
753 }
754 }
755
756 TileWindows(NULL, MDITILE_VERTICAL, NULL, nWndCount, hWndArray);
757 HeapFree(GetProcessHeap(), 0, hWndArray);
758 }
759
760 void ApplicationPage_OnWindowsMinimize(void)
761 {
762 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
763 LV_ITEM item;
764 int i;
765
766 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
767 memset(&item, 0, sizeof(LV_ITEM));
768 item.mask = LVIF_STATE|LVIF_PARAM;
769 item.iItem = i;
770 item.stateMask = (UINT)-1;
771 ListView_GetItem(hApplicationPageListCtrl, &item);
772 if (item.state & LVIS_SELECTED) {
773 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
774 if (pAPLI) {
775 ShowWindow(pAPLI->hWnd, SW_MINIMIZE);
776 }
777 }
778 }
779 }
780
781 void ApplicationPage_OnWindowsMaximize(void)
782 {
783 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
784 LV_ITEM item;
785 int i;
786
787 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
788 memset(&item, 0, sizeof(LV_ITEM));
789 item.mask = LVIF_STATE|LVIF_PARAM;
790 item.iItem = i;
791 item.stateMask = (UINT)-1;
792 ListView_GetItem(hApplicationPageListCtrl, &item);
793 if (item.state & LVIS_SELECTED) {
794 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
795 if (pAPLI) {
796 ShowWindow(pAPLI->hWnd, SW_MAXIMIZE);
797 }
798 }
799 }
800 }
801
802 void ApplicationPage_OnWindowsCascade(void)
803 {
804 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
805 LV_ITEM item;
806 int i;
807 HWND* hWndArray;
808 int nWndCount;
809
810 hWndArray = (HWND*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND) * ListView_GetItemCount(hApplicationPageListCtrl));
811 nWndCount = 0;
812
813 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
814 memset(&item, 0, sizeof(LV_ITEM));
815 item.mask = LVIF_STATE|LVIF_PARAM;
816 item.iItem = i;
817 item.stateMask = (UINT)-1;
818 ListView_GetItem(hApplicationPageListCtrl, &item);
819 if (item.state & LVIS_SELECTED) {
820 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
821 if (pAPLI) {
822 hWndArray[nWndCount] = pAPLI->hWnd;
823 nWndCount++;
824 }
825 }
826 }
827 CascadeWindows(NULL, 0, NULL, nWndCount, hWndArray);
828 HeapFree(GetProcessHeap(), 0, hWndArray);
829 }
830
831 void ApplicationPage_OnWindowsBringToFront(void)
832 {
833 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
834 LV_ITEM item;
835 int i;
836
837 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
838 memset(&item, 0, sizeof(LV_ITEM));
839 item.mask = LVIF_STATE|LVIF_PARAM;
840 item.iItem = i;
841 item.stateMask = (UINT)-1;
842 ListView_GetItem(hApplicationPageListCtrl, &item);
843 if (item.state & LVIS_SELECTED) {
844 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
845 break;
846 }
847 }
848 if (pAPLI) {
849 if (IsIconic(pAPLI->hWnd))
850 ShowWindow(pAPLI->hWnd, SW_RESTORE);
851 BringWindowToTop(pAPLI->hWnd);
852 }
853 }
854
855 void ApplicationPage_OnSwitchTo(void)
856 {
857 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
858 LV_ITEM item;
859 int i;
860
861 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
862 memset(&item, 0, sizeof(LV_ITEM));
863 item.mask = LVIF_STATE|LVIF_PARAM;
864 item.iItem = i;
865 item.stateMask = (UINT)-1;
866 ListView_GetItem(hApplicationPageListCtrl, &item);
867
868 if (item.state & LVIS_SELECTED) {
869 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
870 break;
871 }
872 }
873 if (pAPLI) {
874 typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL);
875 PROCSWITCHTOTHISWINDOW SwitchToThisWindow;
876
877 HMODULE hUser32 = GetModuleHandle(_T("USER32"));
878 SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, "SwitchToThisWindow");
879 if (SwitchToThisWindow) {
880 SwitchToThisWindow(pAPLI->hWnd, TRUE);
881 } else {
882 if (IsIconic(pAPLI->hWnd))
883 ShowWindow(pAPLI->hWnd, SW_RESTORE);
884 BringWindowToTop(pAPLI->hWnd);
885 SetForegroundWindow(pAPLI->hWnd);
886 }
887 if (TaskManagerSettings.MinimizeOnUse)
888 ShowWindow(hMainWnd, SW_MINIMIZE);
889 }
890 }
891
892 void ApplicationPage_OnEndTask(void)
893 {
894 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
895 LV_ITEM item;
896 int i;
897
898 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
899 memset(&item, 0, sizeof(LV_ITEM));
900 item.mask = LVIF_STATE|LVIF_PARAM;
901 item.iItem = i;
902 item.stateMask = (UINT)-1;
903 ListView_GetItem(hApplicationPageListCtrl, &item);
904 if (item.state & LVIS_SELECTED) {
905 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
906 if (pAPLI) {
907 PostMessage(pAPLI->hWnd, WM_CLOSE, 0, 0);
908 }
909 }
910 }
911 }
912
913 void ApplicationPage_OnGotoProcess(void)
914 {
915 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
916 LV_ITEM item;
917 int i;
918 /* NMHDR nmhdr; */
919
920 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
921 memset(&item, 0, sizeof(LV_ITEM));
922 item.mask = LVIF_STATE|LVIF_PARAM;
923 item.iItem = i;
924 item.stateMask = (UINT)-1;
925 ListView_GetItem(hApplicationPageListCtrl, &item);
926 if (item.state & LVIS_SELECTED) {
927 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
928 break;
929 }
930 }
931 if (pAPLI) {
932 DWORD dwProcessId;
933
934 GetWindowThreadProcessId(pAPLI->hWnd, &dwProcessId);
935 /*
936 * Switch to the process tab
937 */
938 TabCtrl_SetCurFocus(hTabWnd, 1);
939 /*
940 * Select the process item in the list
941 */
942 i = PerfGetIndexByProcessId(dwProcessId);
943 if (i != -1)
944 {
945 ListView_SetItemState(hProcessPageListCtrl,
946 i,
947 LVIS_SELECTED | LVIS_FOCUSED,
948 LVIS_SELECTED | LVIS_FOCUSED);
949 ListView_EnsureVisible(hProcessPageListCtrl,
950 i,
951 FALSE);
952 }
953 }
954 }
955
956 int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
957 {
958 LPAPPLICATION_PAGE_LIST_ITEM Param1;
959 LPAPPLICATION_PAGE_LIST_ITEM Param2;
960
961 if (bSortAscending) {
962 Param1 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam1;
963 Param2 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam2;
964 } else {
965 Param1 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam2;
966 Param2 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam1;
967 }
968 return _tcscmp(Param1->szTitle, Param2->szTitle);
969 }