INIT_GUI_ERRLISTS;
static char *stat_content[NUM_STAT_ITEMS];
-#define STANDARD_STATUS_BAR "para_gui " PACKAGE_VERSION " (hit ? for help)"
-
static int signal_pipe;
static struct gui_window {
static unsigned scroll_position;
-static int curses_active;
+static bool curses_active;
static pid_t cmd_pid;
static int command_fds[2] = {-1, -1};
enum {GETCH_MODE, COMMAND_MODE, EXTERNAL_MODE};
-#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
+/**
+ * Codes for various colors.
+ *
+ * Each status item has its own color pair. The ones defined here start at a
+ * higher number so that they do not overlap with these.
+ */
+enum gui_color_pair {
+ COLOR_STATUSBAR = NUM_STAT_ITEMS + 1,
+ COLOR_COMMAND,
+ COLOR_OUTPUT,
+ COLOR_MSG,
+ COLOR_ERRMSG,
+ COLOR_WELCOME,
+ COLOR_SEPARATOR,
+ COLOR_TOP,
+ COLOR_BOT,
+};
struct gui_command {
const char *key;
if (!curses_active)
return;
- tmp = para_strdup(STANDARD_STATUS_BAR);
+ tmp = para_strdup("para_gui " PACKAGE_VERSION " (hit ? for help)");
wmove(sb.win, 0, 0);
align_str(sb.win, tmp, sb.cols, CENTER);
free(tmp);
if (!curses_active)
return;
def_prog_mode();
- curses_active = 0;
+ curses_active = false;
endwin();
}
keypad(bot.win, 1);
keypad(sb.win, 1);
keypad(in.win, 1);
- print_status_bar();
}
wmove(sep.win, 0, 0);
for (i = 1; i <= COLS; i++)
/* (Re-)initialize the curses library. */
static void init_curses(void)
{
- curses_active = 1;
+ curses_active = true;
if (top.win && refresh() == ERR) /* refresh is really needed */
msg_n_exit(EXIT_FAILURE, "refresh() failed\n");
if (LINES < theme.lines_min || COLS < theme.cols_min)
for (i = 0; i < conf.key_map_given; ++i) {
s = conf.key_map_arg[i];
if (!(*s))
- goto err_out;
+ goto out;
free(tmp);
tmp = para_strdup(s);
if (!split_key_map(tmp, &handler, &arg))
- goto err_out;
+ goto out;
if (strlen(handler) != 1)
- goto err_out;
+ goto out;
if (*handler != 'x'
&& *handler != 'd'
&& *handler != 'i'
&& *handler != 'p')
- goto err_out;
+ goto out;
if (*handler != 'i')
continue;
if (find_cmd_byname(arg) < 0)
- goto err_out;
+ goto out;
}
ret = 0;
-err_out:
+out:
free(tmp);
return ret;
}
case COMMAND_MODE:
ret = wgetch(top.win);
if (ret != ERR && ret != KEY_RESIZE) {
- if (command_fds[0] >= 0) {
- close(command_fds[0]);
- command_fds[0] = -1;
- }
- if (command_fds[1] >= 0) {
- close(command_fds[1]);
- command_fds[1] = -1;
- }
if (cmd_pid)
kill(cmd_pid, SIGTERM);
return -1;
goto repeat;
}
-/*
- * read from command pipe and print data to bot window
- */
-static void send_output(void)
+/* read from command pipe and print data to bot window */
+static void exec_and_display_cmd(const char *cmd)
{
- int ret;
+ int ret, fds[3] = {0, 1, 1};
- ret = mark_fd_nonblocking(command_fds[0]);
+ 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(command_fds[1]);
+ 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
static void para_cmd(char *cmd)
{
- int ret, fds[3] = {0, 1, 1};
- char *c = make_message(BINDIR "/para_client -- %s", cmd);
+ char *c;
- outputf(COLOR_COMMAND, "%s", c);
print_in_bar(COLOR_MSG, "executing client command, hit any key to abort\n");
- ret = para_exec_cmdline_pid(&cmd_pid, c, fds);
+ c = make_message(BINDIR "/para_client -- %s", cmd);
+ exec_and_display_cmd(c);
free(c);
- if (ret < 0)
- return;
- command_fds[0] = fds[1];
- command_fds[1] = fds[2];
- send_output();
}
-/*
- * exec command and print output to bot win
- */
static void display_cmd(char *cmd)
{
- int fds[3] = {0, 1, 1};
-
print_in_bar(COLOR_MSG, "executing display command, hit any key to abort");
- outputf(COLOR_COMMAND, "%s", cmd);
- if (para_exec_cmdline_pid(&cmd_pid, cmd, fds) < 0)
- return;
- command_fds[0] = fds[1];
- command_fds[1] = fds[2];
- send_output();
+ exec_and_display_cmd(cmd);
}
/*
exit(EXIT_FAILURE);
}
init_theme_or_die(conf.theme_arg, &theme);
- top.lines = theme.top_lines_default;
setup_signal_handling();
bot_win_rb = ringbuffer_new(RINGBUFFER_SIZE);
setlocale(LC_CTYPE, "");