Allow panes to be empty (no command), output can be piped to them with

split-window or display-message -I.
This commit is contained in:
nicm
2019-05-03 20:44:24 +00:00
parent e8e4f4ec3e
commit 9f75635596
10 changed files with 144 additions and 34 deletions

View File

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