aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2009-08-21 21:12:07 +0000
committerTiago Cunha <tcunha@gmx.com>2009-08-21 21:12:07 +0000
commitd07d18258b5f998fa101dd5e3427b3fa6ba39231 (patch)
treec5f659f4c22fc5e09877580b0b8b72a260b4a25f
parenta004fc3592145bcefafb3044f2ab458a6f18f85c (diff)
downloadrtmux-d07d18258b5f998fa101dd5e3427b3fa6ba39231.tar.gz
rtmux-d07d18258b5f998fa101dd5e3427b3fa6ba39231.tar.bz2
rtmux-d07d18258b5f998fa101dd5e3427b3fa6ba39231.zip
Sync OpenBSD patchset 284:
When moving up or down in copy mode, save the cursor position and size of the last line with content (width != 0) and use it to determine if the cursor should be at the end of the line. Fixes problem of the cursor always jumping to the end of the line when scrolling past a blank line.
-rw-r--r--window-copy.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/window-copy.c b/window-copy.c
index 7039f88c..a7aa8f4c 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -1,4 +1,4 @@
-/* $Id: window-copy.c,v 1.83 2009-08-20 11:52:39 tcunha Exp $ */
+/* $Id: window-copy.c,v 1.84 2009-08-21 21:12:07 tcunha Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -97,6 +97,9 @@ struct window_copy_mode_data {
u_int cx;
u_int cy;
+ u_int lastcx; /* position in last line with content */
+ u_int lastsx; /* size of last line with content */
+
enum window_copy_input_type inputtype;
const char *inputprompt;
char *inputstr;
@@ -119,6 +122,9 @@ window_copy_init(struct window_pane *wp)
data->cx = wp->base.cx;
data->cy = wp->base.cy;
+ data->lastcx = 0;
+ data->lastsx = 0;
+
data->inputtype = WINDOW_COPY_OFF;
data->inputprompt = NULL;
data->inputstr = xstrdup("");
@@ -1045,7 +1051,12 @@ window_copy_cursor_up(struct window_pane *wp)
oy = screen_hsize(&wp->base) + data->cy - data->oy;
ox = window_copy_find_length(wp, oy);
+ if (ox != 0) {
+ data->lastcx = data->cx;
+ data->lastsx = ox;
+ }
+ data->cx = data->lastcx;
if (data->cy == 0)
window_copy_scroll_down(wp, 1);
else {
@@ -1056,8 +1067,7 @@ window_copy_cursor_up(struct window_pane *wp)
py = screen_hsize(&wp->base) + data->cy - data->oy;
px = window_copy_find_length(wp, py);
-
- if (data->cx >= px || data->cx >= ox)
+ if (data->cx >= data->lastsx || data->cx > px)
window_copy_cursor_end_of_line(wp);
}
@@ -1070,7 +1080,12 @@ window_copy_cursor_down(struct window_pane *wp)
oy = screen_hsize(&wp->base) + data->cy - data->oy;
ox = window_copy_find_length(wp, oy);
+ if (ox != 0) {
+ data->lastcx = data->cx;
+ data->lastsx = ox;
+ }
+ data->cx = data->lastcx;
if (data->cy == screen_size_y(s) - 1)
window_copy_scroll_up(wp, 1);
else {
@@ -1081,8 +1096,7 @@ window_copy_cursor_down(struct window_pane *wp)
py = screen_hsize(&wp->base) + data->cy - data->oy;
px = window_copy_find_length(wp, py);
-
- if (data->cx >= px || data->cx >= ox)
+ if (data->cx >= data->lastsx || data->cx > px)
window_copy_cursor_end_of_line(wp);
}