summaryrefslogtreecommitdiffstats
path: root/window.c
diff options
context:
space:
mode:
authorThomas Adam <thomas@xteddy.org>2019-05-03 23:02:28 +0100
committerThomas Adam <thomas@xteddy.org>2019-05-03 23:02:28 +0100
commitd4177e954c8433469f5ac4cade15bafb1675117e (patch)
tree76ff287b770ec8e217c6839e0afae2a7dd716961 /window.c
parent4d505574dc515d6e554b3f37e9aa5bdb8930c6cb (diff)
parent45ae9a8e3520d73c795bb993ced4fe43d06ad6f1 (diff)
Merge branch 'obsd-master'
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 795bc26c..e4cc51d3 100644
--- a/window.c
+++ b/window.c
@@ -70,6 +70,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 *);
@@ -1467,3 +1472,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));
+}