diff options
author | Tiago Cunha <tcunha@gmx.com> | 2012-03-29 21:05:16 +0000 |
---|---|---|
committer | Tiago Cunha <tcunha@gmx.com> | 2012-03-29 21:05:16 +0000 |
commit | f9f6eea4441bb62634b35d17ded3b4c7d460dea6 (patch) | |
tree | 015ef836b6492dc82750b502e0257d9af53d6af6 /input.c | |
parent | 621fa0a686cab46de5906b6a1c5ef2fac197a49e (diff) | |
download | rtmux-f9f6eea4441bb62634b35d17ded3b4c7d460dea6.tar.gz rtmux-f9f6eea4441bb62634b35d17ded3b4c7d460dea6.tar.bz2 rtmux-f9f6eea4441bb62634b35d17ded3b4c7d460dea6.zip |
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.
Diffstat (limited to 'input.c')
-rw-r--r-- | input.c | 16 |
1 files changed, 13 insertions, 3 deletions
@@ -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; @@ -952,6 +953,15 @@ input_c0_dispatch(struct input_ctx *ictx) } 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); } /* Execute escape sequence. */ |