Fix problems with page scrolling in copy mode, GitHub issue 1440 from
authornicm <nicm@openbsd.org>
Mon, 20 Aug 2018 13:51:09 +0000 (13:51 +0000)
committernicm <nicm@openbsd.org>
Mon, 20 Aug 2018 13:51:09 +0000 (13:51 +0000)
Amos Bird.

usr.bin/tmux/window-copy.c

index 13331ce..1e4dc00 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: window-copy.c,v 1.194 2018/08/05 08:59:30 nicm Exp $ */
+/* $OpenBSD: window-copy.c,v 1.195 2018/08/20 13:51:09 nicm Exp $ */
 
 /*
  * Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -353,9 +353,6 @@ window_copy_pageup(struct window_pane *wp, int half_page)
        oy = screen_hsize(data->backing) + data->cy - data->oy;
        ox = window_copy_find_length(wp, oy);
 
-       if (data->lineflag == LINE_SEL_LEFT_RIGHT && oy == data->sely)
-               window_copy_other_end(wp);
-
        if (data->cx != ox) {
                data->lastcx = data->cx;
                data->lastsx = ox;
@@ -370,9 +367,13 @@ window_copy_pageup(struct window_pane *wp, int half_page)
                        n = screen_size_y(s) - 2;
        }
 
-       if (data->oy + n > screen_hsize(data->backing))
+       if (data->oy + n > screen_hsize(data->backing)) {
                data->oy = screen_hsize(data->backing);
-       else
+               if (data->cy < n)
+                       data->cy = 0;
+               else
+                       data->cy -= n;
+       } else
                data->oy += n;
 
        if (data->screen.sel == NULL || !data->rectflag) {
@@ -397,9 +398,6 @@ window_copy_pagedown(struct window_pane *wp, int half_page, int scroll_exit)
        oy = screen_hsize(data->backing) + data->cy - data->oy;
        ox = window_copy_find_length(wp, oy);
 
-       if (data->lineflag == LINE_SEL_RIGHT_LEFT && oy == data->sely)
-               window_copy_other_end(wp);
-
        if (data->cx != ox) {
                data->lastcx = data->cx;
                data->lastsx = ox;
@@ -414,9 +412,13 @@ window_copy_pagedown(struct window_pane *wp, int half_page, int scroll_exit)
                        n = screen_size_y(s) - 2;
        }
 
-       if (data->oy < n)
+       if (data->oy < n) {
                data->oy = 0;
-       else
+               if (data->cy + (n - data->oy) >= screen_size_y(data->backing))
+                       data->cy = screen_size_y(data->backing) - 1;
+               else
+                       data->cy += n - data->oy;
+       } else
                data->oy -= n;
 
        if (data->screen.sel == NULL || !data->rectflag) {