fecdec: Minor cleanups.
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index 0cb4b74afd0d616afedb06ec18fdc4f3329fc9d2..4862df5ed9595459e8beed9cfa76946f71c54f9d 100644 (file)
--- a/gui.c
+++ b/gui.c
@@ -1,10 +1,10 @@
 /*
- * Copyright (C) 1998-2007 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1998-2009 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
 
-/** \file gui.c ncurses-based interface for paraslash */
+/** \file gui.c Curses-based interface for paraslash. */
 
 #include <signal.h>
 #include <sys/types.h>
@@ -12,9 +12,9 @@
 #include "gui.cmdline.h"
 #include "para.h"
 #include "gui.h"
+#include "string.h"
 #include <curses.h>
 #include "ringbuffer.h"
-#include "gui_common.h"
 #include "fd.h"
 #include "error.h"
 #include "list.h"
@@ -29,8 +29,6 @@ static char *stat_content[NUM_STAT_ITEMS];
 
 static int signal_pipe;
 
-static void finish(int sig);
-
 static struct win_data {
        WINDOW *win;
        NCURSES_SIZE_T begx;
@@ -45,7 +43,7 @@ struct rb_entry {
        size_t len;
        int color;
 };
-void *bot_win_rb;
+struct ringbuffer *bot_win_rb;
 #define NUM_LINES(len) (1 + (len) / bot.cols)
 
 static unsigned scroll_position;
@@ -191,6 +189,38 @@ struct gui_command command_list[] = {
        }
 };
 
+static int para_open_audiod_pipe(char *cmd)
+{
+       int fds[3] = {0, 1, 0};
+       pid_t pid;
+       int ret = para_exec_cmdline_pid(&pid, cmd, fds);
+       if (ret < 0)
+               return ret;
+       ret = mark_fd_nonblocking(fds[1]);
+       if (ret > 0)
+               return fds[1];
+       close(fds[1]);
+       return ret;
+}
+
+static int read_audiod_pipe(int fd, line_handler_t *line_handler)
+{
+       static char buf[4096];
+       const ssize_t bufsize = sizeof(buf) - 1;
+       static ssize_t loaded;
+       ssize_t ret;
+
+       if (loaded >= bufsize)
+               loaded = 0;
+       ret = read(fd, buf + loaded, bufsize - loaded);
+       if (ret > 0) {
+               loaded += ret;
+               buf[loaded] = '\0';
+               loaded = for_each_line(buf, loaded, line_handler, NULL);
+       }
+       return ret;
+}
+
 static int find_cmd_byname(char *name)
 {
        int i;
@@ -459,17 +489,19 @@ static int add_output_line(char *line, __a_unused void *data)
        return 1;
 }
 
