mirror of
https://github.com/reactos/wine.git
synced 2024-11-26 21:20:25 +00:00
954 lines
32 KiB
C
954 lines
32 KiB
C
/*
|
|
* ReactOS Task Manager
|
|
*
|
|
* applpage.c
|
|
*
|
|
* Copyright (C) 1999 - 2001 Brian Palmer <brianp@reactos.org>
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#define WIN32_LEAN_AND_MEAN /* Exclude rarely-used stuff from Windows headers */
|
|
#include <windows.h>
|
|
#include <commctrl.h>
|
|
#include <stdlib.h>
|
|
#include <malloc.h>
|
|
#include <memory.h>
|
|
#include <tchar.h>
|
|
#include <stdio.h>
|
|
|
|
#include "taskmgr.h"
|
|
|
|
typedef struct
|
|
{
|
|
HWND hWnd;
|
|
TCHAR szTitle[260];
|
|
HICON hIcon;
|
|
BOOL bHung;
|
|
} APPLICATION_PAGE_LIST_ITEM, *LPAPPLICATION_PAGE_LIST_ITEM;
|
|
|
|
HWND hApplicationPage; /* Application List Property Page */
|
|
HWND hApplicationPageListCtrl; /* Application ListCtrl Window */
|
|
HWND hApplicationPageEndTaskButton; /* Application End Task button */
|
|
HWND hApplicationPageSwitchToButton; /* Application Switch To button */
|
|
HWND hApplicationPageNewTaskButton; /* Application New Task button */
|
|
static int nApplicationPageWidth;
|
|
static int nApplicationPageHeight;
|
|
static HANDLE hApplicationPageEvent = NULL; /* When this event becomes signaled then we refresh the app list */
|
|
static BOOL bSortAscending = TRUE;
|
|
|
|
#if 0
|
|
void SwitchToThisWindow (
|
|
HWND hWnd, /* Handle to the window that should be activated */
|
|
BOOL bRestore /* Restore the window if it is minimized */
|
|
);
|
|
#endif
|
|
|
|
static void ApplicationPageUpdate(void)
|
|
{
|
|
/* Enable or disable the "End Task" & "Switch To" buttons */
|
|
if (ListView_GetSelectedCount(hApplicationPageListCtrl))
|
|
{
|
|
EnableWindow(hApplicationPageEndTaskButton, TRUE);
|
|
EnableWindow(hApplicationPageSwitchToButton, TRUE);
|
|
}
|
|
else
|
|
{
|
|
EnableWindow(hApplicationPageEndTaskButton, FALSE);
|
|
EnableWindow(hApplicationPageSwitchToButton, FALSE);
|
|
}
|
|
|
|
/* If we are on the applications tab the the windows menu will */
|
|
/* be present on the menu bar so enable & disable the menu items */
|
|
if (TabCtrl_GetCurSel(hTabWnd) == 0)
|
|
{
|
|
HMENU hMenu;
|
|
HMENU hWindowsMenu;
|
|
|
|
hMenu = GetMenu(hMainWnd);
|
|
hWindowsMenu = GetSubMenu(hMenu, 3);
|
|
|
|
/* Only one item selected */
|
|
if (ListView_GetSelectedCount(hApplicationPageListCtrl) == 1)
|
|
{
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_ENABLED);
|
|
}
|
|
/* More than one item selected */
|
|
else if (ListView_GetSelectedCount(hApplicationPageListCtrl) > 1)
|
|
{
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
}
|
|
/* No items selected */
|
|
else
|
|
{
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void AddOrUpdateHwnd(HWND hWnd, TCHAR *szTitle, HICON hIcon, BOOL bHung)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
HIMAGELIST hImageListLarge;
|
|
HIMAGELIST hImageListSmall;
|
|
LV_ITEM item;
|
|
int i;
|
|
BOOL bAlreadyInList = FALSE;
|
|
BOOL bItemRemoved = FALSE;
|
|
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
|
|
/* Get the image lists */
|
|
hImageListLarge = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_NORMAL);
|
|
hImageListSmall = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_SMALL);
|
|
|
|
/* Check to see if it's already in our list */
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++)
|
|
{
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_IMAGE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
if (pAPLI->hWnd == hWnd)
|
|
{
|
|
bAlreadyInList = TRUE;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/* If it is already in the list then update it if necessary */
|
|
if (bAlreadyInList)
|
|
{
|
|
/* Check to see if anything needs updating */
|
|
if ((pAPLI->hIcon != hIcon) ||
|
|
(_tcsicmp(pAPLI->szTitle, szTitle) != 0) ||
|
|
(pAPLI->bHung != bHung))
|
|
{
|
|
/* Update the structure */
|
|
pAPLI->hIcon = hIcon;
|
|
pAPLI->bHung = bHung;
|
|
_tcscpy(pAPLI->szTitle, szTitle);
|
|
|
|
/* Update the image list */
|
|
ImageList_ReplaceIcon(hImageListLarge, item.iItem, hIcon);
|
|
ImageList_ReplaceIcon(hImageListSmall, item.iItem, hIcon);
|
|
|
|
/* Update the list view */
|
|
SendMessage(hApplicationPageListCtrl, LVM_REDRAWITEMS, 0, ListView_GetItemCount(hApplicationPageListCtrl));
|
|
/* UpdateWindow(hApplicationPageListCtrl); */
|
|
InvalidateRect(hApplicationPageListCtrl, NULL, 0);
|
|
}
|
|
}
|
|
/* It is not already in the list so add it */
|
|
else
|
|
{
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)malloc(sizeof(APPLICATION_PAGE_LIST_ITEM));
|
|
|
|
pAPLI->hWnd = hWnd;
|
|
pAPLI->hIcon = hIcon;
|
|
pAPLI->bHung = bHung;
|
|
_tcscpy(pAPLI->szTitle, szTitle);
|
|
|
|
/* Add the item to the list */
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
|
|
ImageList_AddIcon(hImageListLarge, hIcon);
|
|
item.iImage = ImageList_AddIcon(hImageListSmall, hIcon);
|
|
item.pszText = LPSTR_TEXTCALLBACK;
|
|
item.iItem = ListView_GetItemCount(hApplicationPageListCtrl);
|
|
item.lParam = (LPARAM)pAPLI;
|
|
SendMessage(hApplicationPageListCtrl, LVM_INSERTITEM, 0, (LPARAM) &item);
|
|
}
|
|
|
|
|
|
/* Check to see if we need to remove any items from the list */
|
|
for (i=ListView_GetItemCount(hApplicationPageListCtrl)-1; i>=0; i--)
|
|
{
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_IMAGE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
if (!IsWindow(pAPLI->hWnd)||
|
|
(_tcslen(pAPLI->szTitle) <= 0) ||
|
|
!IsWindowVisible(pAPLI->hWnd) ||
|
|
(GetParent(pAPLI->hWnd) != NULL) ||
|
|
(GetWindow(pAPLI->hWnd, GW_OWNER) != NULL) ||
|
|
(GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
|
|
{
|
|
ImageList_Remove(hImageListLarge, item.iItem);
|
|
ImageList_Remove(hImageListSmall, item.iItem);
|
|
|
|
SendMessage(hApplicationPageListCtrl, LVM_DELETEITEM, item.iItem, 0);
|
|
free(pAPLI);
|
|
bItemRemoved = TRUE;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* If an item was removed from the list then
|
|
* we need to resync all the items with the
|
|
* image list
|
|
*/
|
|
if (bItemRemoved)
|
|
{
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++)
|
|
{
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_IMAGE;
|
|
item.iItem = i;
|
|
item.iImage = i;
|
|
SendMessage(hApplicationPageListCtrl, LVM_SETITEM, 0, (LPARAM) &item);
|
|
}
|
|
}
|
|
|
|
ApplicationPageUpdate();
|
|
}
|
|
|
|
static BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
|
|
{
|
|
HICON hIcon;
|
|
TCHAR szText[260];
|
|
BOOL bLargeIcon;
|
|
BOOL bHung = FALSE;
|
|
typedef int (__stdcall *IsHungAppWindowProc)(HWND);
|
|
IsHungAppWindowProc IsHungAppWindow;
|
|
|
|
|
|
/* Skip our window */
|
|
if (hWnd == hMainWnd)
|
|
return TRUE;
|
|
|
|
bLargeIcon = TaskManagerSettings.View_LargeIcons ? TRUE : FALSE;
|
|
|
|
GetWindowText(hWnd, szText, 260); /* Get the window text */
|
|
|
|
/* Check and see if this is a top-level app window */
|
|
if ((_tcslen(szText) <= 0) ||
|
|
!IsWindowVisible(hWnd) ||
|
|
(GetParent(hWnd) != NULL) ||
|
|
(GetWindow(hWnd, GW_OWNER) != NULL) ||
|
|
(GetWindowLong(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
|
|
{
|
|
return TRUE; /* Skip this window */
|
|
}
|
|
|
|
/* Get the icon for this window */
|
|
hIcon = NULL;
|
|
SendMessageTimeout(hWnd, WM_GETICON, bLargeIcon ? ICON_BIG /*1*/ : ICON_SMALL /*0*/, 0, 0, 1000, (PDWORD_PTR)&hIcon);
|
|
|
|
if (!hIcon)
|
|
{
|
|
hIcon = (HICON)GetClassLongPtr(hWnd, bLargeIcon ? GCLP_HICON : GCLP_HICONSM);
|
|
if (!hIcon) hIcon = (HICON)GetClassLongPtr(hWnd, bLargeIcon ? GCLP_HICONSM : GCLP_HICON);
|
|
if (!hIcon) SendMessageTimeout(hWnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (PDWORD_PTR)&hIcon);
|
|
if (!hIcon) SendMessageTimeout(hWnd, WM_GETICON, bLargeIcon ? ICON_SMALL /*0*/ : ICON_BIG /*1*/, 0, 0, 1000, (PDWORD_PTR)&hIcon);
|
|
}
|
|
|
|
if (!hIcon)
|
|
hIcon = LoadIcon(hInst, bLargeIcon ? MAKEINTRESOURCE(IDI_WINDOW) : MAKEINTRESOURCE(IDI_WINDOWSM));
|
|
|
|
bHung = FALSE;
|
|
|
|
IsHungAppWindow = (IsHungAppWindowProc)(FARPROC)GetProcAddress(GetModuleHandle(_T("USER32.DLL")), "IsHungAppWindow");
|
|
|
|
if (IsHungAppWindow)
|
|
bHung = IsHungAppWindow(hWnd);
|
|
|
|
AddOrUpdateHwnd(hWnd, szText, hIcon, bHung);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
static DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
|
|
{
|
|
/* Create the event */
|
|
hApplicationPageEvent = CreateEvent(NULL, TRUE, TRUE, NULL);
|
|
|
|
/* If we couldn't create the event then exit the thread */
|
|
if (!hApplicationPageEvent)
|
|
return 0;
|
|
|
|
while (1)
|
|
{
|
|
DWORD dwWaitVal;
|
|
|
|
/* Wait on the event */
|
|
dwWaitVal = WaitForSingleObject(hApplicationPageEvent, INFINITE);
|
|
|
|
/* If the wait failed then the event object must have been */
|
|
/* closed and the task manager is exiting so exit this thread */
|
|
if (dwWaitVal == WAIT_FAILED)
|
|
return 0;
|
|
|
|
if (dwWaitVal == WAIT_OBJECT_0)
|
|
{
|
|
/* Reset our event */
|
|
ResetEvent(hApplicationPageEvent);
|
|
|
|
/*
|
|
* FIXME:
|
|
*
|
|
* Should this be EnumDesktopWindows() instead?
|
|
*/
|
|
EnumWindows(EnumWindowsProc, 0);
|
|
}
|
|
}
|
|
}
|
|
|
|
static void ApplicationPageShowContextMenu1(void)
|
|
{
|
|
HMENU hMenu;
|
|
HMENU hSubMenu;
|
|
POINT pt;
|
|
|
|
GetCursorPos(&pt);
|
|
|
|
hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT1));
|
|
hSubMenu = GetSubMenu(hMenu, 0);
|
|
|
|
if (TaskManagerSettings.View_LargeIcons)
|
|
CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_LARGE, MF_BYCOMMAND);
|
|
else if (TaskManagerSettings.View_SmallIcons)
|
|
CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_SMALL, MF_BYCOMMAND);
|
|
else
|
|
CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND);
|
|
|
|
TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL);
|
|
|
|
DestroyMenu(hMenu);
|
|
}
|
|
|
|
static void ApplicationPageShowContextMenu2(void)
|
|
{
|
|
HMENU hMenu;
|
|
HMENU hSubMenu;
|
|
POINT pt;
|
|
|
|
GetCursorPos(&pt);
|
|
|
|
hMenu = LoadMenu(hInst, MAKEINTRESOURCE(IDR_APPLICATION_PAGE_CONTEXT2));
|
|
hSubMenu = GetSubMenu(hMenu, 0);
|
|
|
|
if (ListView_GetSelectedCount(hApplicationPageListCtrl) == 1)
|
|
{
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_ENABLED);
|
|
}
|
|
else if (ListView_GetSelectedCount(hApplicationPageListCtrl) > 1)
|
|
{
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_ENABLED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
}
|
|
else
|
|
{
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
|
|
}
|
|
|
|
SetMenuDefaultItem(hSubMenu, ID_APPLICATION_PAGE_SWITCHTO, MF_BYCOMMAND);
|
|
|
|
TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL);
|
|
|
|
DestroyMenu(hMenu);
|
|
}
|
|
|
|
static int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM Param1;
|
|
LPAPPLICATION_PAGE_LIST_ITEM Param2;
|
|
|
|
if (bSortAscending) {
|
|
Param1 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam1;
|
|
Param2 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam2;
|
|
} else {
|
|
Param1 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam2;
|
|
Param2 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam1;
|
|
}
|
|
return _tcscmp(Param1->szTitle, Param2->szTitle);
|
|
}
|
|
|
|
static void ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam)
|
|
{
|
|
int idctrl;
|
|
LPNMHDR pnmh;
|
|
LPNM_LISTVIEW pnmv;
|
|
LV_DISPINFO* pnmdi;
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI;
|
|
|
|
|
|
idctrl = (int) wParam;
|
|
pnmh = (LPNMHDR) lParam;
|
|
pnmv = (LPNM_LISTVIEW) lParam;
|
|
pnmdi = (LV_DISPINFO*) lParam;
|
|
|
|
if (pnmh->hwndFrom == hApplicationPageListCtrl) {
|
|
switch (pnmh->code) {
|
|
case LVN_ITEMCHANGED:
|
|
ApplicationPageUpdate();
|
|
break;
|
|
|
|
case LVN_GETDISPINFO:
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)pnmdi->item.lParam;
|
|
|
|
/* Update the item text */
|
|
if (pnmdi->item.iSubItem == 0)
|
|
{
|
|
_tcsncpy(pnmdi->item.pszText, pAPLI->szTitle, pnmdi->item.cchTextMax);
|
|
}
|
|
|
|
/* Update the item status */
|
|
else if (pnmdi->item.iSubItem == 1)
|
|
{
|
|
if (pAPLI->bHung)
|
|
_tcsncpy(pnmdi->item.pszText, _T("Not Responding"), pnmdi->item.cchTextMax);
|
|
else
|
|
_tcsncpy(pnmdi->item.pszText, _T("Running"), pnmdi->item.cchTextMax);
|
|
}
|
|
|
|
break;
|
|
|
|
case NM_RCLICK:
|
|
|
|
if (ListView_GetSelectedCount(hApplicationPageListCtrl) < 1)
|
|
{
|
|
ApplicationPageShowContextMenu1();
|
|
}
|
|
else
|
|
{
|
|
ApplicationPageShowContextMenu2();
|
|
}
|
|
|
|
break;
|
|
|
|
case NM_DBLCLK:
|
|
|
|
ApplicationPage_OnSwitchTo();
|
|
|
|
break;
|
|
}
|
|
}
|
|
else if (pnmh->hwndFrom == ListView_GetHeader(hApplicationPageListCtrl))
|
|
{
|
|
switch (pnmh->code)
|
|
{
|
|
case NM_RCLICK:
|
|
|
|
if (ListView_GetSelectedCount(hApplicationPageListCtrl) < 1)
|
|
{
|
|
ApplicationPageShowContextMenu1();
|
|
}
|
|
else
|
|
{
|
|
ApplicationPageShowContextMenu2();
|
|
}
|
|
|
|
break;
|
|
|
|
case HDN_ITEMCLICK:
|
|
|
|
SendMessage(hApplicationPageListCtrl, LVM_SORTITEMS, 0, (LPARAM) ApplicationPageCompareFunc);
|
|
bSortAscending = !bSortAscending;
|
|
|
|
break;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
INT_PTR CALLBACK
|
|
ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
RECT rc;
|
|
int nXDifference;
|
|
int nYDifference;
|
|
LV_COLUMN column;
|
|
TCHAR szTemp[256];
|
|
int cx, cy;
|
|
|
|
switch (message) {
|
|
case WM_INITDIALOG:
|
|
|
|
/* Save the width and height */
|
|
GetClientRect(hDlg, &rc);
|
|
nApplicationPageWidth = rc.right;
|
|
nApplicationPageHeight = rc.bottom;
|
|
|
|
/* Update window position */
|
|
SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
|
|
|
|
/* Get handles to the controls */
|
|
hApplicationPageListCtrl = GetDlgItem(hDlg, IDC_APPLIST);
|
|
hApplicationPageEndTaskButton = GetDlgItem(hDlg, IDC_ENDTASK);
|
|
hApplicationPageSwitchToButton = GetDlgItem(hDlg, IDC_SWITCHTO);
|
|
hApplicationPageNewTaskButton = GetDlgItem(hDlg, IDC_NEWTASK);
|
|
|
|
SetWindowText(hApplicationPageListCtrl, _T("Tasks"));
|
|
|
|
/* Initialize the application page's controls */
|
|
column.mask = LVCF_TEXT|LVCF_WIDTH;
|
|
_tcscpy(szTemp, _T("Task"));
|
|
column.pszText = szTemp;
|
|
column.cx = 250;
|
|
/* Add the "Task" column */
|
|
SendMessage(hApplicationPageListCtrl, LVM_INSERTCOLUMN, 0, (LPARAM) &column);
|
|
column.mask = LVCF_TEXT|LVCF_WIDTH;
|
|
_tcscpy(szTemp, _T("Status"));
|
|
column.pszText = szTemp;
|
|
column.cx = 95;
|
|
/* Add the "Status" column */
|
|
SendMessage(hApplicationPageListCtrl, LVM_INSERTCOLUMN, 1, (LPARAM) &column);
|
|
|
|
SendMessage(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_SMALL,
|
|
(LPARAM) ImageList_Create(16, 16, ILC_COLOR8|ILC_MASK, 0, 1));
|
|
SendMessage(hApplicationPageListCtrl, LVM_SETIMAGELIST, LVSIL_NORMAL,
|
|
(LPARAM) ImageList_Create(32, 32, ILC_COLOR8|ILC_MASK, 0, 1));
|
|
|
|
UpdateApplicationListControlViewSetting();
|
|
|
|
/* Start our refresh thread */
|
|
CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, NULL);
|
|
|
|
return TRUE;
|
|
|
|
case WM_DESTROY:
|
|
/* Close the event handle, this will make the */
|
|
/* refresh thread exit when the wait fails */
|
|
CloseHandle(hApplicationPageEvent);
|
|
break;
|
|
|
|
case WM_COMMAND:
|
|
|
|
/* Handle the button clicks */
|
|
switch (LOWORD(wParam))
|
|
{
|
|
case IDC_ENDTASK:
|
|
ApplicationPage_OnEndTask();
|
|
break;
|
|
case IDC_SWITCHTO:
|
|
ApplicationPage_OnSwitchTo();
|
|
break;
|
|
case IDC_NEWTASK:
|
|
SendMessage(hMainWnd, WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), 0);
|
|
break;
|
|
}
|
|
|
|
break;
|
|
|
|
case WM_SIZE:
|
|
if (wParam == SIZE_MINIMIZED)
|
|
return 0;
|
|
|
|
cx = LOWORD(lParam);
|
|
cy = HIWORD(lParam);
|
|
nXDifference = cx - nApplicationPageWidth;
|
|
nYDifference = cy - nApplicationPageHeight;
|
|
nApplicationPageWidth = cx;
|
|
nApplicationPageHeight = cy;
|
|
|
|
/* Reposition the application page's controls */
|
|
GetWindowRect(hApplicationPageListCtrl, &rc);
|
|
cx = (rc.right - rc.left) + nXDifference;
|
|
cy = (rc.bottom - rc.top) + nYDifference;
|
|
SetWindowPos(hApplicationPageListCtrl, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER);
|
|
InvalidateRect(hApplicationPageListCtrl, NULL, TRUE);
|
|
|
|
GetClientRect(hApplicationPageEndTaskButton, &rc);
|
|
MapWindowPoints(hApplicationPageEndTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
|
|
cx = rc.left + nXDifference;
|
|
cy = rc.top + nYDifference;
|
|
SetWindowPos(hApplicationPageEndTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
|
|
InvalidateRect(hApplicationPageEndTaskButton, NULL, TRUE);
|
|
|
|
GetClientRect(hApplicationPageSwitchToButton, &rc);
|
|
MapWindowPoints(hApplicationPageSwitchToButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
|
|
cx = rc.left + nXDifference;
|
|
cy = rc.top + nYDifference;
|
|
SetWindowPos(hApplicationPageSwitchToButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
|
|
InvalidateRect(hApplicationPageSwitchToButton, NULL, TRUE);
|
|
|
|
GetClientRect(hApplicationPageNewTaskButton, &rc);
|
|
MapWindowPoints(hApplicationPageNewTaskButton, hDlg, (LPPOINT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
|
|
cx = rc.left + nXDifference;
|
|
cy = rc.top + nYDifference;
|
|
SetWindowPos(hApplicationPageNewTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
|
|
InvalidateRect(hApplicationPageNewTaskButton, NULL, TRUE);
|
|
|
|
break;
|
|
|
|
case WM_NOTIFY:
|
|
ApplicationPageOnNotify(wParam, lParam);
|
|
break;
|
|
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
void RefreshApplicationPage(void)
|
|
{
|
|
/* Signal the event so that our refresh thread */
|
|
/* will wake up and refresh the application page */
|
|
SetEvent(hApplicationPageEvent);
|
|
}
|
|
|
|
void UpdateApplicationListControlViewSetting(void)
|
|
{
|
|
DWORD dwStyle = GetWindowLong(hApplicationPageListCtrl, GWL_STYLE);
|
|
|
|
dwStyle &= ~LVS_REPORT;
|
|
dwStyle &= ~LVS_ICON;
|
|
dwStyle &= ~LVS_LIST;
|
|
dwStyle &= ~LVS_SMALLICON;
|
|
|
|
if (TaskManagerSettings.View_LargeIcons)
|
|
dwStyle |= LVS_ICON;
|
|
else if (TaskManagerSettings.View_SmallIcons)
|
|
dwStyle |= LVS_SMALLICON;
|
|
else
|
|
dwStyle |= LVS_REPORT;
|
|
|
|
SetWindowLong(hApplicationPageListCtrl, GWL_STYLE, dwStyle);
|
|
|
|
RefreshApplicationPage();
|
|
}
|
|
|
|
void ApplicationPage_OnViewLargeIcons(void)
|
|
{
|
|
HMENU hMenu;
|
|
HMENU hViewMenu;
|
|
|
|
hMenu = GetMenu(hMainWnd);
|
|
hViewMenu = GetSubMenu(hMenu, 2);
|
|
|
|
TaskManagerSettings.View_LargeIcons = TRUE;
|
|
TaskManagerSettings.View_SmallIcons = FALSE;
|
|
TaskManagerSettings.View_Details = FALSE;
|
|
CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_LARGE, MF_BYCOMMAND);
|
|
|
|
UpdateApplicationListControlViewSetting();
|
|
}
|
|
|
|
void ApplicationPage_OnViewSmallIcons(void)
|
|
{
|
|
HMENU hMenu;
|
|
HMENU hViewMenu;
|
|
|
|
hMenu = GetMenu(hMainWnd);
|
|
hViewMenu = GetSubMenu(hMenu, 2);
|
|
|
|
TaskManagerSettings.View_LargeIcons = FALSE;
|
|
TaskManagerSettings.View_SmallIcons = TRUE;
|
|
TaskManagerSettings.View_Details = FALSE;
|
|
CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_SMALL, MF_BYCOMMAND);
|
|
|
|
UpdateApplicationListControlViewSetting();
|
|
}
|
|
|
|
void ApplicationPage_OnViewDetails(void)
|
|
{
|
|
HMENU hMenu;
|
|
HMENU hViewMenu;
|
|
|
|
hMenu = GetMenu(hMainWnd);
|
|
hViewMenu = GetSubMenu(hMenu, 2);
|
|
|
|
TaskManagerSettings.View_LargeIcons = FALSE;
|
|
TaskManagerSettings.View_SmallIcons = FALSE;
|
|
TaskManagerSettings.View_Details = TRUE;
|
|
CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, ID_VIEW_DETAILS, MF_BYCOMMAND);
|
|
|
|
UpdateApplicationListControlViewSetting();
|
|
}
|
|
|
|
void ApplicationPage_OnWindowsTileHorizontally(void)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
LV_ITEM item;
|
|
int i;
|
|
HWND* hWndArray;
|
|
int nWndCount;
|
|
|
|
hWndArray = (HWND*)malloc(sizeof(HWND) * ListView_GetItemCount(hApplicationPageListCtrl));
|
|
nWndCount = 0;
|
|
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_STATE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
item.stateMask = (UINT)-1;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
|
|
if (item.state & LVIS_SELECTED) {
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
|
|
if (pAPLI) {
|
|
hWndArray[nWndCount] = pAPLI->hWnd;
|
|
nWndCount++;
|
|
}
|
|
}
|
|
}
|
|
TileWindows(NULL, MDITILE_HORIZONTAL, NULL, nWndCount, hWndArray);
|
|
free(hWndArray);
|
|
}
|
|
|
|
void ApplicationPage_OnWindowsTileVertically(void)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
LV_ITEM item;
|
|
int i;
|
|
HWND* hWndArray;
|
|
int nWndCount;
|
|
|
|
hWndArray = (HWND*)malloc(sizeof(HWND) * ListView_GetItemCount(hApplicationPageListCtrl));
|
|
nWndCount = 0;
|
|
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_STATE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
item.stateMask = (UINT)-1;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
|
|
if (item.state & LVIS_SELECTED) {
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
if (pAPLI) {
|
|
hWndArray[nWndCount] = pAPLI->hWnd;
|
|
nWndCount++;
|
|
}
|
|
}
|
|
}
|
|
|
|
TileWindows(NULL, MDITILE_VERTICAL, NULL, nWndCount, hWndArray);
|
|
free(hWndArray);
|
|
}
|
|
|
|
void ApplicationPage_OnWindowsMinimize(void)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
LV_ITEM item;
|
|
int i;
|
|
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_STATE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
item.stateMask = (UINT)-1;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
if (item.state & LVIS_SELECTED) {
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
if (pAPLI) {
|
|
ShowWindow(pAPLI->hWnd, SW_MINIMIZE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ApplicationPage_OnWindowsMaximize(void)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
LV_ITEM item;
|
|
int i;
|
|
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_STATE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
item.stateMask = (UINT)-1;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
if (item.state & LVIS_SELECTED) {
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
if (pAPLI) {
|
|
ShowWindow(pAPLI->hWnd, SW_MAXIMIZE);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ApplicationPage_OnWindowsCascade(void)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
LV_ITEM item;
|
|
int i;
|
|
HWND* hWndArray;
|
|
int nWndCount;
|
|
|
|
hWndArray = (HWND*)malloc(sizeof(HWND) * ListView_GetItemCount(hApplicationPageListCtrl));
|
|
nWndCount = 0;
|
|
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_STATE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
item.stateMask = (UINT)-1;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
if (item.state & LVIS_SELECTED) {
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
if (pAPLI) {
|
|
hWndArray[nWndCount] = pAPLI->hWnd;
|
|
nWndCount++;
|
|
}
|
|
}
|
|
}
|
|
CascadeWindows(NULL, 0, NULL, nWndCount, hWndArray);
|
|
free(hWndArray);
|
|
}
|
|
|
|
void ApplicationPage_OnWindowsBringToFront(void)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
LV_ITEM item;
|
|
int i;
|
|
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_STATE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
item.stateMask = (UINT)-1;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
if (item.state & LVIS_SELECTED) {
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
break;
|
|
}
|
|
}
|
|
if (pAPLI) {
|
|
if (IsIconic(pAPLI->hWnd))
|
|
ShowWindow(pAPLI->hWnd, SW_RESTORE);
|
|
BringWindowToTop(pAPLI->hWnd);
|
|
}
|
|
}
|
|
|
|
void ApplicationPage_OnSwitchTo(void)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
LV_ITEM item;
|
|
int i;
|
|
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_STATE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
item.stateMask = (UINT)-1;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
|
|
if (item.state & LVIS_SELECTED) {
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
break;
|
|
}
|
|
}
|
|
if (pAPLI) {
|
|
typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL);
|
|
PROCSWITCHTOTHISWINDOW SwitchToThisWindow;
|
|
|
|
HMODULE hUser32 = GetModuleHandle(_T("USER32"));
|
|
SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, "SwitchToThisWindow");
|
|
if (SwitchToThisWindow) {
|
|
SwitchToThisWindow(pAPLI->hWnd, TRUE);
|
|
} else {
|
|
if (IsIconic(pAPLI->hWnd))
|
|
ShowWindow(pAPLI->hWnd, SW_RESTORE);
|
|
BringWindowToTop(pAPLI->hWnd);
|
|
SetForegroundWindow(pAPLI->hWnd);
|
|
}
|
|
if (TaskManagerSettings.MinimizeOnUse)
|
|
ShowWindow(hMainWnd, SW_MINIMIZE);
|
|
}
|
|
}
|
|
|
|
void ApplicationPage_OnEndTask(void)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
LV_ITEM item;
|
|
int i;
|
|
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_STATE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
item.stateMask = (UINT)-1;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
if (item.state & LVIS_SELECTED) {
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
if (pAPLI) {
|
|
PostMessage(pAPLI->hWnd, WM_CLOSE, 0, 0);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void ApplicationPage_OnGotoProcess(void)
|
|
{
|
|
LPAPPLICATION_PAGE_LIST_ITEM pAPLI = NULL;
|
|
LV_ITEM item;
|
|
int i;
|
|
/* NMHDR nmhdr; */
|
|
|
|
for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
|
|
memset(&item, 0, sizeof(LV_ITEM));
|
|
item.mask = LVIF_STATE|LVIF_PARAM;
|
|
item.iItem = i;
|
|
item.stateMask = (UINT)-1;
|
|
SendMessage(hApplicationPageListCtrl, LVM_GETITEM, 0, (LPARAM) &item);
|
|
if (item.state & LVIS_SELECTED) {
|
|
pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
|
|
break;
|
|
}
|
|
}
|
|
if (pAPLI) {
|
|
DWORD dwProcessId;
|
|
|
|
GetWindowThreadProcessId(pAPLI->hWnd, &dwProcessId);
|
|
/*
|
|
* Switch to the process tab
|
|
*/
|
|
TabCtrl_SetCurFocus(hTabWnd, 1);
|
|
/*
|
|
* FIXME: Select the process item in the list
|
|
*/
|
|
for (i=0; i<ListView_GetItemCount(hProcessPage); i++) {
|
|
}
|
|
}
|
|
}
|