summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2019-03-12 13:56:30 +0000
committernicm <nicm>2019-03-12 13:56:30 +0000
commit028f9d1d879255f9dbb80df53f44d37736b68e00 (patch)
treebf4923dec5a310116d6171b780ce21a7b3d65d51
parent303d20a758a2779f76854b6df10f8764e44fc407 (diff)
Fix resizing of control clients, should be ignored until SIZECHANGED flag set.
-rw-r--r--cmd-new-session.c4
-rw-r--r--resize.c42
-rw-r--r--tmux.h3
-rw-r--r--window.c4
4 files changed, 27 insertions, 26 deletions
diff --git a/cmd-new-session.c b/cmd-new-session.c
index 162a50bd..e1be350b 100644
--- a/cmd-new-session.c
+++ b/cmd-new-session.c
@@ -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");
diff --git a/resize.c b/resize.c
index 2134165f..3726298f 100644
--- a/resize.c
+++ b/resize.c
@@ -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)
- continue;
-
- flags = c->flags;
- if (flags & CLIENT_SUSPENDED)
- continue;
- if ((flags & CLIENT_CONTROL) && (~flags & CLIENT_SIZECHANGED))
+ if (ignore_client_size(c))
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
diff --git a/tmux.h b/tmux.h
index 329af6b2..beb862dd 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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;
diff --git a/window.c b/window.c
index 05adc586..117c47e7 100644
--- a/window.c
+++ b/window.c
@@ -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)