- popup menu on right click - fix some bugs when reading from reg - query the active list to get num items Modified: trunk/reactos/subsys/system/servman/En.rc Modified: trunk/reactos/subsys/system/servman/geterror.c Modified: trunk/reactos/subsys/system/servman/query.c Modified: trunk/reactos/subsys/system/servman/resource.h Modified: trunk/reactos/subsys/system/servman/servman.c Modified: trunk/reactos/subsys/system/servman/servman.h _____
Modified: trunk/reactos/subsys/system/servman/En.rc --- trunk/reactos/subsys/system/servman/En.rc 2006-01-10 22:36:52 UTC (rev 20772) +++ trunk/reactos/subsys/system/servman/En.rc 2006-01-10 22:39:49 UTC (rev 20773) @@ -23,10 +23,40 @@
END POPUP "Help" BEGIN - MENUITEM "About",ID_HELP_ABOUT + MENUITEM "About",ID_ABOUT END END
+ +IDR_POPUP MENU +BEGIN + POPUP "popup" + BEGIN + MENUITEM "Start",ID_START + MENUITEM "Stop",ID_STOP + MENUITEM "Pause",ID_PAUSE + MENUITEM "Resume",ID_RESUME + MENUITEM "Restart",ID_RESTART + MENUITEM SEPARATOR + POPUP "All tasks" + BEGIN + MENUITEM "Start",ID_START + MENUITEM "Stop",ID_STOP + MENUITEM "Pause",ID_PAUSE + MENUITEM "Resume",ID_RESUME + MENUITEM "Restart",ID_RESTART + MENUITEM "Refresh",ID_REFRESH + END + MENUITEM SEPARATOR + MENUITEM "Refresh",ID_REFRESH + MENUITEM SEPARATOR + MENUITEM "Properties",ID_PROP, "Default" + MENUITEM SEPARATOR + MENUITEM "About",ID_HELP + END +END + + IDD_ABOUTBOX DIALOG DISCARDABLE 22,16,190,182 STYLE DS_MODALFRAME | WS_CAPTION | WS_SYSMENU CAPTION "About Service Manager" @@ -34,7 +64,7 @@ BEGIN CONTROL "Service Manager v0.1\nCopyright (C) 2006\nby Ged Murphy (gedmurphy@gmail.com)", IDC_STATIC,"Static",SS_LEFTNOWORDWRAP | WS_GROUP,48,7,130,26 - DEFPUSHBUTTON "Close",IDOK,140,162,44,15,WS_GROUP + DEFPUSHBUTTON "Close",IDOK,75,162,44,15,WS_GROUP ICON IDI_SM_ICON,IDC_STATIC,12,7,30,20 EDITTEXT IDC_LICENSE_EDIT,8,44,174,107,ES_MULTILINE | ES_READONLY | WS_VSCROLL @@ -80,19 +110,16 @@
STRINGTABLE DISCARDABLE BEGIN - IDS_SERVICES_STATUS_RUNNING "Started" - IDS_SERVICES_STATUS_STOPPED "Stopped" - IDS_SERVICES_YES "Yes" - IDS_SERVICES_UNKNOWN "Unknown" - IDS_SERVICES_AUTO "Automatic" - IDS_SERVICES_MAN "Manual" - IDS_SERVICES_DIS "Disabled" + IDS_SERVICES_STARTED "Started" + IDS_SERVICES_AUTO "Automatic" + IDS_SERVICES_MAN "Manual" + IDS_SERVICES_DIS "Disabled" END
STRINGTABLE DISCARDABLE BEGIN - IDS_SERVICES_NUM_SERVICES "Num Services: %d" - + IDS_NUM_SERVICES "Num Services: %d" + IDS_LICENSE "This program 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.\r\n\r\nThis program 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 General Public License for more details.\r\n\r\nYou should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA." /*"This program is free software; you can redistribute it " "and/or modify it under the terms of the GNU Lesser General " @@ -106,7 +133,7 @@ "General Public License along with this program; if not, write " "to the Free Software Foundation, Inc., 59 Temple Place - Suite " "330, Boston, MA 02111-1307, USA." */ - + END
STRINGTABLE DISCARDABLE _____
Modified: trunk/reactos/subsys/system/servman/geterror.c --- trunk/reactos/subsys/system/servman/geterror.c 2006-01-10 22:36:52 UTC (rev 20772) +++ trunk/reactos/subsys/system/servman/geterror.c 2006-01-10 22:39:49 UTC (rev 20773) @@ -2,15 +2,18 @@
#include "servman.h" /* temp file for debugging */
-VOID GetError(VOID) +VOID GetError(DWORD err) { LPVOID lpMsgBuf;
+ if (err == 0) + err = GetLastError(); + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, - GetLastError(), + err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), /* Default language */ (LPTSTR) &lpMsgBuf, 0, _____
Modified: trunk/reactos/subsys/system/servman/query.c --- trunk/reactos/subsys/system/servman/query.c 2006-01-10 22:36:52 UTC (rev 20772) +++ trunk/reactos/subsys/system/servman/query.c 2006-01-10 22:39:49 UTC (rev 20773) @@ -4,7 +4,7 @@
* FILE: subsys/system/servman/query.c * PURPOSE: Query service information * COPYRIGHT: Copyright 2005 Ged Murphy gedmurphy@gmail.com - * + * */
#include "servman.h" @@ -23,7 +23,30 @@ HeapFree(GetProcessHeap(), 0, pServiceStatus); }
+VOID GetData(VOID) +{ + LVITEM item; + UINT sel; + TCHAR buf[200];
+ sel = ListView_GetHotItem(hListView); + + ZeroMemory(&item, sizeof(LV_ITEM)); + + item.mask = LVIF_TEXT; + item.iItem = sel; + item.iSubItem = 0; + item.pszText = buf; + item.cchTextMax = 200; + + ListView_GetItem(hListView, &item); + + + //DisplayString(sel); + DisplayString(item.pszText); +} + + BOOL RefreshServiceList(VOID) { @@ -40,9 +63,10 @@
if (NumServices) { - HICON hiconItem; /* icon for list-view items */ - HIMAGELIST hSmall; /* image list for other views */ - TCHAR buf[300]; + HICON hiconItem; /* icon for list-view items */ + HIMAGELIST hSmall; /* image list for other views */ + TCHAR buf[300]; /* buffer to hold key path */ + INT NumListedServ = 0; /* how many services were listed */
/* Create the icon image lists */ hSmall = ImageList_Create(GetSystemMetrics(SM_CXSMICON), @@ -52,14 +76,10 @@ hiconItem = LoadImage(hInstance, MAKEINTRESOURCE(IDI_SM_ICON), IMAGE_ICON, 16, 16, 0); ImageList_AddIcon(hSmall, hiconItem);
+ /* assign the image to the list view */ ListView_SetImageList(hListView, hSmall, LVSIL_SMALL);
- /* set the number of services in the status bar */ - LoadString(hInstance, IDS_SERVICES_NUM_SERVICES, szNumServices, 32); - _sntprintf(buf, 300, szNumServices, NumServices); - SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)buf);
- for (Index = 0; Index < NumServices; Index++) { HKEY hKey = NULL; @@ -73,15 +93,11 @@ _sntprintf(buf, 300, Path, pServiceStatus[Index].lpServiceName);
- if( RegOpenKeyEx(HKEY_LOCAL_MACHINE, - buf, - 0, - KEY_READ, - &hKey) != ERROR_SUCCESS) - { - GetError(); - return FALSE; - } + RegOpenKeyEx(HKEY_LOCAL_MACHINE, + buf, + 0, + KEY_READ, + &hKey);
/* set the display name */ @@ -92,8 +108,8 @@ item.iItem = ListView_GetItemCount(hListView); item.iItem = ListView_InsertItem(hListView, &item);
-
+ /* set the description */ dwValueSize = 0; ret = RegQueryValueEx(hKey, @@ -102,12 +118,12 @@ NULL, NULL, &dwValueSize); - if (ret != ERROR_SUCCESS && ret != ERROR_FILE_NOT_FOUND) + if (ret != ERROR_SUCCESS && ret != ERROR_FILE_NOT_FOUND && ret != ERROR_INVALID_HANDLE) { RegCloseKey(hKey); - return FALSE; + continue; } - + if (ret != ERROR_FILE_NOT_FOUND) { Description = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwValueSize); @@ -125,7 +141,7 @@ { HeapFree(GetProcessHeap(), 0, Description); RegCloseKey(hKey); - return FALSE; + continue; }
item.pszText = Description; @@ -134,30 +150,21 @@
HeapFree(GetProcessHeap(), 0, Description); } - else - { - item.pszText = '\0'; - item.iSubItem = 1; - SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item); - }
+ /* set the status */
if (pServiceStatus[Index].ServiceStatusProcess.dwCurrentState == SERVICE_RUNNING) { - LoadString(hInstance, IDS_SERVICES_STATUS_RUNNING, szStatus, 128); + LoadString(hInstance, IDS_SERVICES_STARTED, szStatus, 128); item.pszText = szStatus; item.iSubItem = 2; SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item); } - else - { - item.pszText = '\0'; - item.iSubItem = 2; - SendMessage(hListView, LVM_SETITEMTEXT, item.iItem, (LPARAM) &item); - }
+ + /* set the startup type */
dwValueSize = sizeof(DWORD); @@ -169,7 +176,7 @@ &dwValueSize)) { RegCloseKey(hKey); - return FALSE; + continue; }
if (StartUp == 0x02) @@ -207,9 +214,9 @@ &dwValueSize)) { RegCloseKey(hKey); - return FALSE; + continue; } - + LogOnAs = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwValueSize); if (LogOnAs == NULL) { @@ -225,7 +232,7 @@ { HeapFree(GetProcessHeap(), 0, LogOnAs); RegCloseKey(hKey); - return FALSE; + continue; }
item.pszText = LogOnAs; @@ -237,8 +244,15 @@ RegCloseKey(hKey);
} - }
+ NumListedServ = ListView_GetItemCount(hListView); + + /* set the number of listed services in the status bar */ + LoadString(hInstance, IDS_NUM_SERVICES, szNumServices, 32); + _sntprintf(buf, 300, szNumServices, NumListedServ); + SendMessage(hStatus, SB_SETTEXT, 0, (LPARAM)buf); + } + return TRUE; }
_____
Modified: trunk/reactos/subsys/system/servman/resource.h --- trunk/reactos/subsys/system/servman/resource.h 2006-01-10 22:36:52 UTC (rev 20772) +++ trunk/reactos/subsys/system/servman/resource.h 2006-01-10 22:39:49 UTC (rev 20773) @@ -22,8 +22,9 @@
#define ID_EXIT 2010
#define IDR_MAINMENU 102 +#define IDR_POPUP 103 #define ID_VIEW_CUSTOMIZE 4021 -#define ID_HELP_ABOUT 4031 +#define ID_ABOUT 4031
#define IDS_FIRSTCOLUMN 1 #define IDS_SECONDCOLUMN 2 @@ -42,14 +43,11 @@ #define IDS_TOOLTIP_HELP 6008 #define IDS_TOOLTIP_EXIT 6009
-#define IDS_SERVICES_STATUS_RUNNING 5000 -#define IDS_SERVICES_STATUS_STOPPED 5001 -#define IDS_SERVICES_YES 5002 -#define IDS_SERVICES_UNKNOWN 5003 -#define IDS_SERVICES_AUTO 5004 -#define IDS_SERVICES_MAN 5005 -#define IDS_SERVICES_DIS 5006 -#define IDS_SERVICES_NUM_SERVICES 5010 +#define IDS_SERVICES_STARTED 5000 +#define IDS_SERVICES_AUTO 5004 +#define IDS_SERVICES_MAN 5005 +#define IDS_SERVICES_DIS 5006 +#define IDS_NUM_SERVICES 5010
#define IDI_SM_ICON 50 #define IDB_BUTTONS 51 _____
Modified: trunk/reactos/subsys/system/servman/servman.c --- trunk/reactos/subsys/system/servman/servman.c 2006-01-10 22:36:52 UTC (rev 20772) +++ trunk/reactos/subsys/system/servman/servman.c 2006-01-10 22:39:49 UTC (rev 20773) @@ -4,7 +4,7 @@
* FILE: subsys/system/servman/servman.c * PURPOSE: Main window message handler * COPYRIGHT: Copyright 2005 Ged Murphy gedmurphy@gmail.com - * + * */
#include "servman.h" @@ -16,6 +16,7 @@ HWND hListView; HWND hStatus; HWND hTool; +HMENU hShortcutMenu;
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) @@ -33,7 +34,7 @@ LVCOLUMN lvc = { 0 };
/* Toolbar buttons */ - TBBUTTON tbb [NUM_BUTTONS] = + TBBUTTON tbb [NUM_BUTTONS] = { /* iBitmap, idCommand, fsState, fsStyle, bReserved[2], dwData, iString */ {TBICON_PROP, ID_PROP, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* properties */ {TBICON_REFRESH, ID_REFRESH, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0}, /* refresh */ @@ -42,9 +43,9 @@ /* Note: First item for a seperator is its width in pixels */ {25, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */
- {TBICON_START, ID_START, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* start */ + {TBICON_START, ID_START, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* start */ {TBICON_STOP, ID_STOP, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* stop */ - {TBICON_PAUSE, ID_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* pause */ + {TBICON_PAUSE, ID_PAUSE, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* pause */ {TBICON_RESTART, ID_RESTART, TBSTATE_ENABLED, BTNS_BUTTON, {0}, 0, 0 }, /* restart */
{25, 0, TBSTATE_ENABLED, BTNS_SEP, {0}, 0, 0}, /* separator */ @@ -105,7 +106,7 @@
hListView = CreateWindow(WC_LISTVIEW, NULL, - WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER | + WS_CHILD | WS_VISIBLE | LVS_REPORT | WS_BORDER | LVS_EDITLABELS | LVS_SORTASCENDING, 0, 0, 0, 0, /* sized via WM_SIZE */ hwnd, @@ -178,10 +179,17 @@ SendMessage(hStatus, SB_SETPARTS, sizeof(statwidths)/sizeof(int), (LPARAM)statwidths);
+/* ======================== Create Popup Menu ============================== */ + + hShortcutMenu = LoadMenu(hInstance, MAKEINTRESOURCE (IDR_POPUP)); + hShortcutMenu = GetSubMenu(hShortcutMenu, 0); + + + + /* ================= populate the list view with all services =================== */
- if (! RefreshServiceList() ) - GetError(); + RefreshServiceList();
} break; @@ -224,16 +232,26 @@ case WM_NOTIFY: { LPNMITEMACTIVATE item; +
switch (((LPNMHDR) lParam)->code) { + case NM_RCLICK: + { + //item = (LPNMITEMACTIVATE) lParam; + //lpnmh = (LPNMHDR) lParam; + POINT pt;
+ GetCursorPos(&pt); + TrackPopupMenuEx(hShortcutMenu, TPM_RIGHTBUTTON, pt.x, pt.y, hwnd, NULL); + } + break; + case NM_DBLCLK: - item = (LPNMITEMACTIVATE) lParam; - PropSheets(hwnd); + item = (LPNMITEMACTIVATE) lParam; + PropSheets(hwnd); + break;
- break; - case TTN_GETDISPINFO: { LPTOOLTIPTEXT lpttt; @@ -274,7 +292,7 @@ case ID_RESTART: lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_RESTART); break; - + case ID_NEW: lpttt->lpszText = MAKEINTRESOURCE(IDS_TOOLTIP_NEW); break; @@ -300,6 +318,7 @@ case WM_CLOSE: /* free the service array */ FreeMemory(); + DestroyMenu(hShortcutMenu); DestroyWindow(hwnd); break;
@@ -313,10 +332,10 @@ case ID_PROP: PropSheets(hwnd); break; - + case ID_REFRESH: if (! RefreshServiceList() ) - GetError(); + GetError(0);
case ID_EXPORT: break; @@ -340,7 +359,7 @@ break;
case ID_HELP: - MessageBox(NULL, _T("Help is not yet implemented\n"), + MessageBox(NULL, _T("Help is not yet implemented\n"), _T("Note!"), MB_OK | MB_ICONINFORMATION); break;
@@ -351,7 +370,7 @@ case ID_VIEW_CUSTOMIZE: break;
- case ID_HELP_ABOUT: + case ID_ABOUT: DialogBox(hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), hwnd, _____
Modified: trunk/reactos/subsys/system/servman/servman.h --- trunk/reactos/subsys/system/servman/servman.h 2006-01-10 22:36:52 UTC (rev 20772) +++ trunk/reactos/subsys/system/servman/servman.h 2006-01-10 22:39:49 UTC (rev 20773) @@ -15,10 +15,14 @@
BOOL CALLBACK AboutDialogProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
-VOID GetError(VOID); +BOOL Start(LPCTSTR ServiceName, LPCTSTR *ServiceArgs, INT ArgCount); + +VOID GetError(DWORD); VOID FreeMemory(VOID); VOID DisplayString(PTCHAR);
+VOID GetData(VOID); + LONG APIENTRY PropSheets(HWND hwnd);
DWORD GetServiceList(VOID);