summaryrefslogtreecommitdiffstats
path: root/window.c
diff options
context:
space:
mode:
authornicm <nicm>2019-05-03 20:44:24 +0000
committernicm <nicm>2019-05-03 20:44:24 +0000
commit9f75635596d0a01282156eb9e17fde6f4205c05c (patch)
treec2992361a46c5ed7a17c2f273d3e8aba5bc16480 /window.c
parente8e4f4ec3e4de0bd0e4eb2a7ee995fb6f5f7f937 (diff)
Allow panes to be empty (no command), output can be piped to them with
split-window or display-message -I.
Diffstat (limited to 'window.c')
-rw-r--r--window.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/window.c b/window.c
index 7a2d9f6c..62de5006 100644
--- a/window.c
+++ b/window.c
@@ -72,6 +72,11 @@ const struct window_mode *all_window_modes[] = {
NULL
};
+struct window_pane_input_data {
+ struct cmdq_item *item;
+ u_int wp;
+};
+
static struct window_pane *window_pane_create(struct window *, u_int, u_int,
u_int);
static void window_pane_destroy(struct window_pane *);
@@ -1466,3 +1471,45 @@ winlink_shuffle_up(struct session *s, struct winlink *wl)
return (idx);
}
+
+static void
+window_pane_input_callback(struct client *c, int closed, void *data)
+{
+ struct window_pane_input_data *cdata = data;
+ struct window_pane *wp;
+
+ wp = window_pane_find_by_id(cdata->wp);
+ if (wp == NULL || closed || c->flags & CLIENT_DEAD) {
+ c->stdin_callback = NULL;
+ server_client_unref(c);
+
+ cdata->item->flags &= ~CMDQ_WAITING;
+ free(cdata);
+
+ return;
+ }
+
+ if (evbuffer_add_buffer(wp->event->input, c->stdin_data) != 0)
+ evbuffer_drain(c->stdin_data, EVBUFFER_LENGTH(c->stdin_data));
+ input_parse(wp);
+}
+
+int
+window_pane_start_input(struct window_pane *wp, struct cmdq_item *item,
+ char **cause)
+{
+ struct client *c = item->client;
+ struct window_pane_input_data *cdata;
+
+ if (~wp->flags & PANE_EMPTY) {
+ *cause = xstrdup("pane is not empty");
+ return (-1);
+ }
+
+ cdata = xmalloc(sizeof *cdata);
+ cdata->item = item;
+ cdata->wp = wp->id;
+
+ return (server_set_stdin_callback(c, window_pane_input_callback, cdata,
+ cause));
+}