]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - gui.c
gui: Move call to print_all_items() into init_wins().
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index 6e3c3e1edf36549917a17bd58511692d8bed7d8b..57cfe638dd5ba247763472b7bca4a2e5fd80748e 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -543,108 +543,25 @@ static void setup_signal_handling(void)
        para_install_sighandler(SIGUSR1);
 }
 
-/* kill every process in the process group and exit */
-__noreturn static void kill_pg_and_die(int ret)
-{
-       para_sigaction(SIGTERM, SIG_IGN);
-       kill(0, SIGTERM);
-       exit(ret);
-}
-
 static void shutdown_curses(void)
 {
        def_prog_mode();
        endwin();
 }
 
-__noreturn static void finish(int ret)
-{
-       shutdown_curses();
-       kill_pg_and_die(ret);
-}
-
-/*
- * exit curses and print given message to stdout/stderr
- */
-__noreturn __printf_2_3 static void msg_n_exit(int ret, const char* fmt, ...)
+/* disable curses, print a message, kill running processes and exit */
+__noreturn __printf_2_3 static void die(int exit_code, const char* fmt, ...)
 {
        va_list argp;
-       FILE *outfd = ret? stderr: stdout;
 
        shutdown_curses();
        va_start(argp, fmt);
-       vfprintf(outfd, fmt, argp);
+       vfprintf(stderr, fmt, argp);
        va_end(argp);
-       kill_pg_and_die(ret);
-}
-
-/*
- * init all windows
- */
-static void init_wins(int top_lines)
-{
-       int top_y = 0, bot_y = top_lines + 1, sb_y = LINES - 2,
-               in_y = LINES - 1, sep_y = top_lines;
-
-       top.lines = top_lines;
-       bot.lines = LINES - top.lines - 3;
-       sb.lines = in.lines = sep.lines = 1;
-
-       top.cols = bot.cols = sb.cols = in.cols = sep.cols = COLS;
-
-       assume_default_colors(theme.default_fg, theme.default_bg);
-       if (top.win) {
-               wresize(top.win, top.lines, top.cols);
-               mvwin(top.win, top_y, 0);
-
-               wresize(sb.win, sb.lines, sb.cols);
-               mvwin(sb.win, sb_y, 0);
-
-               wresize(sep.win, sep.lines, sep.cols);
-               mvwin(sep.win, sep_y, 0);
-
-               wresize(bot.win, bot.lines, bot.cols);
-               mvwin(bot.win, bot_y, 0);
-
-               wresize(in.win, in.lines, in.cols);
-               mvwin(in.win, in_y, 0);
-       } else {
-               sep.win = newwin(sep.lines, sep.cols, sep_y, 0);
-               top.win = newwin(top.lines, top.cols, top_y, 0);
-               bot.win = newwin(bot.lines, bot.cols, bot_y, 0);
-               sb.win = newwin(sb.lines, sb.cols, sb_y, 0);
-               in.win = newwin(in.lines, in.cols, in_y, 0);
-               if (!top.win || !bot.win || !sb.win || !in.win || !sep.win)
-                       msg_n_exit(1, "Error: Cannot create curses windows\n");
-               wclear(bot.win);
-               wclear(sb.win);
-               wclear(in.win);
-               scrollok(bot.win, 1);
-               wattron(sb.win, COLOR_PAIR(COLOR_STATUSBAR));
-               wattron(sep.win, COLOR_PAIR(COLOR_SEPARATOR));
-               wattron(bot.win, COLOR_PAIR(COLOR_BOT));
-               wattron(top.win, COLOR_PAIR(COLOR_TOP));
-               nodelay(top.win, 1);
-               nodelay(bot.win, 1);
-               nodelay(sb.win, 1);
-               nodelay(in.win, 0);
-
-               keypad(top.win, 1);
-               keypad(bot.win, 1);
-               keypad(sb.win, 1);
-               keypad(in.win, 1);
-       }
-       wmove(sep.win, 0, 0);
-       whline(sep.win, theme.sep_char, COLS);
-       wclear(top.win);
-       //wclear(bot.win);
-       wnoutrefresh(top.win);
-       wnoutrefresh(bot.win);
-       print_status_bar();
-       wnoutrefresh(sb.win);
-       wnoutrefresh(in.win);
-       wnoutrefresh(sep.win);
-       doupdate();
+       /* kill every process in the process group and exit */
+       para_sigaction(SIGTERM, SIG_IGN);
+       kill(0, SIGTERM);
+       exit(exit_code);
 }
 
 /*
@@ -751,10 +668,80 @@ static void clear_all_items(void)
        }
 }
 
+/*
+ * init all windows
+ */
+static void init_wins(int top_lines)
+{
+       int top_y = 0, bot_y = top_lines + 1, sb_y = LINES - 2,
+               in_y = LINES - 1, sep_y = top_lines;
+
+       top.lines = top_lines;
+       bot.lines = LINES - top.lines - 3;
+       sb.lines = in.lines = sep.lines = 1;
+
+       top.cols = bot.cols = sb.cols = in.cols = sep.cols = COLS;
+
+       assume_default_colors(theme.default_fg, theme.default_bg);
+       if (top.win) {
+               wresize(top.win, top.lines, top.cols);
+               mvwin(top.win, top_y, 0);
+
+               wresize(sb.win, sb.lines, sb.cols);
+               mvwin(sb.win, sb_y, 0);
+
+               wresize(sep.win, sep.lines, sep.cols);
+               mvwin(sep.win, sep_y, 0);
+
+               wresize(bot.win, bot.lines, bot.cols);
+               mvwin(bot.win, bot_y, 0);
+
+               wresize(in.win, in.lines, in.cols);
+               mvwin(in.win, in_y, 0);
+       } else {
+               sep.win = newwin(sep.lines, sep.cols, sep_y, 0);
+               top.win = newwin(top.lines, top.cols, top_y, 0);
+               bot.win = newwin(bot.lines, bot.cols, bot_y, 0);
+               sb.win = newwin(sb.lines, sb.cols, sb_y, 0);
+               in.win = newwin(in.lines, in.cols, in_y, 0);
+               if (!top.win || !bot.win || !sb.win || !in.win || !sep.win)
+                       die(EXIT_FAILURE, "Error: Cannot create curses windows\n");
+               wclear(bot.win);
+               wclear(sb.win);
+               wclear(in.win);
+               scrollok(bot.win, 1);
+               wattron(sb.win, COLOR_PAIR(COLOR_STATUSBAR));
+               wattron(sep.win, COLOR_PAIR(COLOR_SEPARATOR));
+               wattron(bot.win, COLOR_PAIR(COLOR_BOT));
+               wattron(top.win, COLOR_PAIR(COLOR_TOP));
+               nodelay(top.win, 1);
+               nodelay(bot.win, 1);
+               nodelay(sb.win, 1);
+               nodelay(in.win, 0);
+
+               keypad(top.win, 1);
+               keypad(bot.win, 1);
+               keypad(sb.win, 1);
+               keypad(in.win, 1);
+       }
+       wmove(sep.win, 0, 0);
+       whline(sep.win, theme.sep_char, COLS);
+       wclear(top.win);
+       print_all_items();
+       //wclear(bot.win);
+       wnoutrefresh(top.win);
+       wnoutrefresh(bot.win);
+       print_status_bar();
+       wnoutrefresh(sb.win);
+       wnoutrefresh(in.win);
+       wnoutrefresh(sep.win);
+       doupdate();
+}
+
 static void init_pair_or_die(short pair, short f, short b)
 {
        if (init_pair(pair, f, b) == ERR)
-               msg_n_exit(EXIT_FAILURE, "fatal: init_pair() failed\n");
+               die(EXIT_FAILURE, "fatal: init_pair() failed\n");
 }
 
 static void init_colors_or_die(void)
