more small audiod cleanups.
[paraslash.git] / gui.c
diff --git a/gui.c b/gui.c
index 351748e43a3fe2a93886820871b8a6411d5f9d40..49f8f46f523742eab96346103830b5dadc9b3416 100644 (file)
--- a/gui.c
+++ b/gui.c
 
 #include "gui.cmdline.h"
 #include "para.h"
 
 #include "gui.cmdline.h"
 #include "para.h"
-#include "gcc-compat.h"
 #include <curses.h>
 #include "ringbuffer.h"
 #include "string.h"
 #include <curses.h>
 #include "ringbuffer.h"
 #include "string.h"
+#include "fd.h"
+#include "error.h"
 
 
+/** define the array of error lists needed by para_gui */
+INIT_GUI_ERRLISTS;
 extern const char *status_item_list[NUM_STAT_ITEMS];
 static char *stat_content[NUM_STAT_ITEMS];
 
 extern const char *status_item_list[NUM_STAT_ITEMS];
 static char *stat_content[NUM_STAT_ITEMS];
 
@@ -74,9 +77,9 @@ enum {GETCH_MODE, COMMAND_MODE, EXTERNAL_MODE};
 #define COLOR_BOT 40
 
 struct gui_command {
 #define COLOR_BOT 40
 
 struct gui_command {
-       char *key;
-       char *name;
-       char *description;
+       const char *key;
+       const char *name;
+       const char *description;
        void (*handler)(void);
 };
 
        void (*handler)(void);
 };
 
@@ -285,7 +288,7 @@ static void add_spaces(WINDOW* win, unsigned int num)
  * print aligned string to curses window. This function always prints
  * exactly len chars.
  */
  * print aligned string to curses window. This function always prints
  * exactly len chars.
  */
