server: Introduce IOCTL_CONDRV_SET_INPUT_INFO ioctl.
[wine.git] / programs / taskmgr / applpage.c
blob5a005290be4bd4a9a1670bba2ac97ed0244bf141
1 /*
2 * ReactOS Task Manager
4 * applpage.c
6 * Copyright (C) 1999 - 2001 Brian Palmer <brianp@reactos.org>
7 * Copyright (C) 2008 Vladimir Pankratov
9 * This library is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU Lesser General Public
11 * License as published by the Free Software Foundation; either
12 * version 2.1 of the License, or (at your option) any later version.
14 * This library is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17 * Lesser General Public License for more details.
19 * You should have received a copy of the GNU Lesser General Public
20 * License along with this library; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 #include <stdio.h>
25 #include <stdlib.h>
27 #include <windows.h>
28 #include <commctrl.h>
30 #include "taskmgr.h"
32 typedef struct
34 HWND hWnd;
35 WCHAR wszTitle[256];
36 HICON hIcon;
37 BOOL bHung;
38 } APPLICATION_PAGE_LIST_ITEM, *LPAPPLICATION_PAGE_LIST_ITEM;
40 HWND hApplicationPage; /* Application List Property Page */
41 HWND hApplicationPageListCtrl; /* Application ListCtrl Window */
42 HWND hApplicationPageEndTaskButton; /* Application End Task button */
43 HWND hApplicationPageSwitchToButton; /* Application Switch To button */
44 HWND hApplicationPageNewTaskButton; /* Application New Task button */
45 static int nApplicationPageWidth;
46 static int nApplicationPageHeight;
47 static HANDLE hApplicationPageEvent = NULL; /* When this event becomes signaled then we refresh the app list */
48 static BOOL bSortAscending = TRUE;
50 static const WCHAR wszUser32[] = {'U','S','E','R','3','2','.','D','L','L',0};
52 static void ApplicationPageUpdate(void)
54 /* Enable or disable the "End Task" & "Switch To" buttons */
55 if (SendMessageW(hApplicationPageListCtrl, LVM_GETSELECTEDCOUNT, 0, 0))
57 EnableWindow(hApplicationPageEndTaskButton, TRUE);
58 EnableWindow(hApplicationPageSwitchToButton, TRUE);
60 else
62 EnableWindow(hApplicationPageEndTaskButton, FALSE);
63 EnableWindow(hApplicationPageSwitchToButton, FALSE);
66 /* If we are on the applications tab, then the windows menu will */
67 /* be present on the menu bar so enable & disable the menu items */
68 if (SendMessageW(hTabWnd, TCM_GETCURSEL, 0, 0) == 0)
70 HMENU hMenu;
71 HMENU hWindowsMenu;
72 UINT count;
74 hMenu = GetMenu(hMainWnd);
75 hWindowsMenu = GetSubMenu(hMenu, 3);
76 count = SendMessageW(hApplicationPageListCtrl, LVM_GETSELECTEDCOUNT, 0, 0);
78 /* Only one item selected */
79 if (count == 1)
81 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
82 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
83 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
84 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
85 EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
86 EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_ENABLED);
88 /* More than one item selected */
89 else if (count > 1)
91 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_ENABLED);
92 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_ENABLED);
93 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
94 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
95 EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_ENABLED);
96 EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
98 /* No items selected */
99 else
101 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
102 EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
103 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
104 EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
105 EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
106 EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
111 static void AddOrUpdateHwnd(HWND hWnd, WCHAR *wszTitle, HICON hIcon, BOOL bHung)
113 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
114 HIMAGELIST hImageListLarge;
115 HIMAGELIST hImageListSmall;
116 LV_ITEMW item;
117 int i, count;
118 BOOL bAlreadyInList = FALSE;
119 BOOL bItemRemoved = FALSE;
121 memset(&item, 0, sizeof(LV_ITEMW));
123 /* Get the image lists */
124 hImageListLarge = (HIMAGELIST)SendMessageW(hApplicationPageListCtrl, LVM_GETIMAGELIST, LVSIL_NORMAL, 0);
125 hImageListSmall = (HIMAGELIST)SendMessageW(hApplicationPageListCtrl, LVM_GETIMAGELIST, LVSIL_SMALL, 0);
127 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
128 /* Check to see if it's already in our list */
129 for (i=0; i<count; i++)
131 memset(&item, 0, sizeof(LV_ITEMW));
132 item.mask = LVIF_IMAGE|LVIF_PARAM;
133 item.iItem = i;
134 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
136 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
137 if (pAPLI->hWnd == hWnd)
139 bAlreadyInList = TRUE;
140 break;
144 /* If it is already in the list then update it if necessary */
145 if (bAlreadyInList)
147 /* Check to see if anything needs updating */
148 if ((pAPLI->hIcon != hIcon) ||
149 (lstrcmpW(pAPLI->wszTitle, wszTitle) != 0) ||
150 (pAPLI->bHung != bHung))
152 /* Update the structure */
153 pAPLI->hIcon = hIcon;
154 pAPLI->bHung = bHung;
155 lstrcpyW(pAPLI->wszTitle, wszTitle);
157 /* Update the image list */
158 ImageList_ReplaceIcon(hImageListLarge, item.iItem, hIcon);
159 ImageList_ReplaceIcon(hImageListSmall, item.iItem, hIcon);
161 /* Update the list view */
162 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
163 SendMessageW(hApplicationPageListCtrl, LVM_REDRAWITEMS, 0, count);
164 /* UpdateWindow(hApplicationPageListCtrl); */
165 InvalidateRect(hApplicationPageListCtrl, NULL, 0);
168 /* It is not already in the list so add it */
169 else
171 pAPLI = HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM));
173 pAPLI->hWnd = hWnd;
174 pAPLI->hIcon = hIcon;
175 pAPLI->bHung = bHung;
176 lstrcpyW(pAPLI->wszTitle, wszTitle);
178 /* Add the item to the list */
179 memset(&item, 0, sizeof(LV_ITEMW));
180 item.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
181 ImageList_AddIcon(hImageListLarge, hIcon);
182 item.iImage = ImageList_AddIcon(hImageListSmall, hIcon);
183 item.pszText = LPSTR_TEXTCALLBACKW;
184 item.iItem = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
185 item.lParam = (LPARAM)pAPLI;
186 SendMessageW(hApplicationPageListCtrl, LVM_INSERTITEMW, 0, (LPARAM) &item);
190 /* Check to see if we need to remove any items from the list */
191 for (i=SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0)-1; i>=0; i--)
193 memset(&item, 0, sizeof(LV_ITEMW));
194 item.mask = LVIF_IMAGE|LVIF_PARAM;
195 item.iItem = i;
196 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
198 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
199 if (!IsWindow(pAPLI->hWnd)||
200 (lstrlenW(pAPLI->wszTitle) <= 0) ||
201 !IsWindowVisible(pAPLI->hWnd) ||
202 (GetParent(pAPLI->hWnd) != NULL) ||
203 (GetWindow(pAPLI->hWnd, GW_OWNER) != NULL) ||
204 (GetWindowLongW(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
206 ImageList_Remove(hImageListLarge, item.iItem);
207 ImageList_Remove(hImageListSmall, item.iItem);
209 SendMessageW(hApplicationPageListCtrl, LVM_DELETEITEM, item.iItem, 0);
210 HeapFree(GetProcessHeap(), 0, pAPLI);
211 bItemRemoved = TRUE;
216 * If an item was removed from the list then
217 * we need to resync all the items with the
218 * image list
220 if (bItemRemoved)
222 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
223 for (i=0; i<count; i++)
225 memset(&item, 0, sizeof(LV_ITEMW));
226 item.mask = LVIF_IMAGE;
227 item.iItem = i;
228 item.iImage = i;
229 SendMessageW(hApplicationPageListCtrl, LVM_SETITEMW, 0, (LPARAM) &item);
233 ApplicationPageUpdate();
236 static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
238 HICON hIcon;
239 WCHAR wszText[256];
240 BOOL bLargeIcon = TaskManagerSettings.View_LargeIcons;
241 BOOL bHung = FALSE;
242 typedef int (__stdcall *IsHungAppWindowProc)(HWND);
243 IsHungAppWindowProc IsHungAppWindow;
246 /* Skip our window */
247 if (hWnd == hMainWnd)
248 return TRUE;
250 /* Check and see if this is a top-level app window */
251 if (!GetWindowTextW(hWnd, wszText, ARRAY_SIZE(wszText)) || !IsWindowVisible(hWnd) ||
252 (GetParent(hWnd) != NULL) || (GetWindow(hWnd, GW_OWNER) != NULL) ||
253 (GetWindowLongW(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
255 return TRUE; /* Skip this window */
258 /* Get the icon for this window */
259 hIcon = NULL;
260 SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_BIG /*1*/ : ICON_SMALL /*0*/, 0, 0, 1000, (PDWORD_PTR)&hIcon);
262 if (!hIcon)
264 hIcon = (HICON)GetClassLongPtrW(hWnd, bLargeIcon ? GCLP_HICON : GCLP_HICONSM);
265 if (!hIcon) hIcon = (HICON)GetClassLongPtrW(hWnd, bLargeIcon ? GCLP_HICONSM : GCLP_HICON);
266 if (!hIcon) SendMessageTimeoutW(hWnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (PDWORD_PTR)&hIcon);
267 if (!hIcon) SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_SMALL /*0*/ : ICON_BIG /*1*/, 0, 0, 1000, (PDWORD_PTR)&hIcon);
270 if (!hIcon)
271 hIcon = LoadIconW(hInst, bLargeIcon ? MAKEINTRESOURCEW(IDI_WINDOW) : MAKEINTRESOURCEW(IDI_WINDOWSM));
273 bHung = FALSE;
275 IsHungAppWindow = (IsHungAppWindowProc)(FARPROC)GetProcAddress(GetModuleHandleW(wszUser32), "IsHungAppWindow");
277 if (IsHungAppWindow)
278 bHung = IsHungAppWindow(hWnd);
280 AddOrUpdateHwnd(hWnd, wszText, hIcon, bHung);
282 return TRUE;
285 static DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
287 /* Create the event */
288 hApplicationPageEvent = CreateEventW(NULL, TRUE, TRUE, NULL);
290 /* If we couldn't create the event then exit the thread */
291 if (!hApplicationPageEvent)
292 return 0;
294 while (1)
296 DWORD dwWaitVal;
298 /* Wait on the event */
299 dwWaitVal = WaitForSingleObject(hApplicationPageEvent, INFINITE);
301 /* If the wait failed then the event object must have been */
302 /* closed and the task manager is exiting so exit this thread */
303 if (dwWaitVal == WAIT_FAILED)
304 return 0;
306 if (dwWaitVal == WAIT_OBJECT_0)
308 /* Reset our event */
309 ResetEvent(hApplicationPageEvent);
312 * FIXME:
314 * Should this be EnumDesktopWindows() instead?
316 EnumWindows(EnumWindowsProc, 0);
321 static void ApplicationPageShowContextMenu1(void)
323 HMENU hMenu;
324 HMENU hSubMenu;
325 POINT pt;
327 GetCursorPos(&pt);
329 hMenu = LoadMenuW(hInst, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT1));
330 hSubMenu = GetSubMenu(hMenu, 0);
332 if (TaskManagerSettings.View_LargeIcons)
333 CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_LARGE, MF_BYCOMMAND);
334 else if (TaskManagerSettings.View_SmallIcons)
335 CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_SMALL, MF_BYCOMMAND);
336 else
337 CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND);
339 TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL);
341 DestroyMenu(hMenu);
344 static void ApplicationPageShowContextMenu2(void)
346 HMENU hMenu;
347 HMENU hSubMenu;
348 UINT count;
349 POINT pt;
351 GetCursorPos(&pt);
353 hMenu = LoadMenuW(hInst, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT2));
354 hSubMenu = GetSubMenu(hMenu, 0);
356 count = SendMessageW(hApplicationPageListCtrl, LVM_GETSELECTEDCOUNT, 0, 0);
357 if (count == 1)
359 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
360 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
361 EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
362 EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
363 EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
364 EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_ENABLED);
366 else if (count > 1)
368 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_ENABLED);
369 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_ENABLED);
370 EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
371 EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
372 EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_ENABLED);
373 EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
375 else
377 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
378 EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
379 EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
380 EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
381 EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
382 EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
385 SetMenuDefaultItem(hSubMenu, ID_APPLICATION_PAGE_SWITCHTO, MF_BYCOMMAND);
387 TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL);
389 DestroyMenu(hMenu);
392 static int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
394 LPAPPLICATION_PAGE_LIST_ITEM Param1;
395 LPAPPLICATION_PAGE_LIST_ITEM Param2;
397 if (bSortAscending) {
398 Param1 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam1;
399 Param2 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam2;
400 } else {
401 Param1 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam2;
402 Param2 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam1;
404 return lstrcmpW(Param1->wszTitle, Param2->wszTitle);
407 static void ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam)
409 LPNMHDR pnmh;
410 LV_DISPINFOW* pnmdi;
411 LPAPPLICATION_PAGE_LIST_ITEM pAPLI;
412 WCHAR wszNotResponding[255];
413 WCHAR wszRunning[255];
415 LoadStringW(hInst, IDS_APPLICATION_NOT_RESPONDING, wszNotResponding, ARRAY_SIZE(wszNotResponding));
416 LoadStringW(hInst, IDS_APPLICATION_RUNNING, wszRunning, ARRAY_SIZE(wszRunning));
418 pnmh = (LPNMHDR) lParam;
419 pnmdi = (LV_DISPINFOW*) lParam;
421 if (pnmh->hwndFrom == hApplicationPageListCtrl) {
422 switch (pnmh->code) {
423 case LVN_ITEMCHANGED:
424 ApplicationPageUpdate();
425 break;
427 case LVN_GETDISPINFOW:
428 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)pnmdi->item.lParam;
430 /* Update the item text */
431 if (pnmdi->item.iSubItem == 0)
433 lstrcpynW(pnmdi->item.pszText, pAPLI->wszTitle, pnmdi->item.cchTextMax);
436 /* Update the item status */
437 else if (pnmdi->item.iSubItem == 1)
439 if (pAPLI->bHung)
440 lstrcpynW(pnmdi->item.pszText, wszNotResponding, pnmdi->item.cchTextMax);
441 else
442 lstrcpynW(pnmdi->item.pszText, wszRunning, pnmdi->item.cchTextMax);
445 break;
447 case NM_RCLICK:
449 if (SendMessageW(hApplicationPageListCtrl, LVM_GETSELECTEDCOUNT, 0, 0) < 1)
451 ApplicationPageShowContextMenu1();
453 else
455 ApplicationPageShowContextMenu2();
458 break;
460 case NM_DBLCLK:
462 ApplicationPage_OnSwitchTo();
464 break;
467 else if (pnmh->hwndFrom == (HWND)SendMessageW(hApplicationPageListCtrl, LVM_GETHEADER, 0, 0))
469 switch (pnmh->code)
471 case NM_RCLICK:
473 if (SendMessageW(hApplicationPageListCtrl, LVM_GETSELECTEDCOUNT, 0, 0) < 1)
475 ApplicationPageShowContextMenu1();
477 else
479 ApplicationPageShowContextMenu2();
482 break;
484 case HDN_ITEMCLICKW:
486 SendMessageW(hApplicationPageListCtrl, LVM_SORTITEMS, 0, (LPARAM) ApplicationPageCompareFunc);
487 bSortAscending = !bSortAscending;
489 break;
495 void RefreshApplicationPage(void)
497 /* Signal the event so that our refresh thread */
498 /* will wake up and refresh the application page */
499 SetEvent(hApplicationPageEvent);
502 static void UpdateApplicationListControlViewSetting(void)
504 DWORD dwStyle = GetWindowLongW(hApplicationPageListCtrl, GWL_STYLE);
506 dwStyle &= ~LVS_REPORT;
507 dwStyle &= ~LVS_ICON;
508 dwStyle &= ~LVS_LIST;
509 dwStyle &= ~LVS_SMALLICON;
511 if (TaskManagerSettings.View_LargeIcons)
512 dwStyle |= LVS_ICON;
513 else if (TaskManagerSettings.View_SmallIcons)
514 dwStyle |= LVS_SMALLICON;
515 else
516 dwStyle |= LVS_REPORT;
518 SetWindowLongW(hApplicationPageListCtrl, GWL_STYLE, dwStyle);
520 RefreshApplicationPage();
523 void ApplicationPage_OnViewLargeIcons(void)
525 HMENU hMenu;
526 HMENU hViewMenu;
528 hMenu = GetMenu(hMainWnd);
529 hViewMenu = GetSubMenu(hMenu, 2);
531 TaskManagerSettings.View_LargeIcons = TRUE;
532 TaskManagerSettings.View_SmallIcons = FALSE;
533 TaskManagerSettings.View_Details = FALSE;
534 CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_LARGE, MF_BYCOMMAND);
536 UpdateApplicationListControlViewSetting();
539 void ApplicationPage_OnViewSmallIcons(void)
541 HMENU hMenu;
542 HMENU hViewMenu;
544 hMenu = GetMenu(hMainWnd);
545 hViewMenu = GetSubMenu(hMenu, 2);
547 TaskManagerSettings.View_LargeIcons = FALSE;
548 TaskManagerSettings.View_SmallIcons = TRUE;
549 TaskManagerSettings.View_Details = FALSE;
550 CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_SMALL, MF_BYCOMMAND);
552 UpdateApplicationListControlViewSetting();
555 void ApplicationPage_OnViewDetails(void)
557 HMENU hMenu;
558 HMENU hViewMenu;
560 hMenu = GetMenu(hMainWnd);
561 hViewMenu = GetSubMenu(hMenu, 2);
563 TaskManagerSettings.View_LargeIcons = FALSE;
564 TaskManagerSettings.View_SmallIcons = FALSE;
565 TaskManagerSettings.View_Details = TRUE;
566 CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND);
568 UpdateApplicationListControlViewSetting();
571 void ApplicationPage_OnWindowsTileHorizontally(void)
573 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
574 LV_ITEMW item;
575 int i, count;
576 HWND* hWndArray;
577 int nWndCount;
579 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
580 hWndArray = HeapAlloc(GetProcessHeap(), 0,
581 sizeof(HWND) * count);
582 nWndCount = 0;
584 for (i=0; i<count; i++) {
585 memset(&item, 0, sizeof(LV_ITEMW));
586 item.mask = LVIF_STATE|LVIF_PARAM;
587 item.iItem = i;
588 item.stateMask = (UINT)-1;
589 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
591 if (item.state & LVIS_SELECTED) {
592 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
594 if (pAPLI) {
595 hWndArray[nWndCount] = pAPLI->hWnd;
596 nWndCount++;
600 TileWindows(NULL, MDITILE_HORIZONTAL, NULL, nWndCount, hWndArray);
601 HeapFree(GetProcessHeap(), 0, hWndArray);
604 void ApplicationPage_OnWindowsTileVertically(void)
606 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
607 LV_ITEMW item;
608 int i, count;
609 HWND* hWndArray;
610 int nWndCount;
612 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
613 hWndArray = HeapAlloc(GetProcessHeap(), 0,
614 sizeof(HWND) * count);
615 nWndCount = 0;
617 for (i=0; i<count; i++) {
618 memset(&item, 0, sizeof(LV_ITEMW));
619 item.mask = LVIF_STATE|LVIF_PARAM;
620 item.iItem = i;
621 item.stateMask = (UINT)-1;
622 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
624 if (item.state & LVIS_SELECTED) {
625 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
626 if (pAPLI) {
627 hWndArray[nWndCount] = pAPLI->hWnd;
628 nWndCount++;
633 TileWindows(NULL, MDITILE_VERTICAL, NULL, nWndCount, hWndArray);
634 HeapFree(GetProcessHeap(), 0, hWndArray);
637 void ApplicationPage_OnWindowsMinimize(void)
639 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
640 LV_ITEMW item;
641 int i, count;
643 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
644 for (i=0; i<count; i++) {
645 memset(&item, 0, sizeof(LV_ITEMW));
646 item.mask = LVIF_STATE|LVIF_PARAM;
647 item.iItem = i;
648 item.stateMask = (UINT)-1;
649 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
650 if (item.state & LVIS_SELECTED) {
651 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
652 if (pAPLI) {
653 ShowWindow(pAPLI->hWnd, SW_MINIMIZE);
659 void ApplicationPage_OnWindowsMaximize(void)
661 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
662 LV_ITEMW item;
663 int i, count;
665 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
666 for (i=0; i<count; i++) {
667 memset(&item, 0, sizeof(LV_ITEMW));
668 item.mask = LVIF_STATE|LVIF_PARAM;
669 item.iItem = i;
670 item.stateMask = (UINT)-1;
671 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
672 if (item.state & LVIS_SELECTED) {
673 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
674 if (pAPLI) {
675 ShowWindow(pAPLI->hWnd, SW_MAXIMIZE);
681 void ApplicationPage_OnWindowsCascade(void)
683 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
684 LV_ITEMW item;
685 int i, count;
686 HWND* hWndArray;
687 int nWndCount;
689 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
690 hWndArray = HeapAlloc(GetProcessHeap(), 0,
691 sizeof(HWND) * count);
692 nWndCount = 0;
694 for (i=0; i<count; i++) {
695 memset(&item, 0, sizeof(LV_ITEMW));
696 item.mask = LVIF_STATE|LVIF_PARAM;
697 item.iItem = i;
698 item.stateMask = (UINT)-1;
699 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
700 if (item.state & LVIS_SELECTED) {
701 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
702 if (pAPLI) {
703 hWndArray[nWndCount] = pAPLI->hWnd;
704 nWndCount++;
708 CascadeWindows(NULL, 0, NULL, nWndCount, hWndArray);
709 HeapFree(GetProcessHeap(), 0, hWndArray);
712 void ApplicationPage_OnWindowsBringToFront(void)
714 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
715 LV_ITEMW item;
716 int i, count;
718 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
719 for (i=0; i<count; i++) {
720 memset(&item, 0, sizeof(LV_ITEMW));
721 item.mask = LVIF_STATE|LVIF_PARAM;
722 item.iItem = i;
723 item.stateMask = (UINT)-1;
724 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
725 if (item.state & LVIS_SELECTED) {
726 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
727 break;
730 if (pAPLI) {
731 if (IsIconic(pAPLI->hWnd))
732 ShowWindow(pAPLI->hWnd, SW_RESTORE);
733 BringWindowToTop(pAPLI->hWnd);
737 void ApplicationPage_OnSwitchTo(void)
739 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
740 LV_ITEMW item;
741 int i, count;
743 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
744 for (i=0; i<count; i++) {
745 memset(&item, 0, sizeof(LV_ITEMW));
746 item.mask = LVIF_STATE|LVIF_PARAM;
747 item.iItem = i;
748 item.stateMask = (UINT)-1;
749 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
751 if (item.state & LVIS_SELECTED) {
752 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
753 break;
756 if (pAPLI) {
757 typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL);
758 PROCSWITCHTOTHISWINDOW SwitchToThisWindow;
760 HMODULE hUser32 = GetModuleHandleW(wszUser32);
761 SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, "SwitchToThisWindow");
762 if (SwitchToThisWindow) {
763 SwitchToThisWindow(pAPLI->hWnd, TRUE);
764 } else {
765 if (IsIconic(pAPLI->hWnd))
766 ShowWindow(pAPLI->hWnd, SW_RESTORE);
767 BringWindowToTop(pAPLI->hWnd);
768 SetForegroundWindow(pAPLI->hWnd);
770 if (TaskManagerSettings.MinimizeOnUse)
771 ShowWindow(hMainWnd, SW_MINIMIZE);
775 void ApplicationPage_OnEndTask(void)
777 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
778 LV_ITEMW item;
779 int i, count;
781 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
782 for (i=0; i<count; i++) {
783 memset(&item, 0, sizeof(LV_ITEMW));
784 item.mask = LVIF_STATE|LVIF_PARAM;
785 item.iItem = i;
786 item.stateMask = (UINT)-1;
787 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
788 if (item.state & LVIS_SELECTED) {
789 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
790 if (pAPLI) {
791 PostMessageW(pAPLI->hWnd, WM_CLOSE, 0, 0);
797 void ApplicationPage_OnGotoProcess(void)
799 LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
800 LV_ITEMW item;
801 int i, count;
802 /* NMHDR nmhdr; */
804 count = SendMessageW(hApplicationPageListCtrl, LVM_GETITEMCOUNT, 0, 0);
805 for (i=0; i<count; i++) {
806 memset(&item, 0, sizeof(LV_ITEMW));
807 item.mask = LVIF_STATE|LVIF_PARAM;
808 item.iItem = i;
809 item.stateMask = (UINT)-1;
810 SendMessageW(hApplicationPageListCtrl, LVM_GETITEMW, 0, (LPARAM) &item);
811 if (item.state & LVIS_SELECTED) {
812 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
813 break;
816 if (pAPLI) {
817 DWORD dwProcessId;
819 GetWindowThreadProcessId(pAPLI->hWnd, &dwProcessId);
821 * Switch to the process tab
823 SendMessageW(hTabWnd, TCM_SETCURFOCUS, 1, 0);
825 * FIXME: Select the process item in the list
830 INT_PTR CALLBACK
831 ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
833 RECT rc;
834 int nXDifference;
835 int nYDifference;
836 int cx, cy;
837 LVCOLUMNW column;
839 WCHAR wszTask[255];
840 WCHAR wszStatus[255];
842 LoadStringW(hInst, IDS_APPLICATION_TASK, wszTask, ARRAY_SIZE(wszTask));
843 LoadStringW(hInst, IDS_APPLICATION_STATUS, wszStatus, ARRAY_SIZE(wszStatus));
845 switch (message) {
846 case WM_INITDIALOG:
848 /* Save the width and height */
849 GetClientRect(hDlg, &rc);
850 nApplicationPageWidth = rc.right;
851 nApplicationPageHeight = rc.bottom;
853 /* Update window position */
854 SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
856 /* Get handles to the controls */
857 hApplicationPageListCtrl = GetDlgItem(hDlg, IDC_APPLIST);
858 hApplicationPageEndTaskButton = GetDlgItem(hDlg, IDC_ENDTASK);
859 hApplicationPageSwitchToButton = GetDlgItem(hDlg, IDC_SWITCHTO);
860 hApplicationPageNewTaskButton = GetDlgItem(hDlg, IDC_NEWTASK);
862 /* Initialize the application page's controls */
863 column.mask = LVCF_TEXT|LVCF_WIDTH;
864 column.pszText = wszTask;
865 column.cx = 250;
866 /* Add the "Task" column */
867 SendMessageW(hApplicationPageListCtrl, LVM_INSERTCOLUMNW, 0, (LPARAM) &column);
868 column.mask = LVCF_TEXT|LVCF_WIDTH;
869 column.pszText = wszStatus;
870 column.cx = 95;
871 /* Add the "Status" column */
872 SendMessageW(hApplicationPageListCtrl, LVM_INSERTCOLUMNW, 1, (LPARAM) &column);
874 SendMessageW(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_SMALL,
875 (LPARAM) ImageList_Create(16, 16, ILC_COLOR8|ILC_MASK, 0, 1));
876 SendMessageW(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_NORMAL,
877 (LPARAM) ImageList_Create(32, 32, ILC_COLOR8|ILC_MASK, 0, 1));
879 UpdateApplicationListControlViewSetting();
881 /* Start our refresh thread */
882 CloseHandle( CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, NULL));
884 return TRUE;
886 case WM_DESTROY:
887 /* Close the event handle, this will make the */
888 /* refresh thread exit when the wait fails */
889 CloseHandle(hApplicationPageEvent);
890 break;
892 case WM_COMMAND:
894 /* Handle the button clicks */
895 switch (LOWORD(wParam))
897 case IDC_ENDTASK:
898 ApplicationPage_OnEndTask();
899 break;
900 case IDC_SWITCHTO:
901 ApplicationPage_OnSwitchTo();
902 break;
903 case IDC_NEWTASK:
904 SendMessageW(hMainWnd, WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), 0);
905 break;
908 break;
910 case WM_SIZE:
911 if (wParam == SIZE_MINIMIZED)
912 return 0;
914 cx = LOWORD(lParam);
915 cy = HIWORD(lParam);
916 nXDifference = cx - nApplicationPageWidth;
917 nYDifference = cy - nApplicationPageHeight;
918 nApplicationPageWidth = cx;
919 nApplicationPageHeight = cy;
921 /* Reposition the application page's controls */
922 GetWindowRect(hApplicationPageListCtrl, &rc);
923 cx = (rc.right - rc.left) + nXDifference;
924 cy = (rc.bottom - rc.top) + nYDifference;
925 SetWindowPos(hApplicationPageListCtrl, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER);
926 InvalidateRect(hApplicationPageListCtrl, NULL, TRUE);
928 GetClientRect(hApplicationPageEndTaskButton, &rc);
929 MapWindowPoints(hApplicationPageEndTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
930 cx = rc.left + nXDifference;
931 cy = rc.top + nYDifference;
932 SetWindowPos(hApplicationPageEndTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
933 InvalidateRect(hApplicationPageEndTaskButton, NULL, TRUE);
935 GetClientRect(hApplicationPageSwitchToButton, &rc);
936 MapWindowPoints(hApplicationPageSwitchToButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
937 cx = rc.left + nXDifference;
938 cy = rc.top + nYDifference;
939 SetWindowPos(hApplicationPageSwitchToButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
940 InvalidateRect(hApplicationPageSwitchToButton, NULL, TRUE);
942 GetClientRect(hApplicationPageNewTaskButton, &rc);
943 MapWindowPoints(hApplicationPageNewTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
944 cx = rc.left + nXDifference;
945 cy = rc.top + nYDifference;
946 SetWindowPos(hApplicationPageNewTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
947 InvalidateRect(hApplicationPageNewTaskButton, NULL, TRUE);
949 break;
951 case WM_NOTIFY:
952 ApplicationPageOnNotify(wParam, lParam);
953 break;
957 return 0;