=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window.c,v retrieving revision 1.262 retrieving revision 1.263 diff -c -r1.262 -r1.263 *** src/usr.bin/tmux/window.c 2020/05/16 16:50:55 1.262 --- src/usr.bin/tmux/window.c 2020/05/21 07:24:13 1.263 *************** *** 1,4 **** ! /* $OpenBSD: window.c,v 1.262 2020/05/16 16:50:55 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window.c,v 1.263 2020/05/21 07:24:13 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 881,887 **** wp->sy = wp->osx = sy; wp->pipe_fd = -1; - wp->pipe_off = 0; wp->pipe_event = NULL; screen_init(&wp->base, sx, sy, hlimit); --- 881,886 ---- *************** *** 933,954 **** static void window_pane_read_callback(__unused struct bufferevent *bufev, void *data) { ! struct window_pane *wp = data; ! struct evbuffer *evb = wp->event->input; ! size_t size = EVBUFFER_LENGTH(evb); ! char *new_data; ! size_t new_size; ! new_size = size - wp->pipe_off; ! if (wp->pipe_fd != -1 && new_size > 0) { ! new_data = EVBUFFER_DATA(evb) + wp->pipe_off; ! bufferevent_write(wp->pipe_event, new_data, new_size); } log_debug("%%%u has %zu bytes", wp->id, size); input_parse_pane(wp); - - wp->pipe_off = EVBUFFER_LENGTH(evb); } static void --- 932,959 ---- static void window_pane_read_callback(__unused struct bufferevent *bufev, void *data) { ! struct window_pane *wp = data; ! struct evbuffer *evb = wp->event->input; ! struct window_pane_offset *wpo = &wp->pipe_offset; ! size_t size = EVBUFFER_LENGTH(evb); ! char *new_data; ! size_t new_size; ! struct client *c; ! if (wp->pipe_fd != -1) { ! new_data = window_pane_get_new_data(wp, wpo, &new_size); ! if (new_size > 0) { ! bufferevent_write(wp->pipe_event, new_data, new_size); ! window_pane_update_used_data(wp, wpo, new_size, 1); ! } } log_debug("%%%u has %zu bytes", wp->id, size); + TAILQ_FOREACH(c, &clients, entry) { + if (c->session != NULL && c->flags & CLIENT_CONTROL) + control_write_output(c, wp); + } input_parse_pane(wp); } static void *************** *** 1540,1543 **** --- 1545,1585 ---- file_read(c, "-", window_pane_input_callback, cdata); return (0); + } + + void * + window_pane_get_new_data(struct window_pane *wp, + struct window_pane_offset *wpo, size_t *size) + { + size_t used = wpo->used - wp->base_offset; + + *size = EVBUFFER_LENGTH(wp->event->input) - used; + return (EVBUFFER_DATA(wp->event->input) + used); + } + + void + window_pane_update_used_data(struct window_pane *wp, + struct window_pane_offset *wpo, size_t size, int acknowledge) + { + size_t used = wpo->used - wp->base_offset; + + if (size > EVBUFFER_LENGTH(wp->event->input) - used) + size = EVBUFFER_LENGTH(wp->event->input) - used; + wpo->used += size; + + if (acknowledge) + window_pane_acknowledge_data(wp, wpo, size); + } + + void + window_pane_acknowledge_data(struct window_pane *wp, + struct window_pane_offset *wpo, size_t size) + { + size_t acknowledged = wpo->acknowledged - wp->base_offset; + + if (size > EVBUFFER_LENGTH(wp->event->input) - acknowledged) + size = EVBUFFER_LENGTH(wp->event->input) - acknowledged; + wpo->acknowledged += size; + if (wpo->acknowledged > wpo->used) + wpo->acknowledged = wpo->used; }