X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gui.c;h=4862df5ed9595459e8beed9cfa76946f71c54f9d;hp=d8e200342fc991380445b6fa120ac2d2560bb05e;hb=36bc7580a5ddee8f6e46bccfea7519291f372f0f;hpb=2c679eeb8bbc93220f85403eca6e9380dc624a6a diff --git a/gui.c b/gui.c index d8e20034..4862df5e 100644 --- a/gui.c +++ b/gui.c @@ -1,20 +1,20 @@ /* - * Copyright (C) 1998-2007 Andre Noll + * Copyright (C) 1998-2009 Andre Noll * * 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 #include #include - #include "gui.cmdline.h" #include "para.h" #include "gui.h" +#include "string.h" #include #include "ringbuffer.h" -#include "gui_common.h" #include "fd.h" #include "error.h" #include "list.h" @@ -23,15 +23,12 @@ /** 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]; #define STANDARD_STATUS_BAR "para_gui " PACKAGE_VERSION " (hit ? for help)" static int signal_pipe; -static void finish(int sig); - static struct win_data { WINDOW *win; NCURSES_SIZE_T begx; @@ -46,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; @@ -61,15 +58,15 @@ static struct gui_args_info conf; enum {GETCH_MODE, COMMAND_MODE, EXTERNAL_MODE}; -#define COLOR_STATUSBAR 32 -#define COLOR_COMMAND 33 -#define COLOR_OUTPUT 34 -#define COLOR_MSG 35 -#define COLOR_ERRMSG 36 -#define COLOR_WELCOME 37 -#define COLOR_SEPARATOR 38 -#define COLOR_TOP 39 -#define COLOR_BOT 40 +#define COLOR_STATUSBAR 52 +#define COLOR_COMMAND 53 +#define COLOR_OUTPUT 54 +#define COLOR_MSG 55 +#define COLOR_ERRMSG 56 +#define COLOR_WELCOME 57 +#define COLOR_SEPARATOR 58 +#define COLOR_TOP 59 +#define COLOR_BOT 60 struct gui_command { const char *key; @@ -192,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; @@ -460,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: @@ -490,11 +521,11 @@ static void setup_signal_handling(void) para_install_sighandler(SIGCHLD); para_install_sighandler(SIGWINCH); para_install_sighandler(SIGUSR1); - signal(SIGPIPE, SIG_IGN); +// signal(SIGPIPE, SIG_IGN); signal(SIGHUP, SIG_IGN); } -static void do_exit(int ret) +__noreturn static void do_exit(int ret) { signal(SIGTERM, SIG_IGN); kill(0, SIGTERM); @@ -510,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); @@ -519,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; @@ -533,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); @@ -650,7 +680,6 @@ static void print_stat_item(int i) if (!curses_active || !d.len || !c) return; tmp = make_message("%s%s%s", d.prefix, c, d.postfix); -// PARA_DEBUG_LOG("%s: read: %s\n", __func__, tmp); wmove(top.win, d.y * top.lines / 100, d.x * COLS / 100); wrefresh(top.win); wattron(top.win, COLOR_PAIR(i + 1)); @@ -665,14 +694,15 @@ static void print_all_items(void) if (!curses_active) return; - for (i = 0; i < NUM_STAT_ITEMS; i++) + FOR_EACH_STATUS_ITEM(i) print_stat_item(i); } + static void clear_all_items(void) { int i; - for (i = 0; i < NUM_STAT_ITEMS; i++) { + FOR_EACH_STATUS_ITEM(i) { free(stat_content[i]); stat_content[i] = para_strdup(""); } @@ -681,10 +711,11 @@ static void clear_all_items(void) static void init_colors(void) { int i; + if (!has_colors()) msg_n_exit(EXIT_FAILURE, "Error: No color term\n"); start_color(); - for (i = 0; i < NUM_STAT_ITEMS; i++) + FOR_EACH_STATUS_ITEM(i) if (theme.data[i].len) init_pair(i + 1, theme.data[i].fg, theme.data[i].bg); init_pair(COLOR_STATUSBAR, theme.sb_fg, theme.sb_bg); @@ -726,10 +757,11 @@ static void init_curses(void) static void check_sigchld(void) { + int ret; pid_t pid; reap_next_child: - pid = para_reap_child(); - if (pid <= 0) + ret = para_reap_child(&pid); + if (ret <= 0) return; if (pid == cmd_pid) { cmd_pid = 0; @@ -749,6 +781,8 @@ static int check_stat_line(char *line, __a_unused void *data) i = stat_line_valid(line); if (i >= 0) { line += strlen(status_item_list[i]) + 1; + if (*line == ' ') + line++; free(stat_content[i]); stat_content[i] = para_strdup(line); print_stat_item(i); @@ -825,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: @@ -862,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) @@ -917,8 +951,8 @@ repeat: close(audiod_pipe); audiod_pipe = -1; clear_all_items(); - free(stat_content[SI_STATUS_BAR]); - stat_content[SI_STATUS_BAR] = + free(stat_content[SI_BASENAME]); + stat_content[SI_BASENAME] = para_strdup("audiod not running!?"); print_all_items(); } @@ -963,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; } @@ -976,7 +1017,7 @@ static int send_output(void) static int client_cmd_cmdline(char *cmd) { int ret, fds[3] = {0, 1, 0}; - char *c = make_message(BINDIR "/para_client %s", cmd); + char *c = make_message(BINDIR "/para_client -- %s", cmd); outputf(COLOR_COMMAND, "%s", c); print_in_bar(COLOR_MSG, "executing client command, hit any key to abort\n"); @@ -985,7 +1026,6 @@ static int client_cmd_cmdline(char *cmd) if (ret < 0) return -1; command_pipe = fds[1]; - mark_fd_nonblock(command_pipe); return send_output(); } @@ -1001,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_nonblock(command_pipe); return send_output(); } @@ -1130,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); } /* @@ -1164,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, ¶ms); - PARA_NOTICE_LOG("%s", "config file reloaded"); + PARA_NOTICE_LOG("config file reloaded"); if (check_key_map_args() < 0) finish(EXIT_FAILURE); } @@ -1215,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); @@ -1227,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); @@ -1242,7 +1281,7 @@ static void com_version(void) CODENAME "\""); } -static void com_quit(void) +__noreturn static void com_quit(void) { finish(0); } @@ -1353,6 +1392,7 @@ int main(int argc, char *argv[]) }; gui_cmdline_parser_config_file(cf, &conf, ¶ms); } + 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);