summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app-misc/tmux/files/tmux-2.3-screen_write_copy-fix.patch')
-rw-r--r--app-misc/tmux/files/tmux-2.3-screen_write_copy-fix.patch63
1 files changed, 63 insertions, 0 deletions
diff --git a/app-misc/tmux/files/tmux-2.3-screen_write_copy-fix.patch b/app-misc/tmux/files/tmux-2.3-screen_write_copy-fix.patch
new file mode 100644
index 000000000000..b8383274da2a
--- /dev/null
+++ b/app-misc/tmux/files/tmux-2.3-screen_write_copy-fix.patch
@@ -0,0 +1,63 @@
+From 30086e504c8a5389b96b72b81ac8dbefe19e0cf1 Mon Sep 17 00:00:00 2001
+From: nicm <nicm>
+Date: Wed, 5 Oct 2016 22:00:29 +0000
+Subject: [PATCH] screen_write_copy tried to be clever and clear the line if it
+ reached the end of the source, but it was wrong and causes problems that are
+ only showing up now we are more aggressive about skipping redundant screen
+ updates. Remove the optimization entirely as more trouble than it is worth to
+ fix (and it'll have to go when BCE is done anyway).
+
+---
+ screen-write.c | 34 +++++++---------------------------
+ 1 file changed, 7 insertions(+), 27 deletions(-)
+
+diff --git a/screen-write.c b/screen-write.c
+index 3977517..3a1fc8c 100644
+--- a/screen-write.c
++++ b/screen-write.c
+@@ -394,38 +394,18 @@ screen_write_copy(struct screen_write_ctx *ctx, struct screen *src, u_int px,
+ {
+ struct screen *s = ctx->s;
+ struct grid *gd = src->grid;
+- struct grid_line *gl;
+ struct grid_cell gc;
+- u_int xx, yy, cx, cy, ax, bx;
++ u_int xx, yy, cx, cy;
+
+ cx = s->cx;
+ cy = s->cy;
++
+ for (yy = py; yy < py + ny; yy++) {
+- gl = &gd->linedata[yy];
+- if (yy < gd->hsize + gd->sy) {
+- /*
+- * Find start and end position and copy between
+- * them. Limit to the real end of the line then use a
+- * clear EOL only if copying to the end, otherwise
+- * could overwrite whatever is there already.
+- */
+- if (px > gl->cellsize)
+- ax = gl->cellsize;
+- else
+- ax = px;
+- if (px + nx == gd->sx && px + nx > gl->cellsize)
+- bx = gl->cellsize;
+- else
+- bx = px + nx;
+-
+- for (xx = ax; xx < bx; xx++) {
+- grid_get_cell(gd, xx, yy, &gc);
+- screen_write_cell(ctx, &gc);
+- }
+- if (px + nx == gd->sx && px + nx > gl->cellsize)
+- screen_write_clearendofline(ctx);
+- } else
+- screen_write_clearline(ctx);
++ for (xx = px; xx < px + nx; xx++) {
++ grid_get_cell(gd, xx, yy, &gc);
++ screen_write_cell(ctx, &gc);
++ }
++
+ cy++;
+ screen_write_cursormove(ctx, cx, cy);
+ }