]> git.tuebingen.mpg.de Git - paraslash.git/blobdiff - gui.c
gui: Make curses_log() work also when curses is not active.
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index c467845251d72b74bdaa3ce0b270532fecb69aaa..6e3c3e1edf36549917a17bd58511692d8bed7d8b 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -49,7 +49,6 @@ static struct ringbuffer *bot_win_rb;
 
 static unsigned scroll_position;
 
-static bool curses_active;
 static pid_t cmd_pid;
 
 static int command_fds[2] = {-1, -1};
@@ -85,9 +84,6 @@ struct gui_command {
 
 static struct gui_theme theme;
 
-static int _argc;
-static char **_argv;
-
 static void com_help(void);
 static void com_reread_conf(void);
 static void com_enlarge_top_win(void);
@@ -207,6 +203,12 @@ static int find_cmd_byname(char *name)
        return -1;
 }
 
+/* isendwin() returns false before initscr() was called */
+static bool curses_active(void)
+{
+       return top.win && !isendwin();
+}
+
 /* taken from mutt */
 static char *km_keyname(int c)
 {
@@ -345,7 +347,7 @@ __printf_2_3 static void print_in_bar(int color, const char *fmt,...)
        char *msg;
        va_list ap;
 
-       if (!curses_active)
+       if (!curses_active())
                return;
        wattron(in.win, COLOR_PAIR(color));
        va_start(ap, fmt);
@@ -381,7 +383,6 @@ static int first_visible_rbe(unsigned *lines)
                int rbe_lines;
                if (!rbe)
                        return i - 1;
-//             fprintf(stderr, "found: %s\n", rbe->msg);
                rbe_lines = NUM_LINES(rbe->len);
                if (rbe_lines > bot.lines)
                        return -1;
@@ -465,7 +466,6 @@ static void rb_add_entry(int color, char *msg)
        new->len = len;
        new->msg = msg;
        old = ringbuffer_add(bot_win_rb, new);
-//     fprintf(stderr, "added: %s\n", new->msg);
        if (old) {
                free(old->msg);
                free(old);
@@ -491,7 +491,7 @@ __printf_2_3 static void outputf(int color, const char* fmt,...)
        char *msg;
        va_list ap;
 
-       if (!curses_active)
+       if (!curses_active())
                return;
        va_start(ap, fmt);
        xvasprintf(&msg, fmt, ap);
@@ -504,7 +504,7 @@ static int add_output_line(char *line, void *data)
 {
        int color = *(int *)data? COLOR_ERRMSG : COLOR_OUTPUT;
 
-       if (!curses_active)
+       if (!curses_active())
                return 1;
        rb_add_entry(color, para_strdup(line));
        return 1;
@@ -514,29 +514,22 @@ static int loglevel;
 
 static __printf_2_3 void curses_log(int ll, const char *fmt,...)
 {
-       int color;
-       char *msg;
        va_list ap;
-       unsigned bytes;
 
-       if (ll < loglevel || !curses_active)
+       if (ll < loglevel)
                return;
-       switch (ll) {
-               case LL_DEBUG:
-               case LL_INFO:
-               case LL_NOTICE:
-                       color = COLOR_MSG;
-                       break;
-               default:
-                       color = COLOR_ERRMSG;
-       }
        va_start(ap, fmt);
-       bytes = xvasprintf(&msg, fmt, ap);
+       if (curses_active()) {
+               int color = ll <= LL_NOTICE? COLOR_MSG : COLOR_ERRMSG;
+               char *msg;
+               unsigned bytes = xvasprintf(&msg, fmt, ap);
+               if (bytes > 0 && msg[bytes - 1] == '\n')
+                       msg[bytes - 1] = '\0'; /* cut trailing newline */
+               rb_add_entry(color, msg);
+               wrefresh(bot.win);
+       } else if (cmd_pid <= 0) /* no external command running */
+               vfprintf(stderr, fmt, ap);
        va_end(ap);
-       if (bytes > 0 && msg[bytes - 1] == '\n')
-               msg[bytes - 1] = '\0'; /* cut trailing newline */
-       rb_add_entry(color, msg);
-       wrefresh(bot.win);
 }
 __printf_2_3 void (*para_log)(int, const char*, ...) = curses_log;
 
@@ -560,10 +553,7 @@ __noreturn static void kill_pg_and_die(int ret)
 
 static void shutdown_curses(void)
 {
-       if (!curses_active)
-               return;
        def_prog_mode();
-       curses_active = false;
        endwin();
 }
 
@@ -666,7 +656,7 @@ static void print_stat_item(int i)
        struct stat_item_data d = theme.data[i];
        char *c = stat_content[i];
 
-       if (!curses_active || !d.len || !c)
+       if (!curses_active() || !d.len || !c)
                return;
        tmp = make_message("%s%s%s", d.prefix, c, d.postfix);
        wmove(top.win, d.y * top.lines / 100, d.x * COLS / 100);
@@ -745,7 +735,7 @@ static void print_all_items(void)
 {
        int i;
 
-       if (!curses_active)
+       if (!curses_active())
                return;
        FOR_EACH_STATUS_ITEM(i)
                print_stat_item(i);
@@ -792,7 +782,8 @@ static void init_colors_or_die(void)
 /* (Re-)initialize the curses library. */
 static void init_curses(void)
 {
-       curses_active = true;
+       if (curses_active())
+               return;
        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)
@@ -890,7 +881,7 @@ static void handle_signal(int sig)
                        "only the good die young (caught SIGTERM))\n");
                return;
        case SIGWINCH:
-               if (curses_active) {
+               if (curses_active()) {
                        shutdown_curses();
                        init_curses();
                        redraw_bot_win();
@@ -1247,7 +1238,6 @@ static void com_scroll_up(void)
                        break;
                rbe_lines = NUM_LINES(rbe->len);
                lines += rbe_lines;
-//             fprintf(stderr, "msg: %s\n", rbe->msg);
                wattron(bot.win, COLOR_PAIR(rbe->color));
                waddstr(bot.win, "\n");
                waddstr(bot.win, rbe->msg);
@@ -1303,7 +1293,6 @@ static void com_reread_conf(void)
                return;
        }
        PARA_INFO_LOG("rereading command line options and config file\n");
-       gui_cmdline_parser_ext(_argc, _argv, &conf, &params);
        /*
         * Despite .print_errors is set to 0, gengetopt will print to stderr
         * anyway, and exit on errors. So we have to shutdown curses first.
@@ -1360,7 +1349,6 @@ static void com_shrink_top_win(void)
                return;
        }
        init_wins(top.lines - 1);
-       wclear(top.win);
        print_all_items();
        print_in_bar(COLOR_MSG, "%s", "decreased top window");
 }
@@ -1372,7 +1360,6 @@ static void com_enlarge_top_win(void)
                return;
        }
        init_wins(top.lines + 1);
-       wclear(top.win);
        print_all_items();
        print_in_bar(COLOR_MSG, "increased top window");
 }
@@ -1461,20 +1448,15 @@ int main(int argc, char *argv[])
        int ret;
        char *cf;
 
-       _argc = argc;
-       _argv = argv;
-
        gui_cmdline_parser(argc, argv, &conf); /* exits on errors */
        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",
+       if (!cf && conf.config_file_given)
+               msg_n_exit(EXIT_FAILURE, "can not read config file %s\n",
                        conf.config_file_arg);
-               exit(EXIT_FAILURE);
-       }
        if (cf) {
                struct gui_cmdline_parser_params params = {
                        .override = 0,
@@ -1486,10 +1468,8 @@ 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) {
-               fprintf(stderr, "invalid key map\n");
-               exit(EXIT_FAILURE);
-       }
+       if (check_key_map_args() < 0)
+               msg_n_exit(EXIT_FAILURE, "invalid key map\n");
        theme_init(conf.theme_arg, &theme);
        setup_signal_handling();
        bot_win_rb = ringbuffer_new(RINGBUFFER_SIZE);