Do not use evbuffer_add_buffer because it is destructive and doesn't

work in newer libevent.
pull/1731/head
nicm 2019-05-07 10:25:15 +00:00
parent 45ae9a8e35
commit 69440d19b7
5 changed files with 24 additions and 25 deletions

View File

@ -28,19 +28,14 @@
void void
control_notify_input(struct client *c, struct window_pane *wp, control_notify_input(struct client *c, struct window_pane *wp,
struct evbuffer *input) const u_char *buf, size_t len)
{ {
u_char *buf;
size_t len;
struct evbuffer *message; struct evbuffer *message;
u_int i; u_int i;
if (c->session == NULL) if (c->session == NULL)
return; return;
buf = EVBUFFER_DATA(input);
len = EVBUFFER_LENGTH(input);
/* /*
* Only write input if the window pane is linked to a window belonging * Only write input if the window pane is linked to a window belonging
* to the client's session. * to the client's session.

25
input.c
View File

@ -873,19 +873,28 @@ input_set_state(struct window_pane *wp, const struct input_transition *itr)
/* Parse input. */ /* Parse input. */
void void
input_parse(struct window_pane *wp) input_parse(struct window_pane *wp)
{
struct evbuffer *evb = wp->event->input;
input_parse_buffer(wp, EVBUFFER_DATA(evb), EVBUFFER_LENGTH(evb));
evbuffer_drain(evb, EVBUFFER_LENGTH(evb));
}
/* Parse given input. */
void
input_parse_buffer(struct window_pane *wp, u_char *buf, size_t len)
{ {
struct input_ctx *ictx = wp->ictx; struct input_ctx *ictx = wp->ictx;
struct screen_write_ctx *sctx = &ictx->ctx; struct screen_write_ctx *sctx = &ictx->ctx;
const struct input_transition *itr; const struct input_transition *itr;
struct evbuffer *evb = wp->event->input; size_t off = 0;
u_char *buf;
size_t len, off;
if (EVBUFFER_LENGTH(evb) == 0) if (len == 0)
return; return;
window_update_activity(wp->window); window_update_activity(wp->window);
wp->flags |= PANE_CHANGED; wp->flags |= PANE_CHANGED;
notify_input(wp, buf, len);
/* /*
* Open the screen. Use NULL wp if there is a mode set as don't want to * Open the screen. Use NULL wp if there is a mode set as don't want to
@ -897,12 +906,6 @@ input_parse(struct window_pane *wp)
screen_write_start(sctx, NULL, &wp->base); screen_write_start(sctx, NULL, &wp->base);
ictx->wp = wp; ictx->wp = wp;
buf = EVBUFFER_DATA(evb);
len = EVBUFFER_LENGTH(evb);
off = 0;
notify_input(wp, evb);
log_debug("%s: %%%u %s, %zu bytes: %.*s", __func__, wp->id, log_debug("%s: %%%u %s, %zu bytes: %.*s", __func__, wp->id,
ictx->state->name, len, (int)len, buf); ictx->state->name, len, (int)len, buf);
@ -950,8 +953,6 @@ input_parse(struct window_pane *wp)
/* Close the screen. */ /* Close the screen. */
screen_write_stop(sctx); screen_write_stop(sctx);
evbuffer_drain(evb, len);
} }
/* Split the parameter list (if any). */ /* Split the parameter list (if any). */

View File

@ -199,13 +199,13 @@ notify_hook(struct cmdq_item *item, const char *name)
} }
void void
notify_input(struct window_pane *wp, struct evbuffer *input) notify_input(struct window_pane *wp, const u_char *buf, size_t len)
{ {
struct client *c; struct client *c;
TAILQ_FOREACH(c, &clients, entry) { TAILQ_FOREACH(c, &clients, entry) {
if (c->flags & CLIENT_CONTROL) if (c->flags & CLIENT_CONTROL)
control_notify_input(c, wp, input); control_notify_input(c, wp, buf, len);
} }
} }

5
tmux.h
View File

@ -1699,7 +1699,7 @@ char *format_trim_right(const char *, u_int);
/* notify.c */ /* notify.c */
void notify_hook(struct cmdq_item *, const char *); void notify_hook(struct cmdq_item *, const char *);
void notify_input(struct window_pane *, struct evbuffer *); void notify_input(struct window_pane *, const u_char *, size_t);
void notify_client(const char *, struct client *); void notify_client(const char *, struct client *);
void notify_session(const char *, struct session *); void notify_session(const char *, struct session *);
void notify_winlink(const char *, struct winlink *); void notify_winlink(const char *, struct winlink *);
@ -2087,6 +2087,7 @@ void input_free(struct window_pane *);
void input_reset(struct window_pane *, int); void input_reset(struct window_pane *, int);
struct evbuffer *input_pending(struct window_pane *); struct evbuffer *input_pending(struct window_pane *);
void input_parse(struct window_pane *); void input_parse(struct window_pane *);
void input_parse_buffer(struct window_pane *, u_char *, size_t);
/* input-key.c */ /* input-key.c */
void input_key(struct window_pane *, key_code, struct mouse_event *); void input_key(struct window_pane *, key_code, struct mouse_event *);
@ -2428,7 +2429,7 @@ void control_write_buffer(struct client *, struct evbuffer *);
/* control-notify.c */ /* control-notify.c */
void control_notify_input(struct client *, struct window_pane *, void control_notify_input(struct client *, struct window_pane *,
struct evbuffer *); const u_char *, size_t);
void control_notify_pane_mode_changed(int); void control_notify_pane_mode_changed(int);
void control_notify_window_layout_changed(struct window *); void control_notify_window_layout_changed(struct window *);
void control_notify_window_pane_changed(struct window *); void control_notify_window_pane_changed(struct window *);

View File

@ -1477,6 +1477,9 @@ window_pane_input_callback(struct client *c, int closed, void *data)
{ {
struct window_pane_input_data *cdata = data; struct window_pane_input_data *cdata = data;
struct window_pane *wp; struct window_pane *wp;
struct evbuffer *evb = c->stdin_data;
u_char *buf = EVBUFFER_DATA(evb);
size_t len = EVBUFFER_LENGTH(evb);
wp = window_pane_find_by_id(cdata->wp); wp = window_pane_find_by_id(cdata->wp);
if (wp == NULL || closed || c->flags & CLIENT_DEAD) { if (wp == NULL || closed || c->flags & CLIENT_DEAD) {
@ -1489,9 +1492,8 @@ window_pane_input_callback(struct client *c, int closed, void *data)
return; return;
} }
if (evbuffer_add_buffer(wp->event->input, c->stdin_data) != 0) input_parse_buffer(wp, buf, len);
evbuffer_drain(c->stdin_data, EVBUFFER_LENGTH(c->stdin_data)); evbuffer_drain(evb, len);
input_parse(wp);
} }
int int