From 7238ecfd40f3db3ba3a4f4ad5f79e60729979d73 Mon Sep 17 00:00:00 2001 From: nicm Date: Thu, 11 Jun 2026 14:19:59 +0000 Subject: [PATCH] Add a helper to free the list of pending resizes. --- usr.bin/tmux/screen-write.c | 8 ++------ usr.bin/tmux/server-client.c | 16 ++++------------ usr.bin/tmux/tmux.h | 4 +++- usr.bin/tmux/window.c | 23 +++++++++++++++-------- 4 files changed, 24 insertions(+), 27 deletions(-) diff --git a/usr.bin/tmux/screen-write.c b/usr.bin/tmux/screen-write.c index cb32075b9b7..cb9b2b04c17 100644 --- a/usr.bin/tmux/screen-write.c +++ b/usr.bin/tmux/screen-write.c @@ -1,4 +1,4 @@ -/* $OpenBSD: screen-write.c,v 1.266 2026/06/09 21:22:22 nicm Exp $ */ +/* $OpenBSD: screen-write.c,v 1.267 2026/06/11 14:19:59 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -2772,7 +2772,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; @@ -2782,10 +2781,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/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c index ef8a506c8c0..a6e5038b4f8 100644 --- a/usr.bin/tmux/server-client.c +++ b/usr.bin/tmux/server-client.c @@ -1,4 +1,4 @@ -/* $OpenBSD: server-client.c,v 1.464 2026/06/08 23:06:21 nicm Exp $ */ +/* $OpenBSD: server-client.c,v 1.465 2026/06/11 14:19:59 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -1586,7 +1586,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)) @@ -1626,10 +1626,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 @@ -1640,12 +1637,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/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index ff4fdefd704..910be95a3fa 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.1344 2026/06/11 10:16:19 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.1345 2026/06/11 14:19:59 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -3418,6 +3418,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/usr.bin/tmux/window.c b/usr.bin/tmux/window.c index 7a4ff7d1318..a59cc902fcd 100644 --- a/usr.bin/tmux/window.c +++ b/usr.bin/tmux/window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.334 2026/06/10 16:03:14 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.335 2026/06/11 14:19:59 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1112,9 +1112,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); @@ -1140,10 +1137,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); @@ -1211,6 +1205,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) {