Make sure the cursor position is still on screen after we have trimmed
authornicm <nicm@openbsd.org>
Fri, 17 Apr 2020 14:06:42 +0000 (14:06 +0000)
committernicm <nicm@openbsd.org>
Fri, 17 Apr 2020 14:06:42 +0000 (14:06 +0000)
empty lines. Also improve some log messages.

usr.bin/tmux/screen.c
usr.bin/tmux/tmux.h
usr.bin/tmux/window-copy.c

index fa0505f..f17fda7 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen.c,v 1.62 2020/04/15 17:50:02 nicm Exp $ */
+/* $OpenBSD: screen.c,v 1.63 2020/04/17 14:06:42 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -230,7 +230,9 @@ screen_resize_cursor(struct screen *s, u_int sx, u_int sy, int reflow,
                cy = &tcy;
        *cy = s->grid->hsize + s->cy;
 
-       log_debug("%s: start %u,%u (%u,%u)", __func__, s->cx, s->cy, *cx, *cy);
+       log_debug("%s: new size %ux%u, now %ux%u (cursor %u,%u = %u,%u)",
+           __func__, sx, sy, screen_size_x(s), screen_size_y(s), s->cx, s->cy,
+           *cx, *cy);
 
        if (sx < 1)
                sx = 1;
@@ -256,7 +258,8 @@ screen_resize_cursor(struct screen *s, u_int sx, u_int sy, int reflow,
                s->cx = 0;
                s->cy = 0;
        }
-       log_debug("%s: finish %u,%u (%u,%u)", __func__, s->cx, s->cy, *cx, *cy);
+       log_debug("%s: cursor finished at %u,%u = %u,%u", __func__, s->cx,
+           s->cy, *cx, *cy);
 }
 
 /* Resize screen. */
index 0f3306a..9708b9b 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.1000 2020/04/16 16:13:56 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1001 2020/04/17 14:06:42 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -79,7 +79,7 @@ struct winlink;
 #define NAME_INTERVAL 500000
 
 /* Maximum size of data to hold from a pane. */
-#define READ_SIZE 4096
+#define READ_SIZE 8192
 
 /* Default pixel cell sizes. */
 #define DEFAULT_XPIXEL 16
index c34564f..b22df4b 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: window-copy.c,v 1.277 2020/04/17 08:03:22 nicm Exp $ */
+/* $OpenBSD: window-copy.c,v 1.278 2020/04/17 14:06:42 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -314,14 +314,22 @@ window_copy_clone_screen(struct screen *src, struct screen *hint, u_int *cx,
                        break;
                sy--;
        }
+       log_debug("%s: target screen is %ux%u, source %ux%u", __func__,
+           screen_size_x(src), sy, screen_size_x(hint),
+           screen_hsize(src) + screen_size_y(src));
        screen_init(dst, screen_size_x(src), sy, screen_hlimit(src));
        grid_duplicate_lines(dst->grid, 0, src->grid, 0, sy);
 
        dst->grid->sy = sy - screen_hsize(src);
        dst->grid->hsize = screen_hsize(src);
        dst->grid->hscrolled = src->grid->hscrolled;
-       dst->cx = src->cx;
-       dst->cy = src->cy;
+       if (src->cy > dst->grid->sy - 1) {
+               dst->cx = 0;
+               dst->cy = dst->grid->sy - 1;
+       } else {
+               dst->cx = src->cx;
+               dst->cy = src->cy;
+       }
 
        screen_resize_cursor(dst, screen_size_x(hint), screen_size_y(hint), 1,
            0, cx, cy);