=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window-copy.c,v retrieving revision 1.4 retrieving revision 1.5 diff -c -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 **** ! /* $OpenBSD: window-copy.c,v 1.4 2009/07/11 19:09:24 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: window-copy.c,v 1.5 2009/07/12 16:12:34 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott *************** *** 48,53 **** --- 48,54 ---- 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,572 **** return (px); } 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; 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; --- 543,558 ---- 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_set_cursor_x(struct window_pane *wp, u_int px) { struct window_copy_mode_data *data = wp->modedata; struct screen *s = &data->screen; /* On screen. */ if (px > data->ox && px <= data->ox + screen_size_x(s) - 1) data->cx = px - data->ox; *************** *** 600,605 **** --- 586,618 ---- } 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,790 **** } 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); } 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; --- 761,773 ---- } out: ! 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; u_int ox, px, py, skip; ox = px = data->ox + data->cx; *************** *** 830,865 **** } 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); } void --- 813,819 ---- } out: ! window_copy_set_cursor_x(wp, px); } void