X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gui.c;h=e9e94873ae28f0963d355fe6d40683f78b6f2f41;hp=5d1a1b62596e6fa545579e760dedbac81f6be59a;hb=ee3dfa7ab8a74124448649386e877775cd8625b6;hpb=6ceaf430c5d331db83b591ae02d9eef5c87a31df diff --git a/gui.c b/gui.c index 5d1a1b62..e9e94873 100644 --- a/gui.c +++ b/gui.c @@ -296,7 +296,7 @@ static int align_str(WINDOW* win, char *str, unsigned int len, waddstr(win, str); } else { add_spaces(win, num / 2); - waddstr(win, str[0]? str: ""); + waddstr(win, str); add_spaces(win, num - num / 2); } return 1; @@ -871,6 +871,23 @@ static void parse_config_file_or_die(bool override) } goto out; } + /* + * When the gengetopt config file parser is called more than once, any + * key map arguments found in the config file are _appended_ to the old + * values, even though we turn on ->override. We want the new arguments + * to replace the old ones, so we must empty the key_map_arg array + * first. Unfortunately, this also clears any key map arguments given + * at the command line. + */ + if (override) { + int i; + for (i = 0; i < conf.key_map_given; i++) { + free(conf.key_map_arg[i]); + conf.key_map_arg[i] = NULL; + } + conf.key_map_given = 0; + } + gui_cmdline_parser_config_file(config_file, &conf, ¶ms); loglevel = get_loglevel_by_name(conf.loglevel_arg); check_key_map_args_or_die(); @@ -1132,12 +1149,6 @@ static int input_post_select(__a_unused struct sched *s, __a_unused void *contex return 0; } -static void signal_pre_select(struct sched *s, void *context) -{ - struct signal_task *st = context; - para_fd_set(st->fd, &s->rfds, &s->max_fileno); -} - static void print_scroll_msg(void) { unsigned lines_total, filled = ringbuffer_filled(bot_win_rb); @@ -1412,7 +1423,7 @@ static int setup_tasks_and_schedule(void) struct exec_task exec_task = {.task = NULL}; struct status_task status_task = {.fd = -1}; struct input_task input_task = {.task = NULL}; - struct signal_task signal_task = {.task = NULL}; + struct signal_task *signal_task; struct sched sched = { .default_timeout = { .tv_sec = conf.timeout_arg / 1000, @@ -1441,19 +1452,20 @@ static int setup_tasks_and_schedule(void) .context = &input_task, }, &sched); - signal_task.fd = para_signal_init(); + signal_task = signal_init_or_die(); para_install_sighandler(SIGINT); para_install_sighandler(SIGTERM); para_install_sighandler(SIGCHLD); para_install_sighandler(SIGUSR1); - signal_task.task = task_register(&(struct task_info) { + signal_task->task = task_register(&(struct task_info) { .name = "signal", .pre_select = signal_pre_select, .post_select = signal_post_select, - .context = &signal_task, + .context = signal_task, }, &sched); ret = schedule(&sched); sched_shutdown(&sched); + signal_shutdown(signal_task); return ret; }