mirror of
https://github.com/tmate-io/tmate.git
synced 2025-08-12 23:17:11 +02:00
Sync OpenBSD patchset 1072:
Add a simple form of output rate limiting by counting the number of certain C0 sequences (linefeeds, backspaces, carriage returns) and if it exceeds a threshold (current default 50/millisecond), start to redraw the pane every 100 milliseconds instead of making each change as it comes. Two configuration options - c0-change-trigger and c0-change-interval. This makes tmux much more responsive under very fast output (for example yes(1) or accidentally cat'ing a large file) but may not be perfect on all terminals and connections - feedback very welcome, particularly where this change has a negative rather than positive effect (making it off by default is a possibility). After much experimentation based originally on a request Robin Lee Powell (which ended with a completely different solution), this idea from discussion with Ailin Nemui.
This commit is contained in:
16
input.c
16
input.c
@ -908,6 +908,7 @@ input_c0_dispatch(struct input_ctx *ictx)
|
||||
struct screen_write_ctx *sctx = &ictx->ctx;
|
||||
struct window_pane *wp = ictx->wp;
|
||||
struct screen *s = sctx->s;
|
||||
u_int trigger;
|
||||
|
||||
log_debug("%s: '%c", __func__, ictx->ch);
|
||||
|
||||
@ -919,7 +920,7 @@ input_c0_dispatch(struct input_ctx *ictx)
|
||||
break;
|
||||
case '\010': /* BS */
|
||||
screen_write_backspace(sctx);
|
||||
break;
|
||||
goto count_c0;
|
||||
case '\011': /* HT */
|
||||
/* Don't tab beyond the end of the line. */
|
||||
if (s->cx >= screen_size_x(s) - 1)
|
||||
@ -936,10 +937,10 @@ input_c0_dispatch(struct input_ctx *ictx)
|
||||
case '\013': /* VT */
|
||||
case '\014': /* FF */
|
||||
screen_write_linefeed(sctx, 0);
|
||||
break;
|
||||
goto count_c0;
|
||||
case '\015': /* CR */
|
||||
screen_write_carriagereturn(sctx);
|
||||
break;
|
||||
goto count_c0;
|
||||
case '\016': /* SO */
|
||||
ictx->cell.attr |= GRID_ATTR_CHARSET;
|
||||
break;
|
||||
@ -951,6 +952,15 @@ input_c0_dispatch(struct input_ctx *ictx)
|
||||
break;
|
||||
}
|
||||
|
||||
return (0);
|
||||
|
||||
count_c0:
|
||||
trigger = options_get_number(&wp->window->options, "c0-change-trigger");
|
||||
if (++wp->changes == trigger) {
|
||||
wp->flags |= PANE_DROP;
|
||||
window_pane_timer_start(wp);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user