Fix resizing of control clients, should be ignored until SIZECHANGED flag set.

This commit is contained in:
nicm 2019-03-12 13:56:30 +00:00
parent 303d20a758
commit 028f9d1d87
4 changed files with 27 additions and 26 deletions

View File

@ -222,9 +222,7 @@ cmd_new_session_exec(struct cmd *self, struct cmdq_item *item)
if (!detached && !is_control) {
sx = c->tty.sx;
sy = c->tty.sy;
if (!is_control &&
sy > 0 &&
options_get_number(global_s_options, "status"))
if (sy > 0 && options_get_number(global_s_options, "status"))
sy--;
} else {
value = options_get_string(global_s_options, "default-size");

View File

@ -61,6 +61,18 @@ resize_window(struct window *w, u_int sx, u_int sy)
notify_window("window-layout-changed", w);
}
static int
ignore_client_size(struct client *c)
{
if (c->session == NULL)
return (1);
if (c->flags & CLIENT_NOSIZEFLAGS)
return (1);
if ((c->flags & CLIENT_CONTROL) && (~c->flags & CLIENT_SIZECHANGED))
return (1);
return (0);
}
void
default_window_size(struct session *s, struct window *w, u_int *sx, u_int *sy,
int type)
@ -77,9 +89,7 @@ default_window_size(struct session *s, struct window *w, u_int *sx, u_int *sy,
if (type == WINDOW_SIZE_LARGEST) {
*sx = *sy = 0;
TAILQ_FOREACH(c, &clients, entry) {
if (c->session == NULL)
continue;
if (c->flags & CLIENT_NOSIZEFLAGS)
if (ignore_client_size(c))
continue;
if (w != NULL && !session_has(c->session, w))
continue;
@ -99,9 +109,7 @@ default_window_size(struct session *s, struct window *w, u_int *sx, u_int *sy,
} else {
*sx = *sy = UINT_MAX;
TAILQ_FOREACH(c, &clients, entry) {
if (c->session == NULL)
continue;
if (c->flags & CLIENT_NOSIZEFLAGS)
if (ignore_client_size(c))
continue;
if (w != NULL && !session_has(c->session, w))
continue;
@ -146,7 +154,7 @@ recalculate_sizes(void)
struct client *c;
struct window *w;
u_int sx, sy, cx, cy;
int flags, type, current, has, changed;
int type, current, has, changed;
/*
* Clear attached count and update saved status line information for
@ -162,21 +170,13 @@ recalculate_sizes(void)
* client.
*/
TAILQ_FOREACH(c, &clients, entry) {
if ((s = c->session) == NULL)
if (ignore_client_size(c))
continue;
flags = c->flags;
if (flags & CLIENT_SUSPENDED)
continue;
if ((flags & CLIENT_CONTROL) && (~flags & CLIENT_SIZECHANGED))
continue;
if (c->tty.sy <= status_line_size(c))
c->flags |= CLIENT_STATUSOFF;
else
c->flags &= ~CLIENT_STATUSOFF;
s->attached++;
c->session->attached++;
}
/* Walk each window and adjust the size. */
@ -194,8 +194,10 @@ recalculate_sizes(void)
if (type == WINDOW_SIZE_LARGEST) {
sx = sy = 0;
TAILQ_FOREACH(c, &clients, entry) {
if ((s = c->session) == NULL)
if (ignore_client_size(c))
continue;
s = c->session;
if (current)
has = (s->curw->window == w);
else
@ -216,8 +218,10 @@ recalculate_sizes(void)
} else {
sx = sy = UINT_MAX;
TAILQ_FOREACH(c, &clients, entry) {
if ((s = c->session) == NULL)
if (ignore_client_size(c))
continue;
s = c->session;
if (current)
has = (s->curw->window == w);
else

3
tmux.h
View File

@ -1393,8 +1393,7 @@ struct client {
CLIENT_REDRAWSTATUSALWAYS| \
CLIENT_REDRAWBORDERS)
#define CLIENT_NOSIZEFLAGS \
(CLIENT_EXIT| \
CLIENT_DEAD| \
(CLIENT_DEAD| \
CLIENT_SUSPENDED| \
CLIENT_DETACHING)
int flags;

View File

@ -503,8 +503,8 @@ window_get_active_at(struct window *w, u_int x, u_int y)
struct window_pane *wp;
TAILQ_FOREACH(wp, &w->panes, entry) {
if (!window_pane_visible(wp))
continue;
if (!window_pane_visible(wp))
continue;
if (x < wp->xoff || x > wp->xoff + wp->sx)
continue;
if (y < wp->yoff || y > wp->yoff + wp->sy)