Hi
On Thu, Feb 11, 2016 at 08:05:54PM +0100, Michal Mazurek wrote:
> Hello,
>
> I know the code is now locked, but I'd like to ask for comments on the
> following diff.
>
> I believe that page-up and halfpage-up should have the same effect as
> running scroll-up (^Y) the equivalent number of times. There are two
> differences:
> - with line select active ('V' by default) pgup/pgdown messes up the
> selection. (steps to reproduce: select a line with 'V', press pgup,
> scroll down with ^E).
> - the 'x' position of the cursor doesn't change, even if the current
> line length becomes shorter.
I like the current behaviour, it is nice that page up then page down
will leave things unchanged no matter what line it ended up on.
>
> The diff below modifies window_copy_pageup() and adds window_copy_pagedown().
> These changes remove the differences.
>
> Both nvi and mg exhibit different behaviours from each other, from what
> is implemented now, and what I'm proposing. mg always moves the cursor
> to position 0. nvi retains the position if the new lines length is equal
> or longer, or moves the position to the first printable character
> otherwise.
>
> If it looks OK I'd like to keep working on it, make
> MODEKEYCOPY_HALFPAGEUP and MODEKEYCOPY_HALFPAGEDOWN use these functions
> as well.
>
> Index: window-copy.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/tmux/window-copy.c,v
> retrieving revision 1.145
> diff -u -p -r1.145 window-copy.c
> --- window-copy.c 5 Feb 2016 10:20:06 -0000 1.145
> +++ window-copy.c 11 Feb 2016 18:22:59 -0000
> @@ -26,6 +26,7 @@
>
> struct screen *window_copy_init(struct window_pane *);
> void window_copy_free(struct window_pane *);
> +void window_copy_pagedown(struct window_pane *);
> void window_copy_resize(struct window_pane *, u_int, u_int);
> void window_copy_key(struct window_pane *, struct client *, struct session *,
> key_code, struct mouse_event *);
> @@ -324,15 +325,80 @@ window_copy_pageup(struct window_pane *w
> {
> struct window_copy_mode_data *data = wp->modedata;
> struct screen *s = &data->screen;
> - u_int n;
> + u_int n, ox, oy;
> +
> + oy = screen_hsize(data->backing) + data->cy - data->oy;
> + ox = window_copy_find_length(wp, oy);
> +
> + if (s->sel.lineflag == LINE_SEL_LEFT_RIGHT && oy == data->sely)
> + window_copy_other_end(wp);
> +
> + if (data->cx != ox) {
> + data->lastcx = data->cx;
> + data->lastsx = ox;
> + }
> + data->cx = data->lastcx;
>
> n = 1;
> if (screen_size_y(s) > 2)
> n = screen_size_y(s) - 2;
> +
> if (data->oy + n > screen_hsize(data->backing))
> data->oy = screen_hsize(data->backing);
> else
> data->oy += n;
> +
> + if (!data->screen.sel.flag || !data->rectflag) {
> + u_int py = screen_hsize(data->backing) + data->cy - data->oy;
> + u_int px = window_copy_find_length(wp, py);
> + if ((data->cx >= data->lastsx && data->cx != px) || data->cx >
> px)
> + window_copy_cursor_end_of_line(wp);
> + }
> +
> + window_copy_update_selection(wp, 1);
> + window_copy_redraw_screen(wp);
> +}
> +
> +void
> +window_copy_pagedown(struct window_pane *wp)
> +{
> + struct window_copy_mode_data *data = wp->modedata;
> + struct screen *s = &data->screen;
> + u_int n, ox, oy;
> +
> + oy = screen_hsize(data->backing) + data->cy - data->oy;
> + ox = window_copy_find_length(wp, oy);
> +
> + if (s->sel.lineflag == LINE_SEL_RIGHT_LEFT && oy == data->sely)
> + window_copy_other_end(wp);
> +
> + if (data->cx != ox) {
> + data->lastcx = data->cx;
> + data->lastsx = ox;
> + }
> + data->cx = data->lastcx;
> +
> + n = 1;
> + if (screen_size_y(s) > 2)
> + n = screen_size_y(s) - 2;
> +
> + if (data->oy < n)
> + data->oy = 0;
> + else
> + data->oy -= n;
> +
> + if (!data->screen.sel.flag || !data->rectflag) {
> + u_int py = screen_hsize(data->backing) + data->cy - data->oy;
> + u_int px = window_copy_find_length(wp, py);
> + if ((data->cx >= data->lastsx && data->cx != px) || data->cx >
> px)
> + window_copy_cursor_end_of_line(wp);
> + }
> +
> + if (data->scroll_exit && data->oy == 0) {
> + window_pane_reset_mode(wp);
> + return;
> + }
> +
> window_copy_update_selection(wp, 1);
> window_copy_redraw_screen(wp);
> }
> @@ -479,21 +545,8 @@ window_copy_key(struct window_pane *wp,
> window_copy_pageup(wp);
> break;
> case MODEKEYCOPY_NEXTPAGE:
> - n = 1;
> - if (screen_size_y(s) > 2)
> - n = screen_size_y(s) - 2;
> - for (; np != 0; np--) {
> - if (data->oy < n)
> - data->oy = 0;
> - else
> - data->oy -= n;
> - }
> - if (data->scroll_exit && data->oy == 0) {
> - window_pane_reset_mode(wp);
> - return;
> - }
> - window_copy_update_selection(wp, 1);
> - window_copy_redraw_screen(wp);
> + for (; np != 0; np--)
> + window_copy_pagedown(wp);
> break;
> case MODEKEYCOPY_HALFPAGEUP:
> n = screen_size_y(s) / 2;
>
> --
> Michal Mazurek
>