static int task_cb (WButton * button, int action) { TaskList *tl; int sig = 0; (void) button; if (bg_list->list == NULL) return 0; /* Get this instance information */ listbox_get_current (bg_list, NULL, (void **) &tl); #ifdef SIGTSTP if (action == B_STOP) { sig = SIGSTOP; tl->state = Task_Stopped; } else if (action == B_RESUME) { sig = SIGCONT; tl->state = Task_Running; } else #endif if (action == B_KILL) { sig = SIGKILL; } if (sig == SIGKILL) unregister_task_running (tl->pid, tl->fd); kill (tl->pid, sig); listbox_remove_list (bg_list); jobs_fill_listbox (); /* This can be optimized to just redraw this widget :-) */ dlg_redraw (jobs_dlg); return 0; }
void jobs_cmd (void) { struct { const char *name; int flags; int value; int len; bcback_fn callback; } job_but[] = { /* *INDENT-OFF* */ { N_("&Stop"), NORMAL_BUTTON, B_STOP, 0, task_cb }, { N_("&Resume"), NORMAL_BUTTON, B_RESUME, 0, task_cb }, { N_("&Kill"), NORMAL_BUTTON, B_KILL, 0, task_cb }, { N_("&OK"), DEFPUSH_BUTTON, B_CANCEL, 0, NULL } /* *INDENT-ON* */ }; size_t i; const size_t n_but = G_N_ELEMENTS (job_but); WDialog *jobs_dlg; int cols = 60; int lines = 15; int x = 0; for (i = 0; i < n_but; i++) { #ifdef ENABLE_NLS job_but[i].name = _(job_but[i].name); #endif /* ENABLE_NLS */ job_but[i].len = str_term_width1 (job_but[i].name) + 3; if (job_but[i].flags == DEFPUSH_BUTTON) job_but[i].len += 2; x += job_but[i].len; } x += (int) n_but - 1; cols = max (cols, x + 6); jobs_dlg = dlg_create (TRUE, 0, 0, lines, cols, dialog_colors, NULL, NULL, "[Background jobs]", _("Background jobs"), DLG_CENTER); bg_list = listbox_new (2, 2, lines - 6, cols - 6, FALSE, NULL); jobs_fill_listbox (bg_list); add_widget (jobs_dlg, bg_list); add_widget (jobs_dlg, hline_new (lines - 4, -1, -1)); x = (cols - x) / 2; for (i = 0; i < n_but; i++) { add_widget (jobs_dlg, button_new (lines - 3, x, job_but[i].value, job_but[i].flags, job_but[i].name, job_but[i].callback)); x += job_but[i].len + 1; } (void) dlg_run (jobs_dlg); dlg_destroy (jobs_dlg); }