Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam
2019-05-03 23:02:28 +01:00
11 changed files with 146 additions and 35 deletions

View File

@ -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));
}