@@ -762,9 +749,9 @@ static void init_colors_or_die(void)
        int i;
 
        if (!has_colors())
-               msg_n_exit(EXIT_FAILURE, "fatal: No color term\n");
+               die(EXIT_FAILURE, "fatal: No color term\n");
        if (start_color() == ERR)
-               msg_n_exit(EXIT_FAILURE, "fatal: failed to start colors\n");
+               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,
@@ -785,23 +772,22 @@ static void init_curses(void)
        if (curses_active())
                return;
        if (top.win && refresh() == ERR) /* refresh is really needed */
-               msg_n_exit(EXIT_FAILURE, "refresh() failed\n");
+               die(EXIT_FAILURE, "refresh() failed\n");
        if (LINES < theme.lines_min || COLS < theme.cols_min)
-               msg_n_exit(EXIT_FAILURE, "Error: Terminal (%dx%d) too small"
+               die(EXIT_FAILURE, "Terminal (%dx%d) too small"
                        " (need at least %dx%d)\n", COLS, LINES,
                        theme.cols_min, theme.lines_min);
        curs_set(0); /* make cursor invisible, ignore errors */
        nonl(); /* do not NL->CR/NL on output, always returns OK */
        /* don't echo input */
        if (noecho() == ERR)
-               msg_n_exit(EXIT_FAILURE, "fatal: noecho() failed\n");
+               die(EXIT_FAILURE, "fatal: noecho() failed\n");
        /* take input chars one at a time, no wait for \n */
        if (cbreak() == ERR)
-               msg_n_exit(EXIT_FAILURE, "fatal: cbreak() failed\n");
+               die(EXIT_FAILURE, "fatal: cbreak() failed\n");
        init_colors_or_die();
        clear(); /* ignore non-fatal errors */
        init_wins(theme.top_lines_default);
-       print_all_items();
        // noecho(); /* don't echo input */
 }
 
