X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gui.c;h=6eea455fdcd6175c4c4615c27b280e794be3a907;hp=70981e898ba7de929d56a8ee448cbbeff10040c3;hb=e5d3cf2538f6fcb6a6f5271736c5e5b3dea4e7b1;hpb=40659c0bb0602d4f2268bad6d2579d86e1b62289 diff --git a/gui.c b/gui.c index 70981e89..6eea455f 100644 --- a/gui.c +++ b/gui.c @@ -1033,6 +1033,111 @@ static int command_post_select(int mode, fd_set *rfds) return 1; } +static int do_select(int mode); + +/* read from command pipe and print data to bot window */ +static void exec_and_display_cmd(const char *cmd) +{ + int ret, fds[3] = {0, 1, 1}; + + outputf(COLOR_COMMAND, "%s", cmd); + ret = para_exec_cmdline_pid(&cmd_pid, cmd, fds); + if (ret < 0) + return; + ret = mark_fd_nonblocking(fds[1]); + if (ret < 0) + goto fail; + ret = mark_fd_nonblocking(fds[2]); + if (ret < 0) + goto fail; + command_fds[0] = fds[1]; + command_fds[1] = fds[2]; + if (do_select(COMMAND_MODE) >= 0) + PARA_INFO_LOG("command complete\n"); + else + PARA_NOTICE_LOG("command aborted\n"); + print_in_bar(COLOR_MSG, " "); + return; +fail: + PARA_ERROR_LOG("%s\n", para_strerror(-ret)); + close(command_fds[0]); + close(command_fds[1]); +} + +static void para_cmd(char *cmd) +{ + char *c; + + print_in_bar(COLOR_MSG, "executing client command, hit any key to abort\n"); + c = make_message(BINDIR "/para_client -- %s", cmd); + exec_and_display_cmd(c); + free(c); +} + +static void display_cmd(char *cmd) +{ + print_in_bar(COLOR_MSG, "executing display command, hit any key to abort"); + exec_and_display_cmd(cmd); +} + +/* + * shutdown curses and stat pipe before executing external commands + */ +static void external_cmd(char *cmd) +{ + int fds[3] = {-1, -1, -1}; + + if (cmd_pid) + return; + shutdown_curses(); + if (para_exec_cmdline_pid(&cmd_pid, cmd, fds) < 0) + return; + do_select(EXTERNAL_MODE); + init_curses(); +} + +static void handle_command(int c) +{ + int i; + + /* first check user-defined key bindings */ + for (i = 0; i < conf.key_map_given; ++i) { + char *tmp, *handler, *arg; + + tmp = para_strdup(conf.key_map_arg[i]); + if (!split_key_map(tmp, &handler, &arg)) { + free(tmp); + return; + } + if (strcmp(tmp, km_keyname(c))) { + free(tmp); + continue; + } + if (*handler == 'd') + display_cmd(arg); + else if (*handler == 'x') + external_cmd(arg); + else if (*handler == 'p') + para_cmd(arg); + else if (*handler == 'i') { + int num = find_cmd_byname(arg); + if (num >= 0) + command_list[num].handler(); + } + free(tmp); + return; + } + /* not found, check internal key bindings */ + for (i = 0; command_list[i].handler; i++) { + if (!strcmp(km_keyname(c), command_list[i].key)) { + command_list[i].handler(); + return; + } + } + print_in_bar(COLOR_ERRMSG, "key '%s' is not bound, press ? for help", + km_keyname(c)); +} + static void input_pre_select(int mode, fd_set *rfds, int *max_fileno) { if (mode == GETCH_MODE || mode == COMMAND_MODE) @@ -1116,67 +1221,6 @@ check_return: goto repeat; } -/* read from command pipe and print data to bot window */ -static void exec_and_display_cmd(const char *cmd) -{ - int ret, fds[3] = {0, 1, 1}; - - outputf(COLOR_COMMAND, "%s", cmd); - ret = para_exec_cmdline_pid(&cmd_pid, cmd, fds); - if (ret < 0) - return; - ret = mark_fd_nonblocking(fds[1]); - if (ret < 0) - goto fail; - ret = mark_fd_nonblocking(fds[2]); - if (ret < 0) - goto fail; - command_fds[0] = fds[1]; - command_fds[1] = fds[2]; - if (do_select(COMMAND_MODE) >= 0) - PARA_INFO_LOG("command complete\n"); - else - PARA_NOTICE_LOG("command aborted\n"); - print_in_bar(COLOR_MSG, " "); - return; -fail: - PARA_ERROR_LOG("%s\n", para_strerror(-ret)); - close(command_fds[0]); - close(command_fds[1]); -} - -static void para_cmd(char *cmd) -{ - char *c; - - print_in_bar(COLOR_MSG, "executing client command, hit any key to abort\n"); - c = make_message(BINDIR "/para_client -- %s", cmd); - exec_and_display_cmd(c); - free(c); -} - -static void display_cmd(char *cmd) -{ - print_in_bar(COLOR_MSG, "executing display command, hit any key to abort"); - exec_and_display_cmd(cmd); -} - -/* - * shutdown curses and stat pipe before executing external commands - */ -static void external_cmd(char *cmd) -{ - int fds[3] = {-1, -1, -1}; - - if (cmd_pid) - return; - shutdown_curses(); - if (para_exec_cmdline_pid(&cmd_pid, cmd, fds) < 0) - return; - do_select(EXTERNAL_MODE); - init_curses(); -} - static void print_scroll_msg(void) { unsigned lines_total, filled = ringbuffer_filled(bot_win_rb); @@ -1436,48 +1480,6 @@ static void com_prev_theme(void) com_refresh(); } -static void handle_command(int c) -{ - int i; - - /* first check user-defined key bindings */ - for (i = 0; i < conf.key_map_given; ++i) { - char *tmp, *handler, *arg; - - tmp = para_strdup(conf.key_map_arg[i]); - if (!split_key_map(tmp, &handler, &arg)) { - free(tmp); - return; - } - if (strcmp(tmp, km_keyname(c))) { - free(tmp); - continue; - } - if (*handler == 'd') - display_cmd(arg); - else if (*handler == 'x') - external_cmd(arg); - else if (*handler == 'p') - para_cmd(arg); - else if (*handler == 'i') { - int num = find_cmd_byname(arg); - if (num >= 0) - command_list[num].handler(); - } - free(tmp); - return; - } - /* not found, check internal key bindings */ - for (i = 0; command_list[i].handler; i++) { - if (!strcmp(km_keyname(c), command_list[i].key)) { - command_list[i].handler(); - return; - } - } - print_in_bar(COLOR_ERRMSG, "key '%s' is not bound, press ? for help", - km_keyname(c)); -} - __noreturn static void print_help_and_die(void) { struct ggo_help h = DEFINE_GGO_HELP(gui);