gui: Kill pointless initialization of top.lines in main().
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index 0361347e54375b18165a16f7d8dc747499561a6b..e854294ece0a4db3667480c80ed06160dd980f13 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 1998-2013 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1998-2014 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -23,6 +23,7 @@
 #include "list.h"
 #include "sched.h"
 #include "signal.h"
+#include "ggo.h"
 #include "version.h"
 
 /** define the array of error lists needed by para_gui */
@@ -33,7 +34,7 @@ static char *stat_content[NUM_STAT_ITEMS];
 
 static int signal_pipe;
 
-static struct win_data {
+static struct gui_window {
        WINDOW *win;
        size_t begx;
        size_t begy;
@@ -52,10 +53,10 @@ static struct ringbuffer *bot_win_rb;
 
 static unsigned scroll_position;
 
-static int curses_active;
+static bool curses_active;
 static pid_t cmd_pid;
 
-static int command_fds[2];
+static int command_fds[2] = {-1, -1};
 static int stat_pipe = -1;
 static struct gui_args_info conf;
 
@@ -79,18 +80,6 @@ struct gui_command {
        void (*handler)(void);
 };
 
-struct stat_item {
-       char name[MAXLINE];
-       char prefix[MAXLINE];
-       char postfix[MAXLINE];
-       unsigned y;
-       unsigned x;
-       unsigned len;
-       int fg, bg;
-       int align;
-       char content[MAXLINE];
-};
-
 static struct gui_theme theme;
 
 static int _argc;
@@ -360,7 +349,7 @@ __printf_2_3 static void print_in_bar(int color, const char *fmt,...)
        xvasprintf(&msg, fmt, ap);
        va_end(ap);
        wmove(in.win, 0, 0);
-       align_str(in.win, msg, sb.cols, LEFT);
+       align_str(in.win, msg, in.cols, LEFT);
        free(msg);
        wrefresh(in.win);
 }
@@ -383,7 +372,7 @@ static void print_status_bar(void)
 
 /*
  * get the number of the oldest rbe that is (partially) visible. On return,
- * lines contains the sum of the number of lines of all visable entries. If the
+ * lines contains the sum of the number of lines of all visible entries. If the
  * first one is only partially visible, lines is greater than bot.lines.
  */
 static int first_visible_rbe(unsigned *lines)
@@ -517,6 +506,7 @@ __printf_2_3 static void outputf(int color, const char* fmt,...)
 static int add_output_line(char *line, void *data)
 {
        int color = *(int *)data? COLOR_ERRMSG : COLOR_OUTPUT;
+
        if (!curses_active)
                return 1;
        rb_add_entry(color, para_strdup(line));
@@ -525,7 +515,7 @@ static int add_output_line(char *line, void *data)
 
 static int loglevel;
 
-__printf_2_3 void curses_log(int ll, const char *fmt,...)
+static __printf_2_3 void curses_log(int ll, const char *fmt,...)
 {
        int color;
        char *msg;
@@ -559,7 +549,6 @@ static void setup_signal_handling(void)
        para_install_sighandler(SIGCHLD);
        para_install_sighandler(SIGWINCH);
        para_install_sighandler(SIGUSR1);
-       para_sigaction(SIGHUP, SIG_IGN);
 }
 
 /* kill every process in the process group and exit */
@@ -575,7 +564,7 @@ static void shutdown_curses(void)
        if (!curses_active)
                return;
        def_prog_mode();
-       curses_active = 0;
+       curses_active = false;
        endwin();
 }
 
@@ -604,8 +593,8 @@ static void print_welcome(void)
 {
        if (loglevel > LL_NOTICE)
                return;
-       outputf(COLOR_WELCOME, "Welcome to para_gui " PACKAGE_VERSION
-               " \"" CODENAME "\". Theme: %s", theme.name);
+       outputf(COLOR_WELCOME, "Welcome to %s. Theme: %s",
+               version_single_line("gui"), theme.name);
        wclrtoeol(bot.win);
 }
 
@@ -834,8 +823,8 @@ static void init_colors_or_die(void)
 /* (Re-)initialize the curses library. */
 static void init_curses(void)
 {
-       curses_active = 1;
-       if (top.win && refresh() == ERR) /* refesh is really needed */
+       curses_active = true;
+       if (top.win && refresh() == ERR) /* refresh is really needed */
                msg_n_exit(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"
@@ -860,6 +849,7 @@ static void check_sigchld(void)
 {
        int ret;
        pid_t pid;
+
 reap_next_child:
        ret = para_reap_child(&pid);
        if (ret <= 0)
@@ -897,25 +887,25 @@ static int check_key_map_args(void)
        for (i = 0; i < conf.key_map_given; ++i) {
                s = conf.key_map_arg[i];
                if (!(*s))
-                       goto err_out;
+                       goto out;
                free(tmp);
                tmp = para_strdup(s);
                if (!split_key_map(tmp, &handler, &arg))
-                       goto err_out;
+                       goto out;
                if (strlen(handler) != 1)
-                       goto err_out;
+                       goto out;
                if (*handler != 'x'
                        && *handler != 'd'
                        && *handler != 'i'
                        && *handler != 'p')
-                       goto err_out;
+                       goto out;
                if (*handler != 'i')
                        continue;
                if (find_cmd_byname(arg) < 0)
-                       goto err_out;
+                       goto out;
        }
        ret = 0;
-err_out:
+out:
        free(tmp);
        return ret;
 }
@@ -938,13 +928,13 @@ static void handle_signal(int sig)
                }
                return;
        case SIGINT:
-               PARA_WARNING_LOG("caught SIGINT, reset");
+               PARA_WARNING_LOG("caught SIGINT, reset\n");
                /* Nothing to do. SIGINT killed our child which gets noticed
                 * by do_select and resets everything.
                 */
                return;
        case SIGUSR1:
-               PARA_NOTICE_LOG("got SIGUSR1, rereading configuration");
+               PARA_NOTICE_LOG("got SIGUSR1, rereading configuration\n");
                com_reread_conf();
                return;
        case SIGCHLD:
@@ -1049,16 +1039,17 @@ repeat:
                                flags[i] = 0;
                        }
                        if (ret < 0) {
-                               PARA_NOTICE_LOG("closing command fd %d: %s",
+                               PARA_NOTICE_LOG("closing command fd %d: %s\n",
                                        i, para_strerror(-ret));
                                close(command_fds[i]);
                                command_fds[i] = -1;
                                flags[i] = 0;
+                               cbo[i] = 0;
                                if (command_fds[!i] < 0) /* both fds closed */
                                        return 0;
                        }
                        if (cbo[i] == COMMAND_BUF_SIZE - 1) {
-                               PARA_NOTICE_LOG("discarding overlong line");
+                               PARA_NOTICE_LOG("discarding overlong line\n");
                                cbo[i] = 0;
                                flags[i] = FELF_DISCARD_FIRST;
                        }
@@ -1119,9 +1110,9 @@ static void send_output(void)
        if (ret < 0)
                goto fail;
        if (do_select(COMMAND_MODE) >= 0)
-               PARA_INFO_LOG("command complete");
+               PARA_INFO_LOG("command complete\n");
        else
-               PARA_NOTICE_LOG("command aborted");
+               PARA_NOTICE_LOG("command aborted\n");
        print_in_bar(COLOR_MSG, " ");
        return;
 fail:
@@ -1182,6 +1173,7 @@ static void print_scroll_msg(void)
 {
        unsigned lines_total, filled = ringbuffer_filled(bot_win_rb);
        int first_rbe = first_visible_rbe(&lines_total);
+
        print_in_bar(COLOR_MSG, "scrolled view: %d-%d/%d\n", filled - first_rbe,
                filled - scroll_position, ringbuffer_filled(bot_win_rb));
 }
@@ -1225,6 +1217,7 @@ static void com_page_down(void)
 {
        unsigned lines = 0;
        int i = scroll_position;
+
        while (lines < bot.lines && --i > 0) {
                struct rb_entry *rbe = ringbuffer_get(bot_win_rb, i);
                if (!rbe)
@@ -1347,7 +1340,7 @@ static void com_ll_incr(void)
  */
 static void com_reread_conf(void)
 {
-       char *cf =configfile_exists();
+       char *cf = configfile_exists();
        struct gui_cmdline_parser_params params = {
                .override = 1,
                .initialize = 1,
@@ -1357,16 +1350,19 @@ static void com_reread_conf(void)
        };
 
        if (!cf) {
-               PARA_WARNING_LOG("there is no configuration to read");
+               PARA_WARNING_LOG("there is no configuration to read\n");
                return;
        }
-       PARA_INFO_LOG("rereading command line options and config file");
+       PARA_INFO_LOG("rereading command line options and config file\n");
        gui_cmdline_parser_ext(_argc, _argv, &conf, &params);
-       if (gui_cmdline_parser_config_file(cf, &conf, &params) != 0) {
-               PARA_EMERG_LOG("errors in config file");
-               finish(EXIT_FAILURE);
-       }
-       PARA_NOTICE_LOG("config file reloaded");
+       /*
+        * Despite .print_errors is set to 0, gengetopt will print to stderr
+        * anyway, and exit on errors. So we have to shutdown curses first.
+        */
+       shutdown_curses();
+       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);
 }
@@ -1411,7 +1407,7 @@ static void com_help(void)
 static void com_shrink_top_win(void)
 {
        if (top.lines <= theme.top_lines_min) {
-               PARA_WARNING_LOG("can not decrease top window");
+               PARA_WARNING_LOG("can not decrease top window\n");
                return;
        }
        init_wins(top.lines - 1);
@@ -1423,7 +1419,7 @@ static void com_shrink_top_win(void)
 static void com_enlarge_top_win(void)
 {
        if (bot.lines < 3) {
-               PARA_WARNING_LOG("can not increase top window");
+               PARA_WARNING_LOG("can not increase top window\n");
                return;
        }
        init_wins(top.lines + 1);
@@ -1434,8 +1430,7 @@ static void com_enlarge_top_win(void)
 
 static void com_version(void)
 {
-       print_in_bar(COLOR_MSG, "para_gui " PACKAGE_VERSION " \""
-               CODENAME "\"");
+       print_in_bar(COLOR_MSG, "%s", version_single_line("gui"));
 }
 
 __noreturn static void com_quit(void)
@@ -1458,7 +1453,7 @@ static void change_theme(int next)
        /* This seems to be needed twice, why? */
        com_refresh();
        com_refresh();
-       PARA_NOTICE_LOG("new theme: %s", theme.name);
+       PARA_NOTICE_LOG("new theme: %s\n", theme.name);
 }
 
 static void com_next_theme(void)
@@ -1476,7 +1471,7 @@ static void handle_command(int c)
 {
        int i;
 
-       /* first check user's key bindings */
+       /* first check user-defined key bindings */
        for (i = 0; i < conf.key_map_given; ++i) {
                char *tmp, *handler, *arg;
 
@@ -1514,6 +1509,15 @@ static void handle_command(int c)
                km_keyname(c));
 }
 
+__noreturn static void print_help_and_die(void)
+{
+       struct ggo_help h = DEFINE_GGO_HELP(gui);
+       bool d = conf.detailed_help_given;
+
+       ggo_print_help(&h, d? GPH_STANDARD_FLAGS_DETAILED : GPH_STANDARD_FLAGS);
+       exit(0);
+}
+
 int main(int argc, char *argv[])
 {
        int ret;
@@ -1523,7 +1527,10 @@ int main(int argc, char *argv[])
        _argv = argv;
 
        gui_cmdline_parser(argc, argv, &conf); /* exits on errors */
-       HANDLE_VERSION_FLAG("gui", conf);
+       loglevel = get_loglevel_by_name(conf.loglevel_arg);
+       version_handle_flag("gui", conf.version_given);
+       if (conf.help_given || conf.detailed_help_given)
+               print_help_and_die();
        cf = configfile_exists();
        if (!cf && conf.config_file_given) {
                fprintf(stderr, "can not read config file %s\n",
@@ -1538,16 +1545,14 @@ int main(int argc, char *argv[])
                        .check_ambiguity = 0,
                        .print_errors = 1,
                };
-               if (gui_cmdline_parser_config_file(cf, &conf, &params) != 0)
-                       exit(EXIT_FAILURE);
+               gui_cmdline_parser_config_file(cf, &conf, &params);
+               loglevel = get_loglevel_by_name(conf.loglevel_arg);
        }
-       loglevel = get_loglevel_by_name(conf.loglevel_arg);
        if (check_key_map_args() < 0) {
                fprintf(stderr, "invalid key map\n");
                exit(EXIT_FAILURE);
        }
        init_theme_or_die(conf.theme_arg, &theme);
-       top.lines = theme.top_lines_default;
        setup_signal_handling();
        bot_win_rb = ringbuffer_new(RINGBUFFER_SIZE);
        setlocale(LC_CTYPE, "");