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
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
);
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)
74 hMenu
= GetMenu(hMainWnd
);
75 hWindowsMenu
= GetSubMenu(hMenu
, 3);
76 count
= SendMessageW(hApplicationPageListCtrl
, LVM_GETSELECTEDCOUNT
, 0, 0);
78 /* Only one item selected */
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 */
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 */
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
;
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
;
134 SendMessageW(hApplicationPageListCtrl
, LVM_GETITEMW
, 0, (LPARAM
) &item
);
136 pAPLI
= (LPAPPLICATION_PAGE_LIST_ITEM
)item
.lParam
;
137 if (pAPLI
->hWnd
== hWnd
)
139 bAlreadyInList
= TRUE
;
144 /* If it is already in the list then update it if necessary */
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 */
171 pAPLI
= HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM
));
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
;
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
);
216 * If an item was removed from the list then
217 * we need to resync all the items with the
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
;
229 SendMessageW(hApplicationPageListCtrl
, LVM_SETITEMW
, 0, (LPARAM
) &item
);
233 ApplicationPageUpdate();
236 static BOOL CALLBACK
EnumWindowsProc(HWND hWnd
, LPARAM lParam
)
240 BOOL bLargeIcon
= TaskManagerSettings
.View_LargeIcons
;
242 typedef int (__stdcall
*IsHungAppWindowProc
)(HWND
);
243 IsHungAppWindowProc IsHungAppWindow
;
246 /* Skip our window */
247 if (hWnd
== hMainWnd
)
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 */
260 SendMessageTimeoutW(hWnd
, WM_GETICON
, bLargeIcon
? ICON_BIG
/*1*/ : ICON_SMALL
/*0*/, 0, 0, 1000, (PDWORD_PTR
)&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
);
271 hIcon
= LoadIconW(hInst
, bLargeIcon
? MAKEINTRESOURCEW(IDI_WINDOW
) : MAKEINTRESOURCEW(IDI_WINDOWSM
));
275 IsHungAppWindow
= (IsHungAppWindowProc
)(FARPROC
)GetProcAddress(GetModuleHandleW(wszUser32
), "IsHungAppWindow");
278 bHung
= IsHungAppWindow(hWnd
);
280 AddOrUpdateHwnd(hWnd
, wszText
, hIcon
, bHung
);
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
)
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
)
306 if (dwWaitVal
== WAIT_OBJECT_0
)
308 /* Reset our event */
309 ResetEvent(hApplicationPageEvent
);
314 * Should this be EnumDesktopWindows() instead?
316 EnumWindows(EnumWindowsProc
, 0);
321 static void ApplicationPageShowContextMenu1(void)
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
);
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
);
344 static void ApplicationPageShowContextMenu2(void)
353 hMenu
= LoadMenuW(hInst
, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT2
));
354 hSubMenu
= GetSubMenu(hMenu
, 0);
356 count
= SendMessageW(hApplicationPageListCtrl
, LVM_GETSELECTEDCOUNT
, 0, 0);
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
);
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
);
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
);
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
;
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
)
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();
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)
440 lstrcpynW(pnmdi
->item
.pszText
, wszNotResponding
, pnmdi
->item
.cchTextMax
);
442 lstrcpynW(pnmdi
->item
.pszText
, wszRunning
, pnmdi
->item
.cchTextMax
);
449 if (SendMessageW(hApplicationPageListCtrl
, LVM_GETSELECTEDCOUNT
, 0, 0) < 1)
451 ApplicationPageShowContextMenu1();
455 ApplicationPageShowContextMenu2();
462 ApplicationPage_OnSwitchTo();
467 else if (pnmh
->hwndFrom
== (HWND
)SendMessageW(hApplicationPageListCtrl
, LVM_GETHEADER
, 0, 0))
473 if (SendMessageW(hApplicationPageListCtrl
, LVM_GETSELECTEDCOUNT
, 0, 0) < 1)
475 ApplicationPageShowContextMenu1();
479 ApplicationPageShowContextMenu2();
486 SendMessageW(hApplicationPageListCtrl
, LVM_SORTITEMS
, 0, (LPARAM
) ApplicationPageCompareFunc
);
487 bSortAscending
= !bSortAscending
;
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
)
513 else if (TaskManagerSettings
.View_SmallIcons
)
514 dwStyle
|= LVS_SMALLICON
;
516 dwStyle
|= LVS_REPORT
;
518 SetWindowLongW(hApplicationPageListCtrl
, GWL_STYLE
, dwStyle
);
520 RefreshApplicationPage();
523 void ApplicationPage_OnViewLargeIcons(void)
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)
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)
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
;
579 count
= SendMessageW(hApplicationPageListCtrl
, LVM_GETITEMCOUNT
, 0, 0);
580 hWndArray
= HeapAlloc(GetProcessHeap(), 0,
581 sizeof(HWND
) * count
);
584 for (i
=0; i
<count
; i
++) {
585 memset(&item
, 0, sizeof(LV_ITEMW
));
586 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
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
;
595 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
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
;
612 count
= SendMessageW(hApplicationPageListCtrl
, LVM_GETITEMCOUNT
, 0, 0);
613 hWndArray
= HeapAlloc(GetProcessHeap(), 0,
614 sizeof(HWND
) * count
);
617 for (i
=0; i
<count
; i
++) {
618 memset(&item
, 0, sizeof(LV_ITEMW
));
619 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
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
;
627 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
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
;
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
;
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
;
653 ShowWindow(pAPLI
->hWnd
, SW_MINIMIZE
);
659 void ApplicationPage_OnWindowsMaximize(void)
661 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
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
;
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
;
675 ShowWindow(pAPLI
->hWnd
, SW_MAXIMIZE
);
681 void ApplicationPage_OnWindowsCascade(void)
683 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
689 count
= SendMessageW(hApplicationPageListCtrl
, LVM_GETITEMCOUNT
, 0, 0);
690 hWndArray
= HeapAlloc(GetProcessHeap(), 0,
691 sizeof(HWND
) * count
);
694 for (i
=0; i
<count
; i
++) {
695 memset(&item
, 0, sizeof(LV_ITEMW
));
696 item
.mask
= LVIF_STATE
|LVIF_PARAM
;
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
;
703 hWndArray
[nWndCount
] = pAPLI
->hWnd
;
708 CascadeWindows(NULL
, 0, NULL
, nWndCount
, hWndArray
);
709 HeapFree(GetProcessHeap(), 0, hWndArray
);
712 void ApplicationPage_OnWindowsBringToFront(void)
714 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
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
;
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
;
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
;
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
;
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
;
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
);
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
;
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
;
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
;
791 PostMessageW(pAPLI
->hWnd
, WM_CLOSE
, 0, 0);
797 void ApplicationPage_OnGotoProcess(void)
799 LPAPPLICATION_PAGE_LIST_ITEM pAPLI
= NULL
;
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
;
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
;
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
831 ApplicationPageWndProc(HWND hDlg
, UINT message
, WPARAM wParam
, LPARAM lParam
)
840 WCHAR wszStatus
[255];
842 LoadStringW(hInst
, IDS_APPLICATION_TASK
, wszTask
, ARRAY_SIZE(wszTask
));
843 LoadStringW(hInst
, IDS_APPLICATION_STATUS
, wszStatus
, ARRAY_SIZE(wszStatus
));
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
;
866 /* Add the "Task" column */
867 SendMessageW(hApplicationPageListCtrl
, LVM_INSERTCOLUMNW
, 0, (LPARAM
) &column
);
868 column
.mask
= LVCF_TEXT
|LVCF_WIDTH
;
869 column
.pszText
= wszStatus
;
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
));
887 /* Close the event handle, this will make the */
888 /* refresh thread exit when the wait fails */
889 CloseHandle(hApplicationPageEvent
);
894 /* Handle the button clicks */
895 switch (LOWORD(wParam
))
898 ApplicationPage_OnEndTask();
901 ApplicationPage_OnSwitchTo();
904 SendMessageW(hMainWnd
, WM_COMMAND
, MAKEWPARAM(ID_FILE_NEW
, 0), 0);
911 if (wParam
== SIZE_MINIMIZED
)
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
);
952 ApplicationPageOnNotify(wParam
, lParam
);