From 4bc0a83d51624911195fb4b033f51aa7bca43e54 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 20 Apr 2020 06:07:39 +0000 Subject: [PATCH 1/2] Need to check for pane redrawing even if just the window flag is set (the pane flag may not have been previously set to avoid looping the windows). --- server-client.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/server-client.c b/server-client.c index 6eda2b45..18f44ff9 100644 --- a/server-client.c +++ b/server-client.c @@ -1726,11 +1726,15 @@ server_client_check_redraw(struct client *c) log_debug("redraw timer started"); evtimer_add(&ev, &tv); } - if (new_flags & CLIENT_REDRAWPANES) { + + if (~c->flags & CLIENT_REDRAWWINDOW) { c->redraw_panes = 0; TAILQ_FOREACH(wp, &w->panes, entry) { - if (wp->flags & PANE_REDRAW) + if (wp->flags & PANE_REDRAW) { + log_debug("%s: pane %%%u needs redraw", + c->name, wp->id); c->redraw_panes |= (1 << bit); + } if (++bit == 64) { /* * If more that 64 panes, give up and @@ -1741,6 +1745,8 @@ server_client_check_redraw(struct client *c) break; } } + if (c->redraw_panes != 0) + c->flags |= CLIENT_REDRAWPANES; } c->flags |= new_flags; return; From b846ec266571be41e84ebda4480484db73416c81 Mon Sep 17 00:00:00 2001 From: nicm Date: Mon, 20 Apr 2020 06:08:37 +0000 Subject: [PATCH 2/2] Only trim blank lines when the source pane is not the target pane, otherwise the cursor moves which is a bit strange. --- window-copy.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/window-copy.c b/window-copy.c index 45a47675..2bda5d56 100644 --- a/window-copy.c +++ b/window-copy.c @@ -299,7 +299,7 @@ window_copy_scroll_timer(__unused int fd, __unused short events, void *arg) static struct screen * window_copy_clone_screen(struct screen *src, struct screen *hint, u_int *cx, - u_int *cy) + u_int *cy, int trim) { struct screen *dst; u_int sy; @@ -308,11 +308,13 @@ window_copy_clone_screen(struct screen *src, struct screen *hint, u_int *cx, dst = xcalloc(1, sizeof *dst); sy = screen_hsize(src) + screen_size_y(src); - while (sy > screen_hsize(src)) { - gl = grid_peek_line(src->grid, sy - 1); - if (gl->cellused != 0) - break; - sy--; + if (trim) { + while (sy > screen_hsize(src)) { + gl = grid_peek_line(src->grid, sy - 1); + if (gl->cellused != 0) + break; + sy--; + } } log_debug("%s: target screen is %ux%u, source %ux%u", __func__, screen_size_x(src), sy, screen_size_x(hint), @@ -386,7 +388,8 @@ window_copy_init(struct window_mode_entry *wme, u_int i, cx, cy; data = window_copy_common_init(wme); - data->backing = window_copy_clone_screen(base, &data->screen, &cx, &cy); + data->backing = window_copy_clone_screen(base, &data->screen, &cx, &cy, + wme->swp != wme->wp); if (cy < screen_hsize(data->backing)) { data->cx = cx; @@ -2042,7 +2045,7 @@ window_copy_cmd_refresh_from_pane(struct window_copy_cmd_state *cs) screen_free(data->backing); free(data->backing); data->backing = window_copy_clone_screen(&wp->base, &data->screen, NULL, - NULL); + NULL, wme->swp != wme->wp); window_copy_size_changed(wme); return (WINDOW_COPY_CMD_REDRAW);