X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=gui.c;h=a2d3e6cd5b63c5d867d793939dbae219196b6bab;hp=c0588197c553e1728713e0e964c61041eb02e7ef;hb=1404c0dbc7265e42ac81fc1664c724630c3454e4;hpb=c715d5c6ec226fe172ef3b8a52ccf769b745594b diff --git a/gui.c b/gui.c index c0588197..a2d3e6cd 100644 --- a/gui.c +++ b/gui.c @@ -1,30 +1,20 @@ /* - * Copyright (C) 1998-2006 Andre Noll + * Copyright (C) 1998-2007 Andre Noll * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Licensed under the GPL v2. For licencing details see COPYING. */ /** \file gui.c ncurses-based interface for paraslash */ #include "gui.cmdline.h" #include "para.h" +#include "gui.h" #include #include "ringbuffer.h" #include "string.h" #include "fd.h" #include "error.h" +#include "signal.h" /** define the array of error lists needed by para_gui */ INIT_GUI_ERRLISTS; @@ -56,8 +46,8 @@ void *bot_win_rb; static unsigned scroll_position; -static int external_cmd_died, curses_active; -static pid_t external_cmd_pid; +static int cmd_died, curses_active; +static pid_t cmd_pid; static int command_pipe = -1; static int audiod_pipe = -1; @@ -735,9 +725,9 @@ reap_next_child: pid = para_reap_child(); if (pid <= 0) return; - if (pid == external_cmd_pid) { - external_cmd_pid = 0; - external_cmd_died = 1; + if (pid == cmd_pid) { + cmd_pid = 0; + cmd_died = 1; } goto reap_next_child; } @@ -867,14 +857,14 @@ static int open_audiod_pipe(void) * * EXTERNAL_MODE: Check only signal pipe. Used when an external command * is running. During that thime curses is disabled. Returns when - * external_cmd_pid == 0. + * cmd_pid == 0. */ static int do_select(int mode) { fd_set rfds; int ret; int max_fileno, cp_numread = 1; - char command_buf[STRINGSIZE] = ""; + char command_buf[4096] = ""; int cbo = 0; /* command buf offset */ struct timeval tv; repeat: @@ -906,7 +896,7 @@ repeat: if (command_pipe >= 0 && mode == COMMAND_MODE && FD_ISSET(command_pipe, &rfds)) { cp_numread = read(command_pipe, command_buf + cbo, - STRINGSIZE - 1 - cbo); + sizeof(command_buf) - 1 - cbo); if (cp_numread >= 0) cbo += cp_numread; else { @@ -936,6 +926,16 @@ check_return: if (cp_numread <= 0) cbo = 0; wrefresh(bot.win); + ret = wgetch(top.win); + if (ret != ERR && ret != KEY_RESIZE) { + if (command_pipe) { + close(command_pipe); + command_pipe = -1; + } + if (cmd_pid) + kill(cmd_pid, SIGTERM); + return -1; + } break; case GETCH_MODE: ret = wgetch(top.win); @@ -943,8 +943,8 @@ check_return: return ret; break; case EXTERNAL_MODE: - if (external_cmd_died) { - external_cmd_died = 0; + if (cmd_died) { + cmd_died = 0; return 0; } } @@ -968,17 +968,17 @@ static int send_output(void) static int client_cmd_cmdline(char *cmd) { - pid_t pid; int ret, fds[3] = {0, 1, 0}; char *c = make_message(BINDIR "/para_client %s", cmd); outputf(COLOR_COMMAND, "%s", c); - print_in_bar(COLOR_MSG, "executing client command, hit q to abort\n"); - ret = para_exec_cmdline_pid(&pid, c, fds); + print_in_bar(COLOR_MSG, "executing client command, hit any key to abort\n"); + ret = para_exec_cmdline_pid(&cmd_pid, c, fds); free(c); if (ret < 0) return -1; command_pipe = fds[1]; + mark_fd_nonblock(command_pipe); return send_output(); } @@ -987,14 +987,14 @@ static int client_cmd_cmdline(char *cmd) */ static int display_cmd(char *cmd) { - pid_t pid; int fds[3] = {0, 1, 0}; - print_in_bar(COLOR_MSG, "executing display command, hit q to abort"); + print_in_bar(COLOR_MSG, "executing display command, hit any key to abort"); outputf(COLOR_COMMAND, "%s", cmd); - if (para_exec_cmdline_pid(&pid, cmd, fds) < 0) + if (para_exec_cmdline_pid(&cmd_pid, cmd, fds) < 0) return -1; command_pipe = fds[1]; + mark_fd_nonblock(command_pipe); return send_output(); } @@ -1005,10 +1005,11 @@ static int external_cmd(char *cmd) { int fds[3] = {-1, -1, -1}; - if (external_cmd_pid) + if (cmd_pid) return -1; shutdown_curses(); - para_exec_cmdline_pid(&external_cmd_pid, cmd, fds); + para_exec_cmdline_pid(&cmd_pid, cmd, fds); + cmd_died = 0; do_select(EXTERNAL_MODE); init_curses(); return 0; @@ -1148,6 +1149,12 @@ static void com_ll_incr(void) static void com_reread_conf(void) { char *cf =configfile_exists(); + struct gui_cmdline_parser_params params = { + .override = 1, + .initialize = 1, + .check_required = 0, + .check_ambiguity = 0 + }; if (!cf) { PARA_WARNING_LOG("%s", "there is no configuration to read"); @@ -1155,8 +1162,8 @@ static void com_reread_conf(void) } PARA_INFO_LOG("%s", "rereading command line options and config file"); gui_cmdline_parser(_argc, _argv, &conf); - gui_cmdline_parser_configfile(cf, &conf, 1, 1, 0); - PARA_NOTICE_LOG("%s", "configuration read"); + gui_cmdline_parser_config_file(cf, &conf, ¶ms); + PARA_NOTICE_LOG("%s", "config file reloaded"); if (check_key_map_args() < 0) finish(EXIT_FAILURE); } @@ -1317,6 +1324,7 @@ int main(int argc, char *argv[]) fprintf(stderr, "parse error while reading command line\n"); exit(EXIT_FAILURE); } + HANDLE_VERSION_FLAG("gui", conf); init_theme(0, &theme); top.lines = theme.top_lines_default; if (check_key_map_args() < 0) { @@ -1329,8 +1337,15 @@ int main(int argc, char *argv[]) conf.config_file_arg); exit(EXIT_FAILURE); } - if (cf) - gui_cmdline_parser_configfile(cf, &conf, 0, 0, 0); + if (cf) { + struct gui_cmdline_parser_params params = { + .override = 0, + .initialize = 0, + .check_required = 0, + .check_ambiguity = 0 + }; + gui_cmdline_parser_config_file(cf, &conf, ¶ms); + } if (check_key_map_args() < 0) { fprintf(stderr, "invalid key map in config file\n"); exit(EXIT_FAILURE);