aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-08-21 07:33:58 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-08-21 07:33:58 +0000
commitf817a338d035d96cec8ceeaaa60a79ac01421563 (patch)
tree7b570f40bb6a92b7c03f89cdfa682ea81b40913c
parent0198bb6bf3f1b3877ca8def6d198642a2a41d342 (diff)
downloadrtmux-f817a338d035d96cec8ceeaaa60a79ac01421563.tar.gz
rtmux-f817a338d035d96cec8ceeaaa60a79ac01421563.tar.bz2
rtmux-f817a338d035d96cec8ceeaaa60a79ac01421563.zip
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.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/window-copy.c b/window-copy.c
index 63c31829..f102092c 100644
--- a/window-copy.c
+++ b/window-copy.c
@@ -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);
}