ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

applpage.c
Go to the documentation of this file.
00001 /*
00002  *  ReactOS Task Manager
00003  *
00004  *  applpage.c
00005  *
00006  *  Copyright (C) 1999 - 2001  Brian Palmer  <brianp@reactos.org>
00007  *                2005         Klemens Friedl <frik85@reactos.at>
00008  *
00009  * This library is free software; you can redistribute it and/or
00010  * modify it under the terms of the GNU Lesser General Public
00011  * License as published by the Free Software Foundation; either
00012  * version 2.1 of the License, or (at your option) any later version.
00013  *
00014  * This library is distributed in the hope that it will be useful,
00015  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00016  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00017  * Lesser General Public License for more details.
00018  *
00019  * You should have received a copy of the GNU Lesser General Public
00020  * License along with this library; if not, write to the Free Software
00021  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00022  */
00023 
00024 #include <precomp.h>
00025 
00026 typedef struct
00027 {
00028     HWND    hWnd;
00029     WCHAR   szTitle[260];
00030     HICON   hIcon;
00031     BOOL    bHung;
00032 } APPLICATION_PAGE_LIST_ITEM, *LPAPPLICATION_PAGE_LIST_ITEM;
00033 
00034 HWND            hApplicationPage;               /* Application List Property Page */
00035 HWND            hApplicationPageListCtrl;       /* Application ListCtrl Window */
00036 HWND            hApplicationPageEndTaskButton;  /* Application End Task button */
00037 HWND            hApplicationPageSwitchToButton; /* Application Switch To button */
00038 HWND            hApplicationPageNewTaskButton;  /* Application New Task button */
00039 static int      nApplicationPageWidth;
00040 static int      nApplicationPageHeight;
00041 static BOOL     bSortAscending = TRUE;
00042 DWORD WINAPI    ApplicationPageRefreshThread(void *lpParameter);
00043 BOOL            noApps;
00044 BOOL CALLBACK   EnumWindowsProc(HWND hWnd, LPARAM lParam);
00045 void            AddOrUpdateHwnd(HWND hWnd, WCHAR *szTitle, HICON hIcon, BOOL bHung);
00046 void            ApplicationPageUpdate(void);
00047 void            ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam);
00048 void            ApplicationPageShowContextMenu1(void);
00049 void            ApplicationPageShowContextMenu2(void);
00050 int CALLBACK    ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);
00051 int             ProcGetIndexByProcessId(DWORD dwProcessId);
00052 
00053 #ifdef RUN_APPS_PAGE
00054 static HANDLE   hApplicationThread = NULL;
00055 static DWORD    dwApplicationThread;
00056 #endif
00057 
00058 #if 0
00059 void SwitchToThisWindow (
00060 HWND hWnd,   /* Handle to the window that should be activated */
00061 BOOL bRestore /* Restore the window if it is minimized */
00062 );
00063 #endif
00064 
00065 static INT
00066 GetSystemColorDepth(VOID)
00067 {
00068     DEVMODE pDevMode;
00069     INT ColorDepth;
00070 
00071     pDevMode.dmSize = sizeof(DEVMODE);
00072     pDevMode.dmDriverExtra = 0;
00073 
00074     if (!EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &pDevMode))
00075         return ILC_COLOR;
00076 
00077     switch (pDevMode.dmBitsPerPel)
00078     {
00079         case 32: ColorDepth = ILC_COLOR32; break;
00080         case 24: ColorDepth = ILC_COLOR24; break;
00081         case 16: ColorDepth = ILC_COLOR16; break;
00082         case  8: ColorDepth = ILC_COLOR8;  break;
00083         case  4: ColorDepth = ILC_COLOR4;  break;
00084         default: ColorDepth = ILC_COLOR;   break;
00085     }
00086 
00087     return ColorDepth;
00088 }
00089 
00090 INT_PTR CALLBACK
00091 ApplicationPageWndProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
00092 {
00093     RECT       rc;
00094     int        nXDifference;
00095     int        nYDifference;
00096     LV_COLUMN  column;
00097     WCHAR      szTemp[256];
00098     int        cx, cy;
00099 
00100     switch (message) {
00101     case WM_INITDIALOG:
00102 
00103         /* Save the width and height */
00104         GetClientRect(hDlg, &rc);
00105         nApplicationPageWidth = rc.right;
00106         nApplicationPageHeight = rc.bottom;
00107 
00108         /* Update window position */
00109         SetWindowPos(hDlg, NULL, 15, 30, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
00110 
00111         /* Get handles to the controls */
00112         hApplicationPageListCtrl = GetDlgItem(hDlg, IDC_APPLIST);
00113         hApplicationPageEndTaskButton = GetDlgItem(hDlg, IDC_ENDTASK);
00114         hApplicationPageSwitchToButton = GetDlgItem(hDlg, IDC_SWITCHTO);
00115         hApplicationPageNewTaskButton = GetDlgItem(hDlg, IDC_NEWTASK);
00116 
00117         SetWindowTextW(hApplicationPageListCtrl, L"Tasks");
00118 
00119         /* Initialize the application page's controls */
00120         column.mask = LVCF_TEXT|LVCF_WIDTH;
00121 
00122         LoadStringW(hInst, IDS_TAB_TASK, szTemp, 256);
00123         column.pszText = szTemp;
00124         column.cx = 250;
00125         (void)ListView_InsertColumn(hApplicationPageListCtrl, 0, &column);    /* Add the "Task" column */
00126         column.mask = LVCF_TEXT|LVCF_WIDTH;
00127         LoadStringW(hInst, IDS_TAB_STATUS, szTemp, 256);
00128         column.pszText = szTemp;
00129         column.cx = 95;
00130         (void)ListView_InsertColumn(hApplicationPageListCtrl, 1, &column);    /* Add the "Status" column */
00131 
00132         (void)ListView_SetImageList(hApplicationPageListCtrl, ImageList_Create(16, 16, GetSystemColorDepth()|ILC_MASK, 0, 1), LVSIL_SMALL);
00133         (void)ListView_SetImageList(hApplicationPageListCtrl, ImageList_Create(32, 32, GetSystemColorDepth()|ILC_MASK, 0, 1), LVSIL_NORMAL);
00134 
00135         UpdateApplicationListControlViewSetting();
00136 
00137         /* Start our refresh thread */
00138 #ifdef RUN_APPS_PAGE
00139         hApplicationThread = CreateThread(NULL, 0, ApplicationPageRefreshThread, NULL, 0, &dwApplicationThread);
00140 #endif
00141         return TRUE;
00142 
00143     case WM_DESTROY:
00144         /* Close refresh thread */
00145 #ifdef RUN_APPS_PAGE
00146         EndLocalThread(&hApplicationThread, dwApplicationThread);
00147 #endif
00148         break;
00149 
00150     case WM_COMMAND:
00151 
00152         /* Handle the button clicks */
00153         switch (LOWORD(wParam))
00154         {
00155         case IDC_ENDTASK:
00156             ApplicationPage_OnEndTask();
00157             break;
00158         case IDC_SWITCHTO:
00159             ApplicationPage_OnSwitchTo();
00160             break;
00161         case IDC_NEWTASK:
00162             SendMessageW(hMainWnd, WM_COMMAND, MAKEWPARAM(ID_FILE_NEW, 0), 0);
00163             break;
00164         }
00165 
00166         break;
00167 
00168     case WM_SIZE:
00169         if (wParam == SIZE_MINIMIZED)
00170             return 0;
00171 
00172         cx = LOWORD(lParam);
00173         cy = HIWORD(lParam);
00174         nXDifference = cx - nApplicationPageWidth;
00175         nYDifference = cy - nApplicationPageHeight;
00176         nApplicationPageWidth = cx;
00177         nApplicationPageHeight = cy;
00178 
00179         /* Reposition the application page's controls */
00180         GetWindowRect(hApplicationPageListCtrl, &rc);
00181         cx = (rc.right - rc.left) + nXDifference;
00182         cy = (rc.bottom - rc.top) + nYDifference;
00183         SetWindowPos(hApplicationPageListCtrl, NULL, 0, 0, cx, cy, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOMOVE|SWP_NOZORDER);
00184         InvalidateRect(hApplicationPageListCtrl, NULL, TRUE);
00185 
00186         GetClientRect(hApplicationPageEndTaskButton, &rc);
00187         MapWindowPoints(hApplicationPageEndTaskButton, hDlg, (LPPOINT)(PRECT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
00188         cx = rc.left + nXDifference;
00189         cy = rc.top + nYDifference;
00190         SetWindowPos(hApplicationPageEndTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
00191         InvalidateRect(hApplicationPageEndTaskButton, NULL, TRUE);
00192 
00193         GetClientRect(hApplicationPageSwitchToButton, &rc);
00194         MapWindowPoints(hApplicationPageSwitchToButton, hDlg, (LPPOINT)(PRECT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
00195         cx = rc.left + nXDifference;
00196         cy = rc.top + nYDifference;
00197         SetWindowPos(hApplicationPageSwitchToButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
00198         InvalidateRect(hApplicationPageSwitchToButton, NULL, TRUE);
00199 
00200         GetClientRect(hApplicationPageNewTaskButton, &rc);
00201         MapWindowPoints(hApplicationPageNewTaskButton, hDlg, (LPPOINT)(PRECT)(&rc), (sizeof(RECT)/sizeof(POINT)) );
00202         cx = rc.left + nXDifference;
00203         cy = rc.top + nYDifference;
00204         SetWindowPos(hApplicationPageNewTaskButton, NULL, cx, cy, 0, 0, SWP_NOACTIVATE|SWP_NOOWNERZORDER|SWP_NOSIZE|SWP_NOZORDER);
00205         InvalidateRect(hApplicationPageNewTaskButton, NULL, TRUE);
00206 
00207         break;
00208 
00209     case WM_NOTIFY:
00210         ApplicationPageOnNotify(wParam, lParam);
00211         break;
00212 
00213     case WM_KEYDOWN:
00214         if (wParam == VK_DELETE)
00215             ProcessPage_OnEndProcess();
00216         break;
00217 
00218     }
00219 
00220   return 0;
00221 }
00222 
00223 void RefreshApplicationPage(void)
00224 {
00225 #ifdef RUN_APPS_PAGE
00226     /* Signal the event so that our refresh thread */
00227     /* will wake up and refresh the application page */
00228     PostThreadMessage(dwApplicationThread, WM_TIMER, 0, 0);
00229 #endif
00230 }
00231 
00232 void UpdateApplicationListControlViewSetting(void)
00233 {
00234     DWORD  dwStyle = GetWindowLongPtrW(hApplicationPageListCtrl, GWL_STYLE);
00235 
00236     dwStyle &= ~(LVS_REPORT | LVS_ICON | LVS_LIST | LVS_SMALLICON);
00237 
00238     switch (TaskManagerSettings.ViewMode) {
00239     case ID_VIEW_LARGE:   dwStyle |= LVS_ICON; break;
00240     case ID_VIEW_SMALL:   dwStyle |= LVS_SMALLICON; break;
00241     case ID_VIEW_DETAILS: dwStyle |= LVS_REPORT; break;
00242     }
00243     SetWindowLongPtrW(hApplicationPageListCtrl, GWL_STYLE, dwStyle);
00244 
00245     RefreshApplicationPage();
00246 }
00247 
00248 DWORD WINAPI ApplicationPageRefreshThread(void *lpParameter)
00249 {
00250     MSG msg;
00251     INT i;
00252     BOOL                            bItemRemoved = FALSE;
00253     LV_ITEM                         item;
00254     LPAPPLICATION_PAGE_LIST_ITEM    pAPLI = NULL;
00255     HIMAGELIST                      hImageListLarge;
00256     HIMAGELIST                      hImageListSmall;
00257 
00258     /* If we couldn't create the event then exit the thread */
00259     while (1)
00260     {
00261         /*  Wait for an the event or application close */
00262         if (GetMessage(&msg, NULL, 0, 0) <= 0)
00263             return 0;
00264 
00265         if (msg.message == WM_TIMER)
00266         {
00267             /*
00268              * FIXME:
00269              *
00270              * Should this be EnumDesktopWindows() instead?
00271              */
00272             noApps = TRUE;
00273             EnumWindows(EnumWindowsProc, 0);
00274             if (noApps)
00275                 (void)ListView_DeleteAllItems(hApplicationPageListCtrl);
00276 
00277             /* Get the image lists */
00278             hImageListLarge = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_NORMAL);
00279             hImageListSmall = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_SMALL);
00280 
00281             /* Check to see if we need to remove any items from the list */
00282             for (i=ListView_GetItemCount(hApplicationPageListCtrl)-1; i>=0; i--)
00283             {
00284                 memset(&item, 0, sizeof(LV_ITEM));
00285                 item.mask = LVIF_IMAGE|LVIF_PARAM;
00286                 item.iItem = i;
00287                 (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00288 
00289                 pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00290                 if (!IsWindow(pAPLI->hWnd)||
00291                     (wcslen(pAPLI->szTitle) <= 0) ||
00292                     !IsWindowVisible(pAPLI->hWnd) ||
00293                     (GetParent(pAPLI->hWnd) != NULL) ||
00294                     (GetWindow(pAPLI->hWnd, GW_OWNER) != NULL) ||
00295                     (GetWindowLongPtr(pAPLI->hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
00296                 {
00297                     ImageList_Remove(hImageListLarge, item.iItem);
00298                     ImageList_Remove(hImageListSmall, item.iItem);
00299 
00300                     (void)ListView_DeleteItem(hApplicationPageListCtrl, item.iItem);
00301                     HeapFree(GetProcessHeap(), 0, pAPLI);
00302                     bItemRemoved = TRUE;
00303                 }
00304             }
00305 
00306             /*
00307              * If an item was removed from the list then
00308              * we need to resync all the items with the
00309              * image list
00310              */
00311             if (bItemRemoved)
00312             {
00313                 for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++)
00314                 {
00315                     memset(&item, 0, sizeof(LV_ITEM));
00316                     item.mask = LVIF_IMAGE;
00317                     item.iItem = i;
00318                     item.iImage = i;
00319                     (void)ListView_SetItem(hApplicationPageListCtrl, &item);
00320                 }
00321                 bItemRemoved = FALSE;
00322             }
00323 
00324             ApplicationPageUpdate();
00325         }
00326     }
00327 }
00328 
00329 BOOL CALLBACK EnumWindowsProc(HWND hWnd, LPARAM lParam)
00330 {
00331     HICON   hIcon;
00332     WCHAR   szText[260];
00333     BOOL    bLargeIcon;
00334     BOOL    bHung = FALSE;
00335     HICON*  xhIcon = (HICON*)&hIcon;
00336 
00337     typedef int (FAR __stdcall *IsHungAppWindowProc)(HWND);
00338     IsHungAppWindowProc IsHungAppWindow;
00339 
00340 
00341     /* Skip our window */
00342     if (hWnd == hMainWnd)
00343         return TRUE;
00344 
00345     bLargeIcon = (TaskManagerSettings.ViewMode == ID_VIEW_LARGE);
00346 
00347     GetWindowTextW(hWnd, szText, 260); /* Get the window text */
00348 
00349     /* Check and see if this is a top-level app window */
00350     if ((wcslen(szText) <= 0) ||
00351         !IsWindowVisible(hWnd) ||
00352         (GetParent(hWnd) != NULL) ||
00353         (GetWindow(hWnd, GW_OWNER) != NULL) ||
00354         (GetWindowLongPtrW(hWnd, GWL_EXSTYLE) & WS_EX_TOOLWINDOW))
00355     {
00356         return TRUE; /* Skip this window */
00357     }
00358 
00359     noApps = FALSE;
00360     /* Get the icon for this window */
00361     hIcon = NULL;
00362     SendMessageTimeoutW(hWnd, WM_GETICON,bLargeIcon ? ICON_BIG /*1*/ : ICON_SMALL /*0*/, 0, 0, 1000, (PDWORD_PTR)xhIcon);
00363 
00364     if (!hIcon)
00365     {
00366         hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICON : GCL_HICONSM);
00367         if (!hIcon) hIcon = (HICON)(LONG_PTR)GetClassLongPtrW(hWnd, bLargeIcon ? GCL_HICONSM : GCL_HICON);
00368         if (!hIcon) SendMessageTimeoutW(hWnd, WM_QUERYDRAGICON, 0, 0, 0, 1000, (PDWORD_PTR)xhIcon);
00369         if (!hIcon) SendMessageTimeoutW(hWnd, WM_GETICON, bLargeIcon ? ICON_SMALL /*0*/ : ICON_BIG /*1*/, 0, 0, 1000, (PDWORD_PTR)xhIcon);
00370     }
00371 
00372     if (!hIcon)
00373         hIcon = LoadIconW(hInst, bLargeIcon ? MAKEINTRESOURCEW(IDI_WINDOW) : MAKEINTRESOURCEW(IDI_WINDOWSM));
00374 
00375     bHung = FALSE;
00376 
00377     IsHungAppWindow = (IsHungAppWindowProc)(FARPROC)GetProcAddress(GetModuleHandleW(L"USER32.DLL"), "IsHungAppWindow");
00378 
00379     if (IsHungAppWindow)
00380         bHung = IsHungAppWindow(hWnd);
00381 
00382     AddOrUpdateHwnd(hWnd, szText, hIcon, bHung);
00383 
00384     return TRUE;
00385 }
00386 
00387 void AddOrUpdateHwnd(HWND hWnd, WCHAR *szTitle, HICON hIcon, BOOL bHung)
00388 {
00389     LPAPPLICATION_PAGE_LIST_ITEM    pAPLI = NULL;
00390     HIMAGELIST                      hImageListLarge;
00391     HIMAGELIST                      hImageListSmall;
00392     LV_ITEM                         item;
00393     int                             i;
00394     BOOL                            bAlreadyInList = FALSE;
00395 
00396     memset(&item, 0, sizeof(LV_ITEM));
00397 
00398     /* Get the image lists */
00399     hImageListLarge = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_NORMAL);
00400     hImageListSmall = ListView_GetImageList(hApplicationPageListCtrl, LVSIL_SMALL);
00401 
00402     /* Check to see if it's already in our list */
00403     for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++)
00404     {
00405         memset(&item, 0, sizeof(LV_ITEM));
00406         item.mask = LVIF_IMAGE|LVIF_PARAM;
00407         item.iItem = i;
00408         (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00409 
00410         pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00411         if (pAPLI->hWnd == hWnd)
00412         {
00413             bAlreadyInList = TRUE;
00414             break;
00415         }
00416     }
00417 
00418     /* If it is already in the list then update it if necessary */
00419     if (bAlreadyInList)
00420     {
00421         /* Check to see if anything needs updating */
00422         if ((pAPLI->hIcon != hIcon) ||
00423             (_wcsicmp(pAPLI->szTitle, szTitle) != 0) ||
00424             (pAPLI->bHung != bHung))
00425         {
00426             /* Update the structure */
00427             pAPLI->hIcon = hIcon;
00428             pAPLI->bHung = bHung;
00429             wcscpy(pAPLI->szTitle, szTitle);
00430 
00431             /* Update the image list */
00432             ImageList_ReplaceIcon(hImageListLarge, item.iItem, hIcon);
00433             ImageList_ReplaceIcon(hImageListSmall, item.iItem, hIcon);
00434 
00435             /* Update the list view */
00436             (void)ListView_RedrawItems(hApplicationPageListCtrl, 0, ListView_GetItemCount(hApplicationPageListCtrl));
00437             /* UpdateWindow(hApplicationPageListCtrl); */
00438             InvalidateRect(hApplicationPageListCtrl, NULL, 0);
00439         }
00440     }
00441     /* It is not already in the list so add it */
00442     else
00443     {
00444         pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)HeapAlloc(GetProcessHeap(), 0, sizeof(APPLICATION_PAGE_LIST_ITEM));
00445 
00446         pAPLI->hWnd = hWnd;
00447         pAPLI->hIcon = hIcon;
00448         pAPLI->bHung = bHung;
00449         wcscpy(pAPLI->szTitle, szTitle);
00450 
00451         /* Add the item to the list */
00452         memset(&item, 0, sizeof(LV_ITEM));
00453         item.mask = LVIF_TEXT|LVIF_IMAGE|LVIF_PARAM;
00454         ImageList_AddIcon(hImageListLarge, hIcon);
00455         item.iImage = ImageList_AddIcon(hImageListSmall, hIcon);
00456         item.pszText = LPSTR_TEXTCALLBACK;
00457         item.iItem = ListView_GetItemCount(hApplicationPageListCtrl);
00458         item.lParam = (LPARAM)pAPLI;
00459         (void)ListView_InsertItem(hApplicationPageListCtrl, &item);
00460     }
00461     return;
00462 }
00463 
00464 void ApplicationPageUpdate(void)
00465 {
00466     /* Enable or disable the "End Task" & "Switch To" buttons */
00467     if (ListView_GetSelectedCount(hApplicationPageListCtrl))
00468     {
00469         EnableWindow(hApplicationPageEndTaskButton, TRUE);
00470     }
00471     else
00472     {
00473         EnableWindow(hApplicationPageEndTaskButton, FALSE);
00474     }
00475     /* Enable "Switch To" button only if one app is selected */
00476     if (ListView_GetSelectedCount(hApplicationPageListCtrl) == 1 )
00477     {
00478         EnableWindow(hApplicationPageSwitchToButton, TRUE);
00479     }
00480     else
00481     {
00482     EnableWindow(hApplicationPageSwitchToButton, FALSE);
00483     }
00484 
00485     /* If we are on the applications tab the windows menu will be */
00486     /* present on the menu bar so enable & disable the menu items */
00487     if (TabCtrl_GetCurSel(hTabWnd) == 0)
00488     {
00489         HMENU  hMenu;
00490         HMENU  hWindowsMenu;
00491 
00492         hMenu = GetMenu(hMainWnd);
00493         hWindowsMenu = GetSubMenu(hMenu, 3);
00494 
00495         /* Only one item selected */
00496         if (ListView_GetSelectedCount(hApplicationPageListCtrl) == 1)
00497         {
00498             EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00499             EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00500             EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
00501             EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
00502             EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00503             EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_ENABLED);
00504         }
00505         /* More than one item selected */
00506         else if (ListView_GetSelectedCount(hApplicationPageListCtrl) > 1)
00507         {
00508             EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_ENABLED);
00509             EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_ENABLED);
00510             EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
00511             EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
00512             EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_ENABLED);
00513             EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00514         }
00515         /* No items selected */
00516         else
00517         {
00518             EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00519             EnableMenuItem(hWindowsMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00520             EnableMenuItem(hWindowsMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00521             EnableMenuItem(hWindowsMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00522             EnableMenuItem(hWindowsMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00523             EnableMenuItem(hWindowsMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00524         }
00525     }
00526 }
00527 
00528 void ApplicationPageOnNotify(WPARAM wParam, LPARAM lParam)
00529 {
00530     LPNMHDR                       pnmh;
00531     LV_DISPINFO*                  pnmdi;
00532     LPAPPLICATION_PAGE_LIST_ITEM  pAPLI;
00533     WCHAR                         szMsg[256];
00534 
00535     pnmh = (LPNMHDR) lParam;
00536     pnmdi = (LV_DISPINFO*) lParam;
00537 
00538     if (pnmh->hwndFrom == hApplicationPageListCtrl) {
00539         switch (pnmh->code) {
00540         case LVN_ITEMCHANGED:
00541             ApplicationPageUpdate();
00542             break;
00543 
00544         case LVN_GETDISPINFO:
00545             pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)pnmdi->item.lParam;
00546 
00547             /* Update the item text */
00548             if (pnmdi->item.iSubItem == 0)
00549             {
00550                 wcsncpy(pnmdi->item.pszText, pAPLI->szTitle, pnmdi->item.cchTextMax);
00551             }
00552 
00553             /* Update the item status */
00554             else if (pnmdi->item.iSubItem == 1)
00555             {
00556                 if (pAPLI->bHung)
00557                 {
00558                     LoadStringW( GetModuleHandleW(NULL), IDS_Not_Responding , szMsg, sizeof(szMsg) / sizeof(szMsg[0]));
00559                 }
00560                 else
00561                 {
00562                     LoadStringW( GetModuleHandleW(NULL), IDS_Running, (LPWSTR) szMsg, sizeof(szMsg) / sizeof(szMsg[0]));
00563                 }
00564                 wcsncpy(pnmdi->item.pszText, szMsg, pnmdi->item.cchTextMax);
00565             }
00566 
00567             break;
00568 
00569         case NM_RCLICK:
00570 
00571             if (ListView_GetSelectedCount(hApplicationPageListCtrl) < 1)
00572             {
00573                 ApplicationPageShowContextMenu1();
00574             }
00575             else
00576             {
00577                 ApplicationPageShowContextMenu2();
00578             }
00579 
00580             break;
00581 
00582         case NM_DBLCLK:
00583 
00584             ApplicationPage_OnSwitchTo();
00585 
00586             break;
00587 
00588         case LVN_KEYDOWN:
00589 
00590             if (((LPNMLVKEYDOWN)lParam)->wVKey == VK_DELETE)
00591                 ApplicationPage_OnEndTask();
00592 
00593             break;
00594 
00595         }
00596     }
00597     else if (pnmh->hwndFrom == ListView_GetHeader(hApplicationPageListCtrl))
00598     {
00599         switch (pnmh->code)
00600         {
00601         case NM_RCLICK:
00602 
00603             if (ListView_GetSelectedCount(hApplicationPageListCtrl) < 1)
00604             {
00605                 ApplicationPageShowContextMenu1();
00606             }
00607             else
00608             {
00609                 ApplicationPageShowContextMenu2();
00610             }
00611 
00612             break;
00613 
00614         case HDN_ITEMCLICK:
00615 
00616             (void)ListView_SortItems(hApplicationPageListCtrl, ApplicationPageCompareFunc, 0);
00617             bSortAscending = !bSortAscending;
00618 
00619             break;
00620         }
00621     }
00622 
00623 }
00624 
00625 void ApplicationPageShowContextMenu1(void)
00626 {
00627     HMENU  hMenu;
00628     HMENU  hSubMenu;
00629     POINT  pt;
00630 
00631     GetCursorPos(&pt);
00632 
00633     hMenu = LoadMenuW(hInst, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT1));
00634     hSubMenu = GetSubMenu(hMenu, 0);
00635 
00636     CheckMenuRadioItem(hSubMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, TaskManagerSettings.ViewMode, MF_BYCOMMAND);
00637 
00638     TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL);
00639 
00640     DestroyMenu(hMenu);
00641 }
00642 
00643 void ApplicationPageShowContextMenu2(void)
00644 {
00645     HMENU  hMenu;
00646     HMENU  hSubMenu;
00647     POINT  pt;
00648 
00649     GetCursorPos(&pt);
00650 
00651     hMenu = LoadMenuW(hInst, MAKEINTRESOURCEW(IDR_APPLICATION_PAGE_CONTEXT2));
00652     hSubMenu = GetSubMenu(hMenu, 0);
00653 
00654     if (ListView_GetSelectedCount(hApplicationPageListCtrl) == 1)
00655     {
00656         EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00657         EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00658         EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
00659         EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
00660         EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00661         EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_ENABLED);
00662     }
00663     else if (ListView_GetSelectedCount(hApplicationPageListCtrl) > 1)
00664     {
00665         EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_ENABLED);
00666         EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_ENABLED);
00667         EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_ENABLED);
00668         EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_ENABLED);
00669         EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_ENABLED);
00670         EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00671     }
00672     else
00673     {
00674         EnableMenuItem(hSubMenu, ID_WINDOWS_TILEHORIZONTALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00675         EnableMenuItem(hSubMenu, ID_WINDOWS_TILEVERTICALLY, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00676         EnableMenuItem(hSubMenu, ID_WINDOWS_MINIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00677         EnableMenuItem(hSubMenu, ID_WINDOWS_MAXIMIZE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00678         EnableMenuItem(hSubMenu, ID_WINDOWS_CASCADE, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00679         EnableMenuItem(hSubMenu, ID_WINDOWS_BRINGTOFRONT, MF_BYCOMMAND|MF_DISABLED|MF_GRAYED);
00680     }
00681 
00682     SetMenuDefaultItem(hSubMenu, ID_APPLICATION_PAGE_SWITCHTO, MF_BYCOMMAND);
00683 
00684     TrackPopupMenu(hSubMenu, TPM_LEFTALIGN|TPM_TOPALIGN|TPM_LEFTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL);
00685 
00686     DestroyMenu(hMenu);
00687 }
00688 
00689 void ApplicationPage_OnView(DWORD dwMode)
00690 {
00691     HMENU  hMenu;
00692     HMENU  hViewMenu;
00693 
00694     hMenu = GetMenu(hMainWnd);
00695     hViewMenu = GetSubMenu(hMenu, 2);
00696 
00697     TaskManagerSettings.ViewMode = dwMode;
00698     CheckMenuRadioItem(hViewMenu, ID_VIEW_LARGE, ID_VIEW_DETAILS, dwMode, MF_BYCOMMAND);
00699 
00700     UpdateApplicationListControlViewSetting();
00701 }
00702 
00703 void ApplicationPage_OnWindowsTile(DWORD dwMode)
00704 {
00705     LPAPPLICATION_PAGE_LIST_ITEM  pAPLI = NULL;
00706     LV_ITEM                       item;
00707     int                           i;
00708     HWND*                         hWndArray;
00709     int                           nWndCount;
00710 
00711     hWndArray = (HWND*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND) * ListView_GetItemCount(hApplicationPageListCtrl));
00712     nWndCount = 0;
00713 
00714     for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
00715         memset(&item, 0, sizeof(LV_ITEM));
00716         item.mask = LVIF_STATE|LVIF_PARAM;
00717         item.iItem = i;
00718         item.stateMask = (UINT)-1;
00719         (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00720 
00721         if (item.state & LVIS_SELECTED) {
00722             pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00723             if (pAPLI) {
00724                 hWndArray[nWndCount] = pAPLI->hWnd;
00725                 nWndCount++;
00726             }
00727         }
00728     }
00729 
00730     TileWindows(NULL, dwMode, NULL, nWndCount, hWndArray);
00731     HeapFree(GetProcessHeap(), 0, hWndArray);
00732 }
00733 
00734 void ApplicationPage_OnWindowsMinimize(void)
00735 {
00736     LPAPPLICATION_PAGE_LIST_ITEM  pAPLI = NULL;
00737     LV_ITEM                       item;
00738     int                           i;
00739 
00740     for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
00741         memset(&item, 0, sizeof(LV_ITEM));
00742         item.mask = LVIF_STATE|LVIF_PARAM;
00743         item.iItem = i;
00744         item.stateMask = (UINT)-1;
00745         (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00746         if (item.state & LVIS_SELECTED) {
00747             pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00748             if (pAPLI) {
00749                 ShowWindow(pAPLI->hWnd, SW_MINIMIZE);
00750             }
00751         }
00752     }
00753 }
00754 
00755 void ApplicationPage_OnWindowsMaximize(void)
00756 {
00757     LPAPPLICATION_PAGE_LIST_ITEM  pAPLI = NULL;
00758     LV_ITEM                       item;
00759     int                           i;
00760 
00761     for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
00762         memset(&item, 0, sizeof(LV_ITEM));
00763         item.mask = LVIF_STATE|LVIF_PARAM;
00764         item.iItem = i;
00765         item.stateMask = (UINT)-1;
00766         (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00767         if (item.state & LVIS_SELECTED) {
00768             pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00769             if (pAPLI) {
00770                 ShowWindow(pAPLI->hWnd, SW_MAXIMIZE);
00771             }
00772         }
00773     }
00774 }
00775 
00776 void ApplicationPage_OnWindowsCascade(void)
00777 {
00778     LPAPPLICATION_PAGE_LIST_ITEM  pAPLI = NULL;
00779     LV_ITEM                       item;
00780     int                           i;
00781     HWND*                         hWndArray;
00782     int                           nWndCount;
00783 
00784     hWndArray = (HWND*)HeapAlloc(GetProcessHeap(), 0, sizeof(HWND) * ListView_GetItemCount(hApplicationPageListCtrl));
00785     nWndCount = 0;
00786 
00787     for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
00788         memset(&item, 0, sizeof(LV_ITEM));
00789         item.mask = LVIF_STATE|LVIF_PARAM;
00790         item.iItem = i;
00791         item.stateMask = (UINT)-1;
00792         (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00793         if (item.state & LVIS_SELECTED) {
00794             pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00795             if (pAPLI) {
00796                 hWndArray[nWndCount] = pAPLI->hWnd;
00797                 nWndCount++;
00798             }
00799         }
00800     }
00801     CascadeWindows(NULL, 0, NULL, nWndCount, hWndArray);
00802     HeapFree(GetProcessHeap(), 0, hWndArray);
00803 }
00804 
00805 void ApplicationPage_OnWindowsBringToFront(void)
00806 {
00807     LPAPPLICATION_PAGE_LIST_ITEM  pAPLI = NULL;
00808     LV_ITEM                       item;
00809     int                           i;
00810 
00811     for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
00812         memset(&item, 0, sizeof(LV_ITEM));
00813         item.mask = LVIF_STATE|LVIF_PARAM;
00814         item.iItem = i;
00815         item.stateMask = (UINT)-1;
00816         (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00817         if (item.state & LVIS_SELECTED) {
00818             pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00819             break;
00820         }
00821     }
00822     if (pAPLI) {
00823         if (IsIconic(pAPLI->hWnd))
00824             ShowWindow(pAPLI->hWnd, SW_RESTORE);
00825         BringWindowToTop(pAPLI->hWnd);
00826     }
00827 }
00828 
00829 void ApplicationPage_OnSwitchTo(void)
00830 {
00831     LPAPPLICATION_PAGE_LIST_ITEM  pAPLI = NULL;
00832     LV_ITEM                       item;
00833     int                           i;
00834 
00835     for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
00836         memset(&item, 0, sizeof(LV_ITEM));
00837         item.mask = LVIF_STATE|LVIF_PARAM;
00838         item.iItem = i;
00839         item.stateMask = (UINT)-1;
00840         (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00841 
00842         if (item.state & LVIS_SELECTED) {
00843             pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00844             break;
00845         }
00846     }
00847     if (pAPLI) {
00848         typedef void (WINAPI *PROCSWITCHTOTHISWINDOW) (HWND, BOOL);
00849         PROCSWITCHTOTHISWINDOW SwitchToThisWindow;
00850 
00851         HMODULE hUser32 = GetModuleHandleW(L"USER32");
00852         SwitchToThisWindow = (PROCSWITCHTOTHISWINDOW)GetProcAddress(hUser32, "SwitchToThisWindow");
00853         if (SwitchToThisWindow) {
00854             SwitchToThisWindow(pAPLI->hWnd, TRUE);
00855         } else {
00856             if (IsIconic(pAPLI->hWnd))
00857                 ShowWindow(pAPLI->hWnd, SW_RESTORE);
00858             BringWindowToTop(pAPLI->hWnd);
00859             SetForegroundWindow(pAPLI->hWnd);
00860         }
00861         if (TaskManagerSettings.MinimizeOnUse)
00862             ShowWindow(hMainWnd, SW_MINIMIZE);
00863     }
00864 }
00865 
00866 void ApplicationPage_OnEndTask(void)
00867 {
00868     LPAPPLICATION_PAGE_LIST_ITEM  pAPLI = NULL;
00869     LV_ITEM                       item;
00870     int                           i;
00871 
00872     for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
00873         memset(&item, 0, sizeof(LV_ITEM));
00874         item.mask = LVIF_STATE|LVIF_PARAM;
00875         item.iItem = i;
00876         item.stateMask = (UINT)-1;
00877         (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00878         if (item.state & LVIS_SELECTED) {
00879             pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00880             if (pAPLI) {
00881                 PostMessageW(pAPLI->hWnd, WM_CLOSE, 0, 0);
00882             }
00883         }
00884     }
00885 }
00886 
00887 void ApplicationPage_OnGotoProcess(void)
00888 {
00889     LPAPPLICATION_PAGE_LIST_ITEM  pAPLI = NULL;
00890     LV_ITEM                       item;
00891     int                           i;
00892 
00893     for (i=0; i<ListView_GetItemCount(hApplicationPageListCtrl); i++) {
00894         memset(&item, 0, sizeof(LV_ITEM));
00895         item.mask = LVIF_STATE|LVIF_PARAM;
00896         item.iItem = i;
00897         item.stateMask = (UINT)-1;
00898         (void)ListView_GetItem(hApplicationPageListCtrl, &item);
00899         if (item.state & LVIS_SELECTED) {
00900             pAPLI = (LPAPPLICATION_PAGE_LIST_ITEM)item.lParam;
00901             break;
00902         }
00903     }
00904     if (pAPLI) {
00905         DWORD   dwProcessId;
00906 
00907         GetWindowThreadProcessId(pAPLI->hWnd, &dwProcessId);
00908         /*
00909          * Switch to the process tab
00910          */
00911         TabCtrl_SetCurFocus(hTabWnd, 1);
00912         /*
00913          * Select the process item in the list
00914          */
00915         i = ProcGetIndexByProcessId(dwProcessId);
00916         if (i != -1)
00917         {
00918             ListView_SetItemState(hProcessPageListCtrl,
00919                                   i,
00920                                   LVIS_SELECTED | LVIS_FOCUSED,
00921                                   LVIS_SELECTED | LVIS_FOCUSED);
00922             (void)ListView_EnsureVisible(hProcessPageListCtrl,
00923                                          i,
00924                                          FALSE);
00925         }
00926     }
00927 }
00928 
00929 int CALLBACK ApplicationPageCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
00930 {
00931     LPAPPLICATION_PAGE_LIST_ITEM  Param1;
00932     LPAPPLICATION_PAGE_LIST_ITEM  Param2;
00933 
00934     if (bSortAscending) {
00935         Param1 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam1;
00936         Param2 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam2;
00937     } else {
00938         Param1 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam2;
00939         Param2 = (LPAPPLICATION_PAGE_LIST_ITEM)lParam1;
00940     }
00941     return wcscmp(Param1->szTitle, Param2->szTitle);
00942 }

Generated on Fri May 25 2012 04:15:51 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.