-void para_log(int ll, const char *fmt,...)
+static int loglevel;
+
+__printf_2_3 void para_log(int ll, const char *fmt,...)
 {
        int color;
        char *msg;
 
-       if (ll < conf.loglevel_arg || !curses_active)
+       if (ll < loglevel || !curses_active)
                return;
        switch (ll) {
-               case DEBUG:
-               case INFO:
-               case NOTICE:
+               case LL_DEBUG:
+               case LL_INFO:
+               case LL_NOTICE:
                        color = COLOR_MSG;
                        break;
                default:
@@ -493,7 +525,7 @@ static void setup_signal_handling(void)
        signal(SIGHUP, SIG_IGN);
 }
 
-static void do_exit(int ret)
+__noreturn static void do_exit(int ret)
 {
        signal(SIGTERM, SIG_IGN);
        kill(0, SIGTERM);
@@ -509,7 +541,7 @@ static void shutdown_curses(void)
        endwin();
 }
 
-static void finish(int ret)
+__noreturn static void finish(int ret)
 {
        shutdown_curses();
        do_exit(ret);
@@ -518,7 +550,7 @@ static void finish(int ret)
 /*
  * exit curses and print given message to stdout/stderr
  */
-__printf_2_3 static void msg_n_exit(int ret, const char* fmt, ...)
+__noreturn __printf_2_3 static void msg_n_exit(int ret, const char* fmt, ...)
 {
        va_list argp;
        FILE *outfd = ret? stderr: stdout;
@@ -532,8 +564,7 @@ __printf_2_3 static void msg_n_exit(int ret, const char* fmt, ...)
 
 static void print_welcome(void)
 {
-       int ll = conf.loglevel_arg;
-       if (ll > NOTICE)
+       if (loglevel > LL_NOTICE)
                return;
        outputf(COLOR_WELCOME, "Welcome to para_gui " PACKAGE_VERSION
                " \"" CODENAME "\". Theme: %s", theme.name);
@@ -828,13 +859,13 @@ static void handle_signal(int sig)
                }
                return;
        case SIGINT:
-               PARA_WARNING_LOG("%s", "caught SIGINT, reset");
+               PARA_WARNING_LOG("caught SIGINT, reset");
                /* Nothing to do. SIGINT killed our child, para_client stat.
                 * This get noticed by do_select which resets everything
                 */
                return;
        case SIGUSR1:
-               PARA_NOTICE_LOG("%s", "got SIGUSR1, rereading configuration");
+               PARA_NOTICE_LOG("got SIGUSR1, rereading configuration");
                com_reread_conf();
                return;
        case SIGCHLD:
@@ -865,7 +896,7 @@ static int open_audiod_pipe(void)
  * when any key is pressed.
  *
  * EXTERNAL_MODE: Check only signal pipe. Used when an external command
- * is running. During that thime curses is disabled.  Returns when
+ * is running. During that time curses is disabled.  Returns when
  * cmd_pid == 0.
  */
 static int do_select(int mode)
@@ -966,12 +997,19 @@ check_return:
  */
 static int send_output(void)
 {
+       int ret;
+
        if (command_pipe < 0)
                return 0;
+       ret = mark_fd_nonblocking(command_pipe);
+       if (ret < 0) {
+               close(command_pipe);
+               return ret;
+       }
        if (do_select(COMMAND_MODE) >= 0)
-               PARA_INFO_LOG("%s", "command complete");
+               PARA_INFO_LOG("command complete");
        else
-               PARA_NOTICE_LOG("%s", "command aborted");
+               PARA_NOTICE_LOG("command aborted");
        print_in_bar(COLOR_MSG, " ");
        return 1;
 }
@@ -988,7 +1026,6 @@ static int client_cmd_cmdline(char *cmd)
        if (ret < 0)
                return -1;
        command_pipe = fds[1];
-       mark_fd_nonblocking(command_pipe);
        return send_output();
 }
 
@@ -1004,7 +1041,6 @@ static int display_cmd(char *cmd)
        if (para_exec_cmdline_pid(&cmd_pid, cmd, fds) < 0)
                return -1;
        command_pipe = fds[1];
-       mark_fd_nonblocking(command_pipe);
        return send_output();
 }
 
@@ -1133,24 +1169,24 @@ err_out:
 
 static void com_ll_decr(void)
 {
-       if (conf.loglevel_arg <= DEBUG) {
+       if (loglevel <= LL_DEBUG) {
                print_in_bar(COLOR_ERRMSG,
                        "loglevel already at maximal verbosity\n");
                return;
        }
-       conf.loglevel_arg--;
-       print_in_bar(COLOR_MSG, "loglevel set to %d\n", conf.loglevel_arg);
+       loglevel--;
+       print_in_bar(COLOR_MSG, "loglevel set to %d\n", loglevel);
 }
 
 static void com_ll_incr(void)
 {
-       if (conf.loglevel_arg >= EMERG) {
+       if (loglevel >= LL_EMERG) {
                print_in_bar(COLOR_ERRMSG,
-                       "loglevel already at miminal verbosity\n");
+                       "loglevel already at minimal verbosity\n");
                return;
        }
-       conf.loglevel_arg++;
-       print_in_bar(COLOR_MSG, "loglevel set to %d\n", conf.loglevel_arg);
+       loglevel++;
+       print_in_bar(COLOR_MSG, "loglevel set to %d\n", loglevel);
 }
 
 /*
@@ -1167,13 +1203,13 @@ static void com_reread_conf(void)
        };
 
        if (!cf) {
-               PARA_WARNING_LOG("%s", "there is no configuration to read");
+               PARA_WARNING_LOG("there is no configuration to read");
                return;
        }
-       PARA_INFO_LOG("%s", "rereading command line options and config file");
+       PARA_INFO_LOG("rereading command line options and config file");
        gui_cmdline_parser(_argc, _argv, &conf);
        gui_cmdline_parser_config_file(cf, &conf, &params);
-       PARA_NOTICE_LOG("%s", "config file reloaded");
+       PARA_NOTICE_LOG("config file reloaded");
        if (check_key_map_args() < 0)
                finish(EXIT_FAILURE);
 }
@@ -1218,7 +1254,7 @@ static void com_help(void)
 static void com_shrink_top_win(void)
 {
        if (top.lines <= theme.top_lines_min) {
-               PARA_WARNING_LOG("%s", "can not decrease top window");
+               PARA_WARNING_LOG("can not decrease top window");
                return;
        }
        init_wins(top.lines - 1);
@@ -1230,7 +1266,7 @@ static void com_shrink_top_win(void)
 static void com_enlarge_top_win(void)
 {
        if (bot.lines < 3) {
-               PARA_WARNING_LOG("%s", "can not increase top window");
+               PARA_WARNING_LOG("can not increase top window");
                return;
        }
        init_wins(top.lines + 1);
@@ -1245,7 +1281,7 @@ static void com_version(void)
                CODENAME "\"");
 }
 
-static void com_quit(void)
+__noreturn static void com_quit(void)
 {
        finish(0);
 }
@@ -1356,6 +1392,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) {
                fprintf(stderr, "invalid key map in config file\n");
                exit(EXIT_FAILURE);