=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window-copy.c,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- src/usr.bin/tmux/window-copy.c 2009/07/11 19:09:24 1.4 +++ src/usr.bin/tmux/window-copy.c 2009/07/12 16:12:34 1.5 @@ -1,4 +1,4 @@ -/* $OpenBSD: window-copy.c,v 1.4 2009/07/11 19:09:24 nicm Exp $ */ +/* $OpenBSD: window-copy.c,v 1.5 2009/07/12 16:12:34 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -48,6 +48,7 @@ struct window_pane *, char **, size_t *, u_int, u_int, u_int); int window_copy_is_space(struct window_pane *, u_int, u_int); u_int window_copy_find_length(struct window_pane *, u_int); +void window_copy_set_cursor_x(struct window_pane *, u_int); void window_copy_cursor_start_of_line(struct window_pane *); void window_copy_cursor_end_of_line(struct window_pane *); void window_copy_cursor_left(struct window_pane *); @@ -542,31 +543,16 @@ return (px); } +/* + * Set the cursor X coordinate and scroll horizontally to make it visible. + * Also redraw the selection or the cursor, as needed. + */ void -window_copy_cursor_start_of_line(struct window_pane *wp) +window_copy_set_cursor_x(struct window_pane *wp, u_int px) { struct window_copy_mode_data *data = wp->modedata; - - if (data->ox != 0) - window_copy_scroll_right(wp, data->ox); - data->cx = 0; - - if (window_copy_update_selection(wp)) - window_copy_redraw_lines(wp, data->cy, 1); - else - window_copy_update_cursor(wp); -} - -void -window_copy_cursor_end_of_line(struct window_pane *wp) -{ - struct window_copy_mode_data *data = wp->modedata; struct screen *s = &data->screen; - u_int px, py; - py = screen_hsize(&wp->base) + data->cy - data->oy; - px = window_copy_find_length(wp, py); - /* On screen. */ if (px > data->ox && px <= data->ox + screen_size_x(s) - 1) data->cx = px - data->ox; @@ -600,6 +586,33 @@ } void +window_copy_cursor_start_of_line(struct window_pane *wp) +{ + struct window_copy_mode_data *data = wp->modedata; + + if (data->ox != 0) + window_copy_scroll_right(wp, data->ox); + data->cx = 0; + + if (window_copy_update_selection(wp)) + window_copy_redraw_lines(wp, data->cy, 1); + else + window_copy_update_cursor(wp); +} + +void +window_copy_cursor_end_of_line(struct window_pane *wp) +{ + struct window_copy_mode_data *data = wp->modedata; + u_int px, py; + + py = screen_hsize(&wp->base) + data->cy - data->oy; + px = window_copy_find_length(wp, py); + + window_copy_set_cursor_x(wp, px); +} + +void window_copy_cursor_left(struct window_pane *wp) { struct window_copy_mode_data *data = wp->modedata; @@ -748,43 +761,13 @@ } out: - /* On screen. */ - if (px > data->ox && px <= data->ox + screen_size_x(s) - 1) - data->cx = px - data->ox; - - /* Off right of screen. */ - if (px > data->ox + screen_size_x(s) - 1) { - /* Move cursor to last and scroll screen. */ - window_copy_scroll_left( - wp, px - data->ox - (screen_size_x(s) - 1)); - data->cx = screen_size_x(s) - 1; - } - - /* Off left of screen. */ - if (px <= data->ox) { - if (px < screen_size_x(s) - 1) { - /* Short enough to fit on screen. */ - window_copy_scroll_right(wp, data->ox); - data->cx = px; - } else { - /* Too long to fit on screen. */ - window_copy_scroll_right( - wp, data->ox - (px - (screen_size_x(s) - 1))); - data->cx = screen_size_x(s) - 1; - } - } - - if (window_copy_update_selection(wp)) - window_copy_redraw_lines(wp, data->cy, 1); - else - window_copy_update_cursor(wp); + window_copy_set_cursor_x(wp, px); } void window_copy_cursor_previous_word(struct window_pane *wp) { struct window_copy_mode_data *data = wp->modedata; - struct screen *s = &data->screen; u_int ox, px, py, skip; ox = px = data->ox + data->cx; @@ -830,36 +813,7 @@ } out: - /* On screen. */ - if (px > data->ox && px <= data->ox + screen_size_x(s) - 1) - data->cx = px - data->ox; - - /* Off right of screen. */ - if (px > data->ox + screen_size_x(s) - 1) { - /* Move cursor to last and scroll screen. */ - window_copy_scroll_left( - wp, px - data->ox - (screen_size_x(s) - 1)); - data->cx = screen_size_x(s) - 1; - } - - /* Off left of screen. */ - if (px <= data->ox) { - if (px < screen_size_x(s) - 1) { - /* Short enough to fit on screen. */ - window_copy_scroll_right(wp, data->ox); - data->cx = px; - } else { - /* Too long to fit on screen. */ - window_copy_scroll_right( - wp, data->ox - (px - (screen_size_x(s) - 1))); - data->cx = screen_size_x(s) - 1; - } - } - - if (window_copy_update_selection(wp)) - window_copy_redraw_lines(wp, data->cy, 1); - else - window_copy_update_cursor(wp); + window_copy_set_cursor_x(wp, px); } void