From 0d1152340ccb3c6a0a8b4160fda34cc6687b236e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20Andr=C3=A9=20Tanner?= Date: Wed, 18 May 2016 12:31:33 +0200 Subject: vis: add an interactive mode to vis_pipe{,_collect}(...) Previously the interactive mode was implicitly enabled by passing an invalid range. However for some use cases (e.g. completion) we need to be able to pipe a given text range to an external process without also redirecting stderr (which is used to draw the slmenu interface on top of vis). --- vis.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) (limited to 'vis.c') diff --git a/vis.c b/vis.c index e367291..f35c50b 100644 --- a/vis.c +++ b/vis.c @@ -1161,20 +1161,18 @@ Regex *vis_regex(Vis *vis, const char *pattern) { return regex; } -int vis_pipe(Vis *vis, Filerange *range, const char *argv[], +int vis_pipe(Vis *vis, Filerange *range, bool interactive, const char *argv[], void *stdout_context, ssize_t (*read_stdout)(void *stdout_context, char *data, size_t len), void *stderr_context, ssize_t (*read_stderr)(void *stderr_context, char *data, size_t len)) { /* if an invalid range was given, stdin (i.e. key board input) is passed * through the external command. */ Text *text = vis->win->file->text; - View *view = vis->win->view; int pin[2], pout[2], perr[2], status = -1; - bool interactive = !text_range_valid(range); - size_t pos = view_cursor_get(view); - Filerange rout = *range; - if (interactive) - rout = (Filerange){ .start = pos, .end = pos }; + bool valid_range = text_range_valid(range); + if (!valid_range) + interactive = true; + Filerange rout = valid_range ? *range : text_range_new(0, 0); if (pipe(pin) == -1) return -1; @@ -1205,7 +1203,7 @@ int vis_pipe(Vis *vis, Filerange *range, const char *argv[], vis_info_show(vis, "fork failure: %s", strerror(errno)); return -1; } else if (pid == 0) { /* child i.e filter */ - if (!interactive) + if (!interactive || valid_range) dup2(pin[0], STDIN_FILENO); close(pin[0]); close(pin[1]); @@ -1330,11 +1328,11 @@ static ssize_t read_buffer(void *context, char *data, size_t len) { return len; } -int vis_pipe_collect(Vis *vis, Filerange *range, const char *argv[], char **out, char **err) { +int vis_pipe_collect(Vis *vis, Filerange *range, bool interactive, const char *argv[], char **out, char **err) { Buffer bufout, buferr; buffer_init(&bufout); buffer_init(&buferr); - int status = vis_pipe(vis, range, argv, &bufout, read_buffer, &buferr, read_buffer); + int status = vis_pipe(vis, range, interactive, argv, &bufout, read_buffer, &buferr, read_buffer); buffer_terminate(&bufout); buffer_terminate(&buferr); if (out) -- cgit v1.2.3