Limit lazy resize to panes in attached sessions only - those in

unattached are likely to have been resized by something like
split-window where the user probably wants the resize to happen
immediately. GitHub issue 1963.
pull/1964/head
nicm 2019-11-01 20:26:21 +00:00
parent d9c95c900c
commit bad95db878
1 changed files with 17 additions and 3 deletions

View File

@ -1268,7 +1268,7 @@ server_client_loop(void)
struct window_pane *wp; struct window_pane *wp;
struct winlink *wl; struct winlink *wl;
struct session *s; struct session *s;
int focus; int focus, attached, resize;
TAILQ_FOREACH(c, &clients, entry) { TAILQ_FOREACH(c, &clients, entry) {
server_client_check_exit(c); server_client_check_exit(c);
@ -1281,19 +1281,33 @@ server_client_loop(void)
/* /*
* Any windows will have been redrawn as part of clients, so clear * Any windows will have been redrawn as part of clients, so clear
* their flags now. Also check pane focus and resize. * their flags now. Also check pane focus and resize.
*
* As an optimization, panes in windows that are in an attached session
* but not the current window are not resized (this reduces the amount
* of work needed when, for example, resizing an X terminal a
* lot). Windows in no attached session are resized immediately since
* that is likely to have come from a command like split-window and be
* what the user wanted.
*/ */
focus = options_get_number(global_options, "focus-events"); focus = options_get_number(global_options, "focus-events");
RB_FOREACH(w, windows, &windows) { RB_FOREACH(w, windows, &windows) {
attached = resize = 0;
TAILQ_FOREACH(wl, &w->winlinks, wentry) { TAILQ_FOREACH(wl, &w->winlinks, wentry) {
s = wl->session; s = wl->session;
if (s->attached != 0 && s->curw == wl) if (s->attached != 0)
attached = 1;
if (s->attached != 0 && s->curw == wl) {
resize = 1;
break; break;
}
} }
if (!attached)
resize = 1;
TAILQ_FOREACH(wp, &w->panes, entry) { TAILQ_FOREACH(wp, &w->panes, entry) {
if (wp->fd != -1) { if (wp->fd != -1) {
if (focus) if (focus)
server_client_check_focus(wp); server_client_check_focus(wp);
if (wl != NULL) if (resize)
server_client_check_resize(wp); server_client_check_resize(wp);
} }
wp->flags &= ~PANE_REDRAW; wp->flags &= ~PANE_REDRAW;