@@ -838,36 +824,31 @@ err_out:
        return 0;
 }
 
-static int check_key_map_args(void)
+static void check_key_map_args_or_die(void)
 {
-       char *s;
-       int i, ret = -1;
-       char *tmp = NULL, *handler, *arg;
+       int i;
+       char *tmp = NULL;
 
        for (i = 0; i < conf.key_map_given; ++i) {
-               s = conf.key_map_arg[i];
-               if (!(*s))
-                       goto out;
+               char *handler, *arg;
+
                free(tmp);
-               tmp = para_strdup(s);
+               tmp = para_strdup(conf.key_map_arg[i]);
                if (!split_key_map(tmp, &handler, &arg))
-                       goto out;
+                       break;
                if (strlen(handler) != 1)
-                       goto out;
-               if (*handler != 'x'
-                       && *handler != 'd'
-                       && *handler != 'i'
-                       && *handler != 'p')
-                       goto out;
+                       break;
+               if (*handler != 'x' && *handler != 'd' && *handler != 'i'
+                               && *handler != 'p')
+                       break;
                if (*handler != 'i')
                        continue;
                if (find_cmd_byname(arg) < 0)
-                       goto out;
+                       break;
        }
-       ret = 0;
-out:
+       if (i != conf.key_map_given)
+               die(EXIT_FAILURE, "invalid key map: %s\n", conf.key_map_arg[i]);
        free(tmp);
-       return ret;
 }
 
 /*
@@ -877,8 +858,7 @@ static void handle_signal(int sig)
 {
        switch (sig) {
        case SIGTERM:
-               msg_n_exit(EXIT_FAILURE,
-                       "only the good die young (caught SIGTERM))\n");
+               die(EXIT_FAILURE, "only the good die young (caught SIGTERM)\n");
                return;
        case SIGWINCH:
                if (curses_active()) {
@@ -1301,8 +1281,7 @@ static void com_reread_conf(void)
        gui_cmdline_parser_config_file(cf, &conf, &params);
        init_curses();
        PARA_NOTICE_LOG("config file reloaded\n");
-       if (check_key_map_args() < 0)
-               finish(EXIT_FAILURE);
+       check_key_map_args_or_die();
 }
 
 static void com_help(void)
@@ -1349,7 +1328,6 @@ static void com_shrink_top_win(void)
                return;
        }
        init_wins(top.lines - 1);
-       print_all_items();
        print_in_bar(COLOR_MSG, "%s", "decreased top window");
 }
 
@@ -1360,7 +1338,6 @@ static void com_enlarge_top_win(void)
                return;
        }
        init_wins(top.lines + 1);
-       print_all_items();
        print_in_bar(COLOR_MSG, "increased top window");
 }
 
@@ -1371,7 +1348,7 @@ static void com_version(void)
 
 __noreturn static void com_quit(void)
 {
-       finish(0);
+       die(EXIT_SUCCESS, "%s", "");
 }
 
 static void com_refresh(void)
@@ -1455,7 +1432,7 @@ int main(int argc, char *argv[])
                print_help_and_die();
        cf = configfile_exists();
        if (!cf && conf.config_file_given)
-               msg_n_exit(EXIT_FAILURE, "can not read config file %s\n",
+               die(EXIT_FAILURE, "can not read config file %s\n",
                        conf.config_file_arg);
        if (cf) {
                struct gui_cmdline_parser_params params = {
@@ -1468,8 +1445,7 @@ int main(int argc, char *argv[])
                gui_cmdline_parser_config_file(cf, &conf, &params);
                loglevel = get_loglevel_by_name(conf.loglevel_arg);
        }
-       if (check_key_map_args() < 0)
-               msg_n_exit(EXIT_FAILURE, "invalid key map\n");
+       check_key_map_args_or_die();
        theme_init(conf.theme_arg, &theme);
        setup_signal_handling();
        bot_win_rb = ringbuffer_new(RINGBUFFER_SIZE);