X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gui.c;h=232572914bd9b7ca83038a334a7cff1b3ce2fdaf;hp=351748e43a3fe2a93886820871b8a6411d5f9d40;hb=c430e588047c5db3eb0d043c4dd1378680ec2bcf;hpb=2ed89c59f0efcd0a2763f47c7d3455663241e623 diff --git a/gui.c b/gui.c index 351748e4..23257291 100644 --- a/gui.c +++ b/gui.c @@ -20,11 +20,14 @@ #include "gui.cmdline.h" #include "para.h" -#include "gcc-compat.h" #include #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]; @@ -74,9 +77,9 @@ enum {GETCH_MODE, COMMAND_MODE, EXTERNAL_MODE}; #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); }; @@ -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. */ -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 */ @@ -314,7 +317,7 @@ static int align_str(WINDOW* win, char *string, unsigned int len, 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; @@ -443,7 +446,7 @@ static void rb_add_entry(int color, char *msg) /* * 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; @@ -461,7 +464,7 @@ static void add_output_line(char *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; @@ -520,7 +523,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, char* fmt, ...) +__printf_2_3 static void msg_n_exit(int ret, const char* fmt, ...) { 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 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); } - /* * This is the core select loop. Besides the (internal) signal * pipe, the following other fds are checked according to the mode: @@ -904,18 +899,18 @@ repeat: 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 (curses_active) + FD_SET(STDIN_FILENO, &rfds); + ret = para_select(max_fileno + 1, &rfds, NULL, &tv); // 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); } - 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)) { @@ -936,10 +931,9 @@ repeat: 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(); - sleep(1); } check_return: switch (mode) { @@ -947,7 +941,7 @@ check_return: 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); @@ -1181,24 +1175,26 @@ static void com_help(void) 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; - switch(*handler) { + } + switch (*handler) { case 'i': - handler = "internal"; + handler_text = "internal"; 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" : "", - desc); + desc? desc : ""); + free(tmp); } for (i = 0; command_list[i].handler; i++) { struct gui_command gc = command_list[i]; @@ -1209,7 +1205,6 @@ static void com_help(void) } print_in_bar(COLOR_MSG, "try \"para_gui -h\" or \"para_client help\" " "for more info"); - return; } static void com_shrink_top_win(void)