mirror of
https://github.com/tmux/tmux.git
synced 2025-09-02 05:21:10 +00:00
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:
47
window.c
47
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));
|
||||
}
|
||||
|
Reference in New Issue
Block a user