+ service = (nssm_service_t *) l;\r
+\r
+ SetFocus(GetDlgItem(window, IDC_NAME));\r
+\r
+ HWND tabs;\r
+ HWND combo;\r
+ HWND list;\r
+ int i, n;\r
+ tabs = GetDlgItem(window, IDC_TAB1);\r
+ if (! tabs) return 0;\r
+\r
+ /* Set up tabs. */\r
+ TCITEM tab;\r
+ ZeroMemory(&tab, sizeof(tab));\r
+ tab.mask = TCIF_TEXT;\r
+\r
+ selected_tab = 0;\r
+\r
+ /* Application tab. */\r
+ if (service->native) tab.pszText = message_string(NSSM_GUI_TAB_NATIVE);\r
+ else tab.pszText = message_string(NSSM_GUI_TAB_APPLICATION);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText);\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_APPLICATION, (LPARAM) &tab);\r
+ if (service->native) {\r
+ tablist[NSSM_TAB_APPLICATION] = dialog(MAKEINTRESOURCE(IDD_NATIVE), window, tab_dlg);\r
+ EnableWindow(tablist[NSSM_TAB_APPLICATION], 0);\r
+ EnableWindow(GetDlgItem(tablist[NSSM_TAB_APPLICATION], IDC_PATH), 0);\r
+ }\r
+ else tablist[NSSM_TAB_APPLICATION] = dialog(MAKEINTRESOURCE(IDD_APPLICATION), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_APPLICATION], SW_SHOW);\r
+\r
+ /* Details tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_DETAILS);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText);\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_DETAILS, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_DETAILS] = dialog(MAKEINTRESOURCE(IDD_DETAILS), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_DETAILS], SW_HIDE);\r
+\r
+ /* Set defaults. */\r
+ combo = GetDlgItem(tablist[NSSM_TAB_DETAILS], IDC_STARTUP);\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_STARTUP_AUTOMATIC, (LPARAM) message_string(NSSM_GUI_STARTUP_AUTOMATIC));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_STARTUP_DELAYED, (LPARAM) message_string(NSSM_GUI_STARTUP_DELAYED));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_STARTUP_MANUAL, (LPARAM) message_string(NSSM_GUI_STARTUP_MANUAL));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_STARTUP_DISABLED, (LPARAM) message_string(NSSM_GUI_STARTUP_DISABLED));\r
+ SendMessage(combo, CB_SETCURSEL, NSSM_STARTUP_AUTOMATIC, 0);\r
+\r
+ /* Logon tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_LOGON);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText);\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_LOGON, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_LOGON] = dialog(MAKEINTRESOURCE(IDD_LOGON), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_LOGON], SW_HIDE);\r
+\r
+ /* Set defaults. */\r
+ CheckRadioButton(tablist[NSSM_TAB_LOGON], IDC_LOCALSYSTEM, IDC_ACCOUNT, IDC_LOCALSYSTEM);\r
+ set_logon_enabled(1, 0);\r
+\r
+ /* Dependencies tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_DEPENDENCIES);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText);\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_DEPENDENCIES, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_DEPENDENCIES] = dialog(MAKEINTRESOURCE(IDD_DEPENDENCIES), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_DEPENDENCIES], SW_HIDE);\r
+\r
+ /* Remaining tabs are only for services we manage. */\r
+ if (service->native) return 1;\r
+\r
+ /* Process tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_PROCESS);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText);\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_PROCESS, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_PROCESS] = dialog(MAKEINTRESOURCE(IDD_PROCESS), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_PROCESS], SW_HIDE);\r
+\r
+ /* Set defaults. */\r
+ combo = GetDlgItem(tablist[NSSM_TAB_PROCESS], IDC_PRIORITY);\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_REALTIME_PRIORITY, (LPARAM) message_string(NSSM_GUI_REALTIME_PRIORITY_CLASS));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_HIGH_PRIORITY, (LPARAM) message_string(NSSM_GUI_HIGH_PRIORITY_CLASS));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_ABOVE_NORMAL_PRIORITY, (LPARAM) message_string(NSSM_GUI_ABOVE_NORMAL_PRIORITY_CLASS));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_NORMAL_PRIORITY, (LPARAM) message_string(NSSM_GUI_NORMAL_PRIORITY_CLASS));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_BELOW_NORMAL_PRIORITY, (LPARAM) message_string(NSSM_GUI_BELOW_NORMAL_PRIORITY_CLASS));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_IDLE_PRIORITY, (LPARAM) message_string(NSSM_GUI_IDLE_PRIORITY_CLASS));\r
+ SendMessage(combo, CB_SETCURSEL, NSSM_NORMAL_PRIORITY, 0);\r
+\r
+ SendDlgItemMessage(tablist[NSSM_TAB_PROCESS], IDC_CONSOLE, BM_SETCHECK, BST_CHECKED, 0);\r
+\r
+ list = GetDlgItem(tablist[NSSM_TAB_PROCESS], IDC_AFFINITY);\r
+ n = num_cpus();\r
+ SendMessage(list, LB_SETCOLUMNWIDTH, 16, 0);\r
+ for (i = 0; i < n; i++) {\r
+ TCHAR buffer[3];\r
+ _sntprintf_s(buffer, _countof(buffer), _TRUNCATE, _T("%d"), i);\r
+ SendMessage(list, LB_ADDSTRING, 0, (LPARAM) buffer);\r
+ }\r
+\r
+ /*\r
+ Size to fit.\r
+ The box is high enough for four rows. It is wide enough for eight\r
+ columns without scrolling. With scrollbars it shrinks to two rows.\r
+ Note that the above only holds if we set the column width BEFORE\r
+ adding the strings.\r
+ */\r
+ if (n < 32) {\r
+ int columns = (n - 1) / 4;\r
+ RECT rect;\r
+ GetWindowRect(list, &rect);\r
+ int width = rect.right - rect.left;\r
+ width -= (7 - columns) * 16;\r
+ int height = rect.bottom - rect.top;\r
+ if (n < 4) height -= (int) SendMessage(list, LB_GETITEMHEIGHT, 0, 0) * (4 - n);\r
+ SetWindowPos(list, 0, 0, 0, width, height, SWP_NOMOVE | SWP_NOOWNERZORDER);\r
+ }\r
+ SendMessage(list, LB_SELITEMRANGE, 1, MAKELPARAM(0, n));\r
+\r
+ SendDlgItemMessage(tablist[NSSM_TAB_PROCESS], IDC_AFFINITY_ALL, BM_SETCHECK, BST_CHECKED, 0);\r
+ set_affinity_enabled(0);\r
+\r
+ /* Shutdown tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_SHUTDOWN);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText);\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_SHUTDOWN, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_SHUTDOWN] = dialog(MAKEINTRESOURCE(IDD_SHUTDOWN), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_SHUTDOWN], SW_HIDE);\r
+\r
+ /* Set defaults. */\r
+ SendDlgItemMessage(tablist[NSSM_TAB_SHUTDOWN], IDC_METHOD_CONSOLE, BM_SETCHECK, BST_CHECKED, 0);\r
+ SetDlgItemInt(tablist[NSSM_TAB_SHUTDOWN], IDC_KILL_CONSOLE, NSSM_KILL_CONSOLE_GRACE_PERIOD, 0);\r
+ SendDlgItemMessage(tablist[NSSM_TAB_SHUTDOWN], IDC_METHOD_WINDOW, BM_SETCHECK, BST_CHECKED, 0);\r
+ SetDlgItemInt(tablist[NSSM_TAB_SHUTDOWN], IDC_KILL_WINDOW, NSSM_KILL_WINDOW_GRACE_PERIOD, 0);\r
+ SendDlgItemMessage(tablist[NSSM_TAB_SHUTDOWN], IDC_METHOD_THREADS, BM_SETCHECK, BST_CHECKED, 0);\r
+ SetDlgItemInt(tablist[NSSM_TAB_SHUTDOWN], IDC_KILL_THREADS, NSSM_KILL_THREADS_GRACE_PERIOD, 0);\r
+ SendDlgItemMessage(tablist[NSSM_TAB_SHUTDOWN], IDC_METHOD_TERMINATE, BM_SETCHECK, BST_CHECKED, 0);\r
+ SendDlgItemMessage(tablist[NSSM_TAB_SHUTDOWN], IDC_KILL_PROCESS_TREE, BM_SETCHECK, BST_CHECKED, 1);\r
+\r
+ /* Restart tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_EXIT);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText);\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_EXIT, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_EXIT] = dialog(MAKEINTRESOURCE(IDD_APPEXIT), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_EXIT], SW_HIDE);\r
+\r
+ /* Set defaults. */\r
+ SetDlgItemInt(tablist[NSSM_TAB_EXIT], IDC_THROTTLE, NSSM_RESET_THROTTLE_RESTART, 0);\r
+ combo = GetDlgItem(tablist[NSSM_TAB_EXIT], IDC_APPEXIT);\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_EXIT_RESTART, (LPARAM) message_string(NSSM_GUI_EXIT_RESTART));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_EXIT_IGNORE, (LPARAM) message_string(NSSM_GUI_EXIT_IGNORE));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_EXIT_REALLY, (LPARAM) message_string(NSSM_GUI_EXIT_REALLY));\r
+ SendMessage(combo, CB_INSERTSTRING, NSSM_EXIT_UNCLEAN, (LPARAM) message_string(NSSM_GUI_EXIT_UNCLEAN));\r
+ SendMessage(combo, CB_SETCURSEL, NSSM_EXIT_RESTART, 0);\r
+ SetDlgItemInt(tablist[NSSM_TAB_EXIT], IDC_RESTART_DELAY, 0, 0);\r
+\r
+ /* I/O tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_IO);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText) + 1;\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_IO, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_IO] = dialog(MAKEINTRESOURCE(IDD_IO), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_IO], SW_HIDE);\r
+\r
+ /* Set defaults. */\r
+ SendDlgItemMessage(tablist[NSSM_TAB_IO], IDC_TIMESTAMP, BM_SETCHECK, BST_UNCHECKED, 0);\r
+\r
+ /* Rotation tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_ROTATION);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText) + 1;\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_ROTATION, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_ROTATION] = dialog(MAKEINTRESOURCE(IDD_ROTATION), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_ROTATION], SW_HIDE);\r
+\r
+ /* Set defaults. */\r
+ SendDlgItemMessage(tablist[NSSM_TAB_ROTATION], IDC_ROTATE_ONLINE, BM_SETCHECK, BST_UNCHECKED, 0);\r
+ SetDlgItemInt(tablist[NSSM_TAB_ROTATION], IDC_ROTATE_SECONDS, 0, 0);\r
+ SetDlgItemInt(tablist[NSSM_TAB_ROTATION], IDC_ROTATE_BYTES_LOW, 0, 0);\r
+ set_rotation_enabled(0);\r
+\r
+ /* Environment tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_ENVIRONMENT);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText) + 1;\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_ENVIRONMENT, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_ENVIRONMENT] = dialog(MAKEINTRESOURCE(IDD_ENVIRONMENT), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_ENVIRONMENT], SW_HIDE);\r
+\r
+ /* Hooks tab. */\r
+ tab.pszText = message_string(NSSM_GUI_TAB_HOOKS);\r
+ tab.cchTextMax = (int) _tcslen(tab.pszText) + 1;\r
+ SendMessage(tabs, TCM_INSERTITEM, NSSM_TAB_HOOKS, (LPARAM) &tab);\r
+ tablist[NSSM_TAB_HOOKS] = dialog(MAKEINTRESOURCE(IDD_HOOKS), window, tab_dlg);\r
+ ShowWindow(tablist[NSSM_TAB_HOOKS], SW_HIDE);\r
+\r
+ /* Set defaults. */\r
+ combo = GetDlgItem(tablist[NSSM_TAB_HOOKS], IDC_HOOK_EVENT);\r
+ SendMessage(combo, CB_INSERTSTRING, -1, (LPARAM) message_string(NSSM_GUI_HOOK_EVENT_START));\r
+ SendMessage(combo, CB_INSERTSTRING, -1, (LPARAM) message_string(NSSM_GUI_HOOK_EVENT_STOP));\r
+ SendMessage(combo, CB_INSERTSTRING, -1, (LPARAM) message_string(NSSM_GUI_HOOK_EVENT_EXIT));\r
+ SendMessage(combo, CB_INSERTSTRING, -1, (LPARAM) message_string(NSSM_GUI_HOOK_EVENT_POWER));\r
+ SendMessage(combo, CB_INSERTSTRING, -1, (LPARAM) message_string(NSSM_GUI_HOOK_EVENT_ROTATE));\r
+ SendDlgItemMessage(tablist[NSSM_TAB_HOOKS], IDC_REDIRECT_HOOK, BM_SETCHECK, BST_UNCHECKED, 0);\r
+ if (_tcslen(service->name)) {\r
+ TCHAR hook_name[HOOK_NAME_LENGTH];\r
+ TCHAR cmd[CMD_LENGTH];\r
+ for (i = 0; hook_event_strings[i]; i++) {\r
+ const TCHAR *hook_event = hook_event_strings[i];\r
+ int j;\r
+ for (j = 0; hook_action_strings[j]; j++) {\r
+ const TCHAR *hook_action = hook_action_strings[j];\r
+ if (! valid_hook_name(hook_event, hook_action, true)) continue;\r
+ if (get_hook(service->name, hook_event, hook_action, cmd, sizeof(cmd))) continue;\r
+ if (hook_env(hook_event, hook_action, hook_name, _countof(hook_name)) < 0) continue;\r
+ SetEnvironmentVariable(hook_name, cmd);\r
+ }\r
+ }\r
+ }\r
+ set_hook_tab(0, 0, false);\r
+\r