X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gui.c;h=b077b00aa9dd08a5c01dbdec06003781013d11cb;hp=9b7c2f992520896f2ae33918854604b37bbc7720;hb=4e50adaf054af75767fa23eec1b5c22f05eb7bca;hpb=ccd288cee4d15e54640d87c1451b46c3ff0e2591 diff --git a/gui.c b/gui.c index 9b7c2f99..b077b00a 100644 --- a/gui.c +++ b/gui.c @@ -129,6 +129,7 @@ struct input_task { struct status_task { struct task task; + pid_t pid; char *buf; int bufsize, loaded; struct timeval next_exec; @@ -601,24 +602,37 @@ static void status_pre_select(struct sched *s, struct task *t) struct status_task *st = container_of(t, struct status_task, task); if (st->fd >= 0) - return para_fd_set(st->fd, &s->rfds, &s->max_fileno); - sched_request_barrier_or_min_delay(&st->next_exec, s); + para_fd_set(st->fd, &s->rfds, &s->max_fileno); + if (task_get_notification(t) < 0) + return sched_min_delay(s); + if (st->fd < 0) + sched_request_barrier_or_min_delay(&st->next_exec, s); } static int status_post_select(struct sched *s, struct task *t) { struct status_task *st = container_of(t, struct status_task, task); size_t sz; - pid_t pid; int ret, ret2; + ret = task_get_notification(t); + if (ret == -E_GUI_SIGCHLD && st->pid > 0) { + int exit_status; + if (waitpid(st->pid, &exit_status, WNOHANG) == st->pid) { + st->pid = 0; + PARA_ERROR_LOG("stat command exit status: %d", + exit_status); + } + } if (st->fd < 0) { int fds[3] = {0, 1, 0}; + if (st->pid > 0) + return 0; /* Avoid busy loop */ if (tv_diff(&st->next_exec, now, NULL) > 0) return 0; st->next_exec.tv_sec = now->tv_sec + 2; - ret = para_exec_cmdline_pid(&pid, conf.stat_cmd_arg, fds); + ret = para_exec_cmdline_pid(&st->pid, conf.stat_cmd_arg, fds); if (ret < 0) return 0; ret = mark_fd_nonblocking(fds[1]); @@ -672,7 +686,7 @@ static void init_wins(int top_lines) int bot_lines = LINES - top_lines - 3, sb_lines = 1, in_lines = 1, sep_lines = 1; - assume_default_colors(theme.default_fg, theme.default_bg); + assume_default_colors(theme.dflt.fg, theme.dflt.bg); if (top.win) { wresize(top.win, top_lines, COLS); mvwin(top.win, top_y, 0); @@ -744,16 +758,16 @@ static void init_colors_or_die(void) die(EXIT_FAILURE, "fatal: failed to start colors\n"); FOR_EACH_STATUS_ITEM(i) if (theme.data[i].len) - init_pair_or_die(i + 1, theme.data[i].fg, - theme.data[i].bg); - init_pair_or_die(COLOR_STATUSBAR, theme.sb_fg, theme.sb_bg); - init_pair_or_die(COLOR_COMMAND, theme.cmd_fg, theme.cmd_bg); - init_pair_or_die(COLOR_OUTPUT, theme.output_fg, theme.output_bg); - init_pair_or_die(COLOR_MSG, theme.msg_fg, theme.msg_bg); - init_pair_or_die(COLOR_ERRMSG, theme.err_msg_fg, theme.err_msg_bg); - init_pair_or_die(COLOR_SEPARATOR, theme.sep_fg, theme.sep_bg); - init_pair_or_die(COLOR_TOP, theme.default_fg, theme.default_bg); - init_pair_or_die(COLOR_BOT, theme.default_fg, theme.default_bg); + init_pair_or_die(i + 1, theme.data[i].color.fg, + theme.data[i].color.bg); + init_pair_or_die(COLOR_STATUSBAR, theme.sb.fg, theme.sb.bg); + init_pair_or_die(COLOR_COMMAND, theme.cmd.fg, theme.cmd.bg); + init_pair_or_die(COLOR_OUTPUT, theme.output.fg, theme.output.bg); + init_pair_or_die(COLOR_MSG, theme.msg.fg, theme.msg.bg); + init_pair_or_die(COLOR_ERRMSG, theme.err_msg.fg, theme.err_msg.bg); + init_pair_or_die(COLOR_SEPARATOR, theme.sep.fg, theme.sep.bg); + init_pair_or_die(COLOR_TOP, theme.dflt.fg, theme.dflt.bg); + init_pair_or_die(COLOR_BOT, theme.dflt.fg, theme.dflt.bg); } /* (Re-)initialize the curses library. */ @@ -781,23 +795,6 @@ static void init_curses(void) // noecho(); /* don't echo input */ } -static void check_sigchld(void) -{ - int ret; - pid_t pid; - -reap_next_child: - ret = para_reap_child(&pid); - if (ret <= 0) - return; - if (pid == exec_pid) { - exec_pid = 0; - init_curses(); - print_in_bar(COLOR_MSG, " "); - } - goto reap_next_child; -} - /* * This sucker modifies its first argument. *handler and *arg are * pointers to 0-terminated strings (inside line). Crap. @@ -876,12 +873,12 @@ static void parse_config_file_or_die(bool override) gui_cmdline_parser_config_file(config_file, &conf, ¶ms); loglevel = get_loglevel_by_name(conf.loglevel_arg); check_key_map_args_or_die(); - theme_init(conf.theme_arg, &theme); err = false; out: free(config_file); if (err) exit(EXIT_FAILURE); + theme_init(conf.theme_arg, &theme); } /* reread configuration, terminate on errors */ @@ -910,13 +907,6 @@ static int signal_post_select(struct sched *s, __a_unused struct task *t) case SIGTERM: die(EXIT_FAILURE, "only the good die young (caught SIGTERM)\n"); return 1; - case SIGWINCH: - if (curses_active()) { - shutdown_curses(); - init_curses(); - redraw_bot_win(); - } - return 1; case SIGINT: PARA_WARNING_LOG("caught SIGINT, reset\n"); /* Nothing to do. SIGINT killed our child which gets noticed @@ -928,7 +918,7 @@ static int signal_post_select(struct sched *s, __a_unused struct task *t) reread_conf(); return 1; case SIGCHLD: - check_sigchld(); + task_notify_all(s, E_GUI_SIGCHLD); return 1; } return 1; @@ -943,26 +933,31 @@ static enum exec_status exec_status(void) return EXEC_IDLE; } -static void exec_pre_select(struct sched *s, __a_unused struct task *t) +static void exec_pre_select(struct sched *s, struct task *t) { - enum exec_status es = exec_status(); - - if (es != EXEC_DCMD) - return; if (exec_fds[0] >= 0) para_fd_set(exec_fds[0], &s->rfds, &s->max_fileno); if (exec_fds[1] >= 0) para_fd_set(exec_fds[1], &s->rfds, &s->max_fileno); + if (task_get_notification(t) < 0) + sched_min_delay(s); } static int exec_post_select(struct sched *s, struct task *t) { struct exec_task *ct = container_of(t, struct exec_task, task); int i, ret; - enum exec_status es = exec_status(); - if (es != EXEC_DCMD) - return 0; + ret = task_get_notification(t); + if (ret == -E_GUI_SIGCHLD && exec_pid > 0) { + int exit_status; + if (waitpid(exec_pid, &exit_status, WNOHANG) == exec_pid) { + exec_pid = 0; + init_curses(); + PARA_INFO_LOG("command exit status: %d", exit_status); + print_in_bar(COLOR_MSG, " "); + } + } for (i = 0; i < 2; i++) { size_t sz; if (exec_fds[i] < 0) @@ -1118,13 +1113,19 @@ static int input_post_select(__a_unused struct sched *s, __a_unused struct task in.needs_update = sep.needs_update = false; } ret = wgetch(top.win); - if (ret == ERR || ret == KEY_RESIZE) + if (ret == ERR) return 0; - if (exs == EXEC_IDLE) { - handle_command(ret); + if (ret == KEY_RESIZE) { + if (curses_active()) { + shutdown_curses(); + init_curses(); + redraw_bot_win(); + } return 0; } - if (exec_pid != 0) + if (exs == EXEC_IDLE) + handle_command(ret); + else if (exec_pid > 0) kill(exec_pid, SIGTERM); return 0; } @@ -1444,7 +1445,6 @@ static int setup_tasks_and_schedule(void) para_install_sighandler(SIGINT); para_install_sighandler(SIGTERM); para_install_sighandler(SIGCHLD); - para_install_sighandler(SIGWINCH); para_install_sighandler(SIGUSR1); register_task(&sched, &exec_task.task);