diff --git a/screen-write.c b/screen-write.c index e3e09963..cfc56250 100644 --- a/screen-write.c +++ b/screen-write.c @@ -2923,7 +2923,6 @@ screen_write_alternateon(struct screen_write_ctx *ctx, struct grid_cell *gc, { struct tty_ctx ttyctx; struct window_pane *wp = ctx->wp; - struct window_pane_resize *r, *r1; if (wp != NULL && !options_get_number(wp->options, "alternate-screen")) return; @@ -2933,10 +2932,7 @@ screen_write_alternateon(struct screen_write_ctx *ctx, struct grid_cell *gc, return; if (wp != NULL) { - TAILQ_FOREACH_SAFE (r, &wp->resize_queue, entry, r1) { - TAILQ_REMOVE(&wp->resize_queue, r, entry); - free(r); - } + window_pane_clear_resizes(wp, NULL); layout_fix_panes(wp->window, NULL); server_redraw_window_borders(wp->window); } diff --git a/server-client.c b/server-client.c index e20b41ee..4a25c82b 100644 --- a/server-client.c +++ b/server-client.c @@ -1582,7 +1582,7 @@ server_client_resize_timer(__unused int fd, __unused short events, void *data) static void server_client_check_pane_resize(struct window_pane *wp) { - struct window_pane_resize *r, *r1, *first, *last; + struct window_pane_resize *r, *first, *last; struct timeval tv = { .tv_usec = 250000 }; if (TAILQ_EMPTY(&wp->resize_queue)) @@ -1622,10 +1622,7 @@ server_client_check_pane_resize(struct window_pane *wp) } else if (last->sx != first->osx || last->sy != first->osy) { /* Multiple resizes ending up with a different size. */ window_pane_send_resize(wp, last->sx, last->sy); - TAILQ_FOREACH_SAFE(r, &wp->resize_queue, entry, r1) { - TAILQ_REMOVE(&wp->resize_queue, r, entry); - free(r); - } + window_pane_clear_resizes(wp, NULL); } else { /* * Multiple resizes ending up with the same size. There will @@ -1636,12 +1633,7 @@ server_client_check_pane_resize(struct window_pane *wp) */ r = TAILQ_PREV(last, window_pane_resizes, entry); window_pane_send_resize(wp, r->sx, r->sy); - TAILQ_FOREACH_SAFE(r, &wp->resize_queue, entry, r1) { - if (r == last) - break; - TAILQ_REMOVE(&wp->resize_queue, r, entry); - free(r); - } + window_pane_clear_resizes(wp, last); tv.tv_usec = 10000; } evtimer_add(&wp->resize_timer, &tv); diff --git a/tmux.h b/tmux.h index d72a5be8..c9113be6 100644 --- a/tmux.h +++ b/tmux.h @@ -3467,6 +3467,8 @@ struct window_pane *window_pane_find_by_id_str(const char *); struct window_pane *window_pane_find_by_id(u_int); int window_pane_destroy_ready(struct window_pane *); void window_pane_resize(struct window_pane *, u_int, u_int); +void window_pane_clear_resizes(struct window_pane *, + struct window_pane_resize *); int window_pane_set_mode(struct window_pane *, struct window_pane *, const struct window_mode *, struct cmd_find_state *, struct args *); diff --git a/window.c b/window.c index b454c61e..627a362f 100644 --- a/window.c +++ b/window.c @@ -1119,9 +1119,6 @@ window_pane_wait_finish(struct window_pane *wp) static void window_pane_destroy(struct window_pane *wp) { - struct window_pane_resize *r; - struct window_pane_resize *r1; - window_pane_wait_finish(wp); window_pane_reset_mode_all(wp); @@ -1151,10 +1148,7 @@ window_pane_destroy(struct window_pane *wp) event_del(&wp->resize_timer); if (event_initialized(&wp->sync_timer)) event_del(&wp->sync_timer); - TAILQ_FOREACH_SAFE(r, &wp->resize_queue, entry, r1) { - TAILQ_REMOVE(&wp->resize_queue, r, entry); - free(r); - } + window_pane_clear_resizes(wp, NULL); RB_REMOVE(window_pane_tree, &all_window_panes, wp); @@ -1222,6 +1216,19 @@ window_pane_set_event(struct window_pane *wp) bufferevent_enable(wp->event, EV_READ|EV_WRITE); } +void +window_pane_clear_resizes(struct window_pane *wp, struct window_pane_resize *except) +{ + struct window_pane_resize *r, *r1; + + TAILQ_FOREACH_SAFE(r, &wp->resize_queue, entry, r1) { + if (r == except) + continue; + TAILQ_REMOVE(&wp->resize_queue, r, entry); + free(r); + } +} + void window_pane_resize(struct window_pane *wp, u_int sx, u_int sy) {