Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenapplpage.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
1.7.6.1
|