diff --git a/cmd-copy-mode.c b/cmd-copy-mode.c index eae7698f..fce6d3fb 100644 --- a/cmd-copy-mode.c +++ b/cmd-copy-mode.c @@ -63,6 +63,7 @@ cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item) struct client *c = cmdq_get_client(item); struct session *s; struct window_pane *wp = target->wp, *swp; + u_int tty_ox, tty_oy, tty_sx, tty_sy; int line_numbers; if (args_has(args, 'q')) { @@ -100,8 +101,9 @@ cmd_copy_mode_exec(struct cmd *self, struct cmdq_item *item) if (args_has(args, 'd')) window_copy_pagedown(wp, 0, args_has(args, 'e')); if (args_has(args, 'S')) { + tty_window_offset(&c->tty, &tty_ox, &tty_oy, &tty_sx, &tty_sy); window_copy_scroll(wp, c->tty.mouse_slider_mpos, event->m.y, - args_has(args, 'e')); + tty_oy, args_has(args, 'e')); return (CMD_RETURN_NORMAL); } diff --git a/tmux.h b/tmux.h index 612d7008..524748ae 100644 --- a/tmux.h +++ b/tmux.h @@ -3566,7 +3566,7 @@ void printflike(3, 4) window_copy_add(struct window_pane *, int, const char *, ...); void printflike(3, 0) window_copy_vadd(struct window_pane *, int, const char *, va_list); -void window_copy_scroll(struct window_pane *, int, u_int, int); +void window_copy_scroll(struct window_pane *, int, u_int, u_int, int); void window_copy_pageup(struct window_pane *, int); void window_copy_pagedown(struct window_pane *, int, int); void window_copy_start_drag(struct client *, struct mouse_event *); diff --git a/window-copy.c b/window-copy.c index a02c99c1..39ae1881 100644 --- a/window-copy.c +++ b/window-copy.c @@ -42,7 +42,7 @@ static void window_copy_formats(struct window_mode_entry *, struct format_tree *); static struct screen *window_copy_get_screen(struct window_mode_entry *); static void window_copy_scroll1(struct window_mode_entry *, - struct window_pane *wp, int, u_int, int); + struct window_pane *, int, u_int, u_int, int); static void window_copy_pageup1(struct window_mode_entry *, int); static int window_copy_pagedown1(struct window_mode_entry *, int, int); static void window_copy_next_paragraph(struct window_mode_entry *); @@ -629,19 +629,19 @@ window_copy_vadd(struct window_pane *wp, int parse, const char *fmt, va_list ap) void window_copy_scroll(struct window_pane *wp, int sl_mpos, u_int my, - int scroll_exit) + u_int tty_oy, int scroll_exit) { struct window_mode_entry *wme = TAILQ_FIRST(&wp->modes); if (wme != NULL) { window_set_active_pane(wp->window, wp, 0); - window_copy_scroll1(wme, wp, sl_mpos, my, scroll_exit); + window_copy_scroll1(wme, wp, sl_mpos, my, tty_oy, scroll_exit); } } static void window_copy_scroll1(struct window_mode_entry *wme, struct window_pane *wp, - int sl_mpos, u_int my, int scroll_exit) + int sl_mpos, u_int my, u_int tty_oy, int scroll_exit) { struct window_copy_mode_data *data = wme->data; u_int ox, oy, px, py, n, offset, size; @@ -649,21 +649,29 @@ window_copy_scroll1(struct window_mode_entry *wme, struct window_pane *wp, u_int slider_height = wp->sb_slider_h; u_int sb_height = wp->sy, sb_top = wp->yoff; u_int sy = screen_size_y(data->backing); + u_int my_w; int new_slider_y, delta; /* * sl_mpos is where in the slider the user is dragging, mouse is * dragging this y point relative to top of slider. + * + * my is a raw tty y coordinate; sb_top (= wp->yoff) is a window + * coordinate. Convert my to window coordinates by adding tty_oy (the + * window pan offset). sl_mpos already has the status lines adjustment + * baked in (see server_client_check_mouse), so no further status lines + * correction is needed here. */ - if (my <= sb_top + sl_mpos) { + my_w = my + tty_oy; + if (my_w <= sb_top + (u_int)sl_mpos) { /* Slider banged into top. */ new_slider_y = sb_top - wp->yoff; - } else if (my - sl_mpos > sb_top + sb_height - slider_height) { + } else if (my_w - sl_mpos > sb_top + sb_height - slider_height) { /* Slider banged into bottom. */ new_slider_y = sb_top - wp->yoff + (sb_height - slider_height); } else { /* Slider is somewhere in the middle. */ - new_slider_y = my - wp->yoff - sl_mpos; + new_slider_y = my_w - wp->yoff - sl_mpos; } if (TAILQ_FIRST(&wp->modes) == NULL || @@ -1548,8 +1556,11 @@ window_copy_cmd_scroll_to_mouse(struct window_copy_cmd_state *cs) struct client *c = cs->c; struct mouse_event *m = cs->m; int scroll_exit = args_has(cs->wargs, 'e'); + u_int tty_ox, tty_oy, tty_sx, tty_sy; - window_copy_scroll(wp, c->tty.mouse_slider_mpos, m->y, scroll_exit); + tty_window_offset(&c->tty, &tty_ox, &tty_oy, &tty_sx, &tty_sy); + window_copy_scroll(wp, c->tty.mouse_slider_mpos, m->y, tty_oy, + scroll_exit); return (WINDOW_COPY_CMD_NOTHING); } @@ -4981,7 +4992,7 @@ window_copy_write_lines(struct window_mode_entry *wme, u_int yy; for (yy = py; yy < py + ny; yy++) - window_copy_write_line(wme, ctx, py); + window_copy_write_line(wme, ctx, yy); } static void