/*
- * Copyright (C) 1998-2006 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 1998-2007 Andre Noll <maan@systemlinux.org>
*
* 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
#include "gui.cmdline.h"
#include "para.h"
+#include "gui.h"
#include <curses.h>
#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;
extern const char *status_item_list[NUM_STAT_ITEMS];
static char *stat_content[NUM_STAT_ITEMS];
-#define STANDARD_STATUS_BAR "para_gui " VERSION " (hit ? for help)"
+#define STANDARD_STATUS_BAR "para_gui " PACKAGE_VERSION " (hit ? for help)"
static int signal_pipe;
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;
if (!curses_active)
return;
wmove(sb.win, 0, 0);
- align_str(sb.win,STANDARD_STATUS_BAR, sb.cols, CENTER);
+ align_str(sb.win, STANDARD_STATUS_BAR, sb.cols, CENTER);
wrefresh(sb.win);
}
int ll = conf.loglevel_arg;
if (ll > NOTICE)
return;
- outputf(COLOR_WELCOME, "Welcome to para_gui " VERSION
+ outputf(COLOR_WELCOME, "Welcome to para_gui " PACKAGE_VERSION
" \"" CODENAME "\". Theme: %s", theme.name);
wclrtoeol(bot.win);
}
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;
}
*
* 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:
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 {
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);
return ret;
break;
case EXTERNAL_MODE:
- if (external_cmd_died) {
- external_cmd_died = 0;
+ if (cmd_died) {
+ cmd_died = 0;
return 0;
}
}
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();
}
*/
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();
}
{
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;
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");
+ PARA_NOTICE_LOG("%s", "config file reloaded");
if (check_key_map_args() < 0)
finish(EXIT_FAILURE);
}
static void com_version(void)
{
- print_in_bar(COLOR_MSG, "para_gui " VERSION " \"" CODENAME "\"");
+ print_in_bar(COLOR_MSG, "para_gui " PACKAGE_VERSION " \""
+ CODENAME "\"");
}
static void com_quit(void)
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) {