* 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 <signal.h>
#include <sys/types.h>
#include "gui.cmdline.h"
#include "para.h"
#include "gui.h"
+#include "string.h"
#include <curses.h>
#include "ringbuffer.h"
-#include "gui_common.h"
#include "fd.h"
#include "error.h"
#include "list.h"
static int signal_pipe;
-static void finish(int sig);
-
static struct win_data {
WINDOW *win;
NCURSES_SIZE_T begx;
}
};
+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;
}
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:
*/
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;
}
if (ret < 0)
return -1;
command_pipe = fds[1];
- mark_fd_nonblocking(command_pipe);
return send_output();
}
if (para_exec_cmdline_pid(&cmd_pid, cmd, fds) < 0)
return -1;
command_pipe = fds[1];
- mark_fd_nonblocking(command_pipe);
return send_output();
}
};
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);
}
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);
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);