From e11295f42d55a387d1609dde7ff7e2c7745c2be2 Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 14 Apr 2020 18:33:01 +0000 Subject: [PATCH 1/2] Adjust cursor and scroll positions when entering copy mode so that the cursor line is still visible even if the source and target panes are different heights. --- window-copy.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/window-copy.c b/window-copy.c index efb4a43f..90c4b45f 100644 --- a/window-copy.c +++ b/window-copy.c @@ -376,10 +376,18 @@ window_copy_init(struct window_mode_entry *wme, u_int i; data = window_copy_common_init(wme); - data->backing = window_copy_clone_screen(&wp->base, &data->screen); - data->cx = data->backing->cx; - data->cy = data->backing->cy; + + data->cx = wp->base.cx; + if (data->cx > screen_size_x(&data->screen) - 1) + data->cx = screen_size_x(&data->screen) - 1; + + data->cy = screen_hsize(&wp->base) + wp->base.cy; + if (data->cy < screen_hsize(data->backing)) { + data->oy = screen_hsize(data->backing) - data->cy; + data->cy = 0; + } else + data->cy -= screen_hsize(data->backing); data->scroll_exit = args_has(args, 'e'); data->hide_position = args_has(args, 'H'); From b9a00cbe8ac7436008b9697de4b738ebed19ed8c Mon Sep 17 00:00:00 2001 From: nicm Date: Tue, 14 Apr 2020 19:07:10 +0000 Subject: [PATCH 2/2] Leave the cursor above empty lines. --- window-copy.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/window-copy.c b/window-copy.c index 90c4b45f..f6f29f9a 100644 --- a/window-copy.c +++ b/window-copy.c @@ -130,8 +130,6 @@ static void window_copy_rectangle_toggle(struct window_mode_entry *); static void window_copy_move_mouse(struct mouse_event *); static void window_copy_drag_update(struct client *, struct mouse_event *); static void window_copy_drag_release(struct client *, struct mouse_event *); -static struct screen *window_copy_clone_screen(struct screen *, - struct screen *); const struct window_mode window_copy_mode = { .name = "copy-mode", @@ -322,7 +320,7 @@ window_copy_clone_screen(struct screen *src, struct screen *hint) } screen_write_start(&ctx, NULL, dst); - screen_write_cursormove(&ctx, 0, dst->grid->sy - 1, 0); + screen_write_cursormove(&ctx, 0, dst->grid->sy + sy - dy - 1, 0); screen_write_stop(&ctx); return (dst);