-static int align_str(WINDOW* win, char *string, unsigned int len,
+static int align_str(WINDOW* win, const char *string, unsigned int len,
                unsigned int align)
 {
        int num; /* of spaces */
                unsigned int align)
 {
        int num; /* of spaces */
@@ -314,7 +317,7 @@ static int align_str(WINDOW* win, char *string, unsigned int len,
        return 1;
 }
 
        return 1;
 }
 
-__printf_2_3 static void print_in_bar(int color, char *fmt,...)
+__printf_2_3 static void print_in_bar(int color, const char *fmt,...)
 {
        char *msg;
 
 {
        char *msg;
 
@@ -443,7 +446,7 @@ static void rb_add_entry(int color, char *msg)
 /*
  * print formated output to bot win and refresh
  */
 /*
  * print formated output to bot win and refresh
  */
-__printf_2_3 static void outputf(int color, char* fmt,...)
+__printf_2_3 static void outputf(int color, const char* fmt,...)
 {
        char *msg;
 
 {
        char *msg;
 
@@ -461,7 +464,7 @@ static void add_output_line(char *line)
        rb_add_entry(COLOR_OUTPUT, para_strdup(line));
 }
 
        rb_add_entry(COLOR_OUTPUT, para_strdup(line));
 }
 
-void para_log(int ll, char *fmt,...)
+void para_log(int ll, const char *fmt,...)
 {
        int color;
        char *msg;
 {
        int color;
        char *msg;
@@ -520,7 +523,7 @@ static void finish(int ret)
 /*
  * exit curses and print given message to stdout/stderr
  */
 /*
  * exit curses and print given message to stdout/stderr
  */
-__printf_2_3 static void msg_n_exit(int ret, char* fmt, ...)
+__printf_2_3 static void msg_n_exit(int ret, const char* fmt, ...)
 {
        va_list argp;
        FILE *outfd = ret? stderr: stdout;
 {
        va_list argp;
        FILE *outfd = ret? stderr: stdout;
@@ -841,25 +844,17 @@ static void handle_signal(int sig)
        }
 }
 
        }
 }
 
-/* open pipe if last attempt to open was more than 2 secs ago */
 static int open_audiod_pipe(void)
 {
 static int open_audiod_pipe(void)
 {
-       static time_t open_time, *p;
-       time_t now;
-       double diff;
-
-       if (p) {
-               time(&now);
-               diff = difftime(now, open_time);
-               if (diff < 2)
-                       return -1;
-       } else
-               p = &open_time;
-       time(&open_time);
+       static int init = 1;
+
+       if (init)
+               init = 0;
+       else
+               sleep(1);
        return para_open_audiod_pipe(conf.stat_cmd_arg);
 }
 
        return para_open_audiod_pipe(conf.stat_cmd_arg);
 }
 
-
 /*
  * This is the core select loop. Besides the (internal) signal
  * pipe, the following other fds are checked according to the mode:
 /*
  * This is the core select loop. Besides the (internal) signal
  * pipe, the following other fds are checked according to the mode:
@@ -891,31 +886,25 @@ repeat:
        /* audiod pipe */
        if (audiod_pipe < 0)
                audiod_pipe = open_audiod_pipe();
        /* audiod pipe */
        if (audiod_pipe < 0)
                audiod_pipe = open_audiod_pipe();
-       if (audiod_pipe >= 0) {
-               FD_SET(audiod_pipe, &rfds);
-               max_fileno = MAX(max_fileno, audiod_pipe);
-       }
-
+       if (audiod_pipe >= 0)
+               para_fd_set(audiod_pipe, &rfds, &max_fileno);
        /* signal pipe */
        /* signal pipe */
-       FD_SET(signal_pipe, &rfds);
-       max_fileno = MAX(max_fileno, signal_pipe);
+       para_fd_set(signal_pipe, &rfds, &max_fileno);
        /* command pipe only for COMMAND_MODE */
        /* command pipe only for COMMAND_MODE */
-       if (command_pipe >= 0 && mode == COMMAND_MODE) {
-               FD_SET(command_pipe, &rfds);
-               max_fileno = MAX(max_fileno, command_pipe);
-       }
-       FD_SET(STDIN_FILENO, &rfds);
-       ret = select(max_fileno + 1, &rfds, NULL, NULL, &tv);
+       if (command_pipe >= 0 && mode == COMMAND_MODE)
+               para_fd_set(command_pipe, &rfds, &max_fileno);
+       if (curses_active)
+               para_fd_set(STDIN_FILENO, &rfds, &max_fileno);
+       ret = para_select(max_fileno + 1, &rfds, NULL, &tv);
 //     PARA_DEBUG_LOG("select returned %d\n", ret);
 //     PARA_DEBUG_LOG("select returned %d\n", ret);
-
+       if (ret <= 0)
+               goto check_return; /* skip fd checks */
        /* signals */
        if (FD_ISSET(signal_pipe, &rfds)) {
                int sig_nr = para_next_signal();
                if (sig_nr > 0)
                        handle_signal(sig_nr);
        }
        /* signals */
        if (FD_ISSET(signal_pipe, &rfds)) {
                int sig_nr = para_next_signal();
                if (sig_nr > 0)
                        handle_signal(sig_nr);
        }
-       if (ret <= 0)
-               goto check_return; /* skip fd checks */
        /* read command pipe if ready */
        if (command_pipe >= 0 && mode == COMMAND_MODE &&
                        FD_ISSET(command_pipe, &rfds)) {
        /* read command pipe if ready */
        if (command_pipe >= 0 && mode == COMMAND_MODE &&
                        FD_ISSET(command_pipe, &rfds)) {
@@ -936,10 +925,9 @@ repeat:
                        audiod_pipe = -1;
                        clear_all_items();
                        free(stat_content[SI_STATUS_BAR]);
                        audiod_pipe = -1;
                        clear_all_items();
                        free(stat_content[SI_STATUS_BAR]);
-                       stat_content[SI_STATUS_BAR] = 
-                               para_strdup("audiod not running!?\n");
+                       stat_content[SI_STATUS_BAR] =
+                               para_strdup("audiod not running!?");
                        print_all_items();
                        print_all_items();
-                       sleep(1);
                }
 check_return:
        switch (mode) {
                }
 check_return:
        switch (mode) {
@@ -947,7 +935,7 @@ check_return:
                if (cp_numread <= 0 && !cbo) /* command complete */
                        return 0;
                if (cbo)
                if (cp_numread <= 0 && !cbo) /* command complete */
                        return 0;
                if (cbo)
-                       cbo = for_each_line(command_buf, cbo, &add_output_line, 0);
+                       cbo = for_each_line(command_buf, cbo, &add_output_line);
                if (cp_numread <= 0)
                        cbo = 0;
                wrefresh(bot.win);
                if (cp_numread <= 0)
                        cbo = 0;
                wrefresh(bot.win);
@@ -1181,24 +1169,26 @@ static void com_help(void)
        int i;
 
        for (i = 0; i < conf.key_map_given; ++i) {
        int i;
 
        for (i = 0; i < conf.key_map_given; ++i) {
-               char *s = conf.key_map_arg[i], *handler, *arg,
-                       *desc = "", tmp[MAXLINE];
+               char *handler, *arg, *tmp = para_strdup(conf.key_map_arg[i]);
+               const char *handler_text = "???", *desc = NULL;
 
 
-               strcpy(tmp, s);
-               if (!split_key_map(tmp, &handler, &arg))
+               if (!split_key_map(tmp, &handler, &arg)) {
+                       free(tmp);
                        return;
                        return;
-               switch(*handler) {
+               }
+               switch (*handler) {
                        case 'i':
                        case 'i':
-                               handler = "internal";
+                               handler_text = "internal";
                                desc = command_list[find_cmd_byname(arg)].description;
                                break;
                                desc = command_list[find_cmd_byname(arg)].description;
                                break;
-                       case 'x': handler = "external"; break;
-                       case 'd': handler = "display "; break;
-                       case 'p': handler = "para    "; break;
+                       case 'x': handler_text = "external"; break;
+                       case 'd': handler_text = "display "; break;
+                       case 'p': handler_text = "para    "; break;
                }
                }
-               outputf(COLOR_MSG, "%s\t%s\t%s%s\t%s", tmp, handler, arg,
+               outputf(COLOR_MSG, "%s\t%s\t%s%s\t%s", tmp, handler_text, arg,
                        strlen(arg) < 8? "\t" : "",
                        strlen(arg) < 8? "\t" : "",
-                       desc);
+                       desc? desc : "");
+               free(tmp);
        }
        for (i = 0; command_list[i].handler; i++) {
                struct gui_command gc = command_list[i];
        }
        for (i = 0; command_list[i].handler; i++) {
                struct gui_command gc = command_list[i];
@@ -1209,7 +1199,6 @@ static void com_help(void)
        }
        print_in_bar(COLOR_MSG, "try \"para_gui -h\" or \"para_client help\" "
                "for more info");
        }
        print_in_bar(COLOR_MSG, "try \"para_gui -h\" or \"para_client help\" "
                "for more info");
-       return;
 }
 
 static void com_shrink_top_win(void)
 }
 
 static void com_shrink_top_win(void)