summaryrefslogtreecommitdiffstats
path: root/resize.c
diff options
context:
space:
mode:
authornicm <nicm>2019-09-19 09:02:30 +0000
committernicm <nicm>2019-09-19 09:02:30 +0000
commit647887b794c00285047aa54ac0d44ae50c7847d7 (patch)
treec173a9c9f68dd40248df0b0685189241c074ec4d /resize.c
parentd01847735903496c25e1d24375b911edffa56ef8 (diff)
Add a "latest" window-size option which tries to size windows based on
the most recently used client. From Tommie Gannert in GitHub issue 1869 based on earlier changes from me.
Diffstat (limited to 'resize.c')
-rw-r--r--resize.c183
1 files changed, 111 insertions, 72 deletions
diff --git a/resize.c b/resize.c
index 0e0b070d..b1a4b590 100644
--- a/resize.c
+++ b/resize.c
@@ -150,14 +150,121 @@ done:
}
void
-recalculate_sizes(void)
+recalculate_size(struct window *w)
{
struct session *s;
struct client *c;
- struct window *w;
u_int sx, sy, cx, cy;
int type, current, has, changed;
+ if (w->active == NULL)
+ return;
+ log_debug("%s: @%u is %u,%u", __func__, w->id, w->sx, w->sy);
+
+ type = options_get_number(w->options, "window-size");
+ current = options_get_number(w->options, "aggressive-resize");
+
+ changed = 1;
+ switch (type) {
+ case WINDOW_SIZE_LARGEST:
+ sx = sy = 0;
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (ignore_client_size(c))
+ continue;
+ s = c->session;
+
+ if (current)
+ has = (s->curw->window == w);
+ else
+ has = session_has(s, w);
+ if (!has)
+ continue;
+
+ cx = c->tty.sx;
+ cy = c->tty.sy - status_line_size(c);
+
+ if (cx > sx)
+ sx = cx;
+ if (cy > sy)
+ sy = cy;
+ }
+ if (sx == 0 || sy == 0)
+ changed = 0;
+ break;
+ case WINDOW_SIZE_SMALLEST:
+ sx = sy = UINT_MAX;
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (ignore_client_size(c))
+ continue;
+ s = c->session;
+
+ if (current)
+ has = (s->curw->window == w);
+ else
+ has = session_has(s, w);
+ if (!has)
+ continue;
+
+ cx = c->tty.sx;
+ cy = c->tty.sy - status_line_size(c);
+
+ if (cx < sx)
+ sx = cx;
+ if (cy < sy)
+ sy = cy;
+ }
+ if (sx == UINT_MAX || sy == UINT_MAX)
+ changed = 0;
+ break;
+ case WINDOW_SIZE_LATEST:
+ sx = sy = UINT_MAX;
+ TAILQ_FOREACH(c, &clients, entry) {
+ if (ignore_client_size(c))
+ continue;
+ if (c != w->latest)
+ continue;
+ s = c->session;
+
+ if (current)
+ has = (s->curw->window == w);
+ else
+ has = session_has(s, w);
+ if (!has)
+ continue;
+
+ cx = c->tty.sx;
+ cy = c->tty.sy - status_line_size(c);
+
+ if (cx < sx)
+ sx = cx;
+ if (cy < sy)
+ sy = cy;
+ }
+ if (sx == UINT_MAX || sy == UINT_MAX)
+ changed = 0;
+ break;
+ case WINDOW_SIZE_MANUAL:
+ changed = 0;
+ break;
+ }
+ if (changed && w->sx == sx && w->sy == sy)
+ changed = 0;
+
+ if (!changed) {
+ tty_update_window_offset(w);
+ return;
+ }
+ log_debug("%s: @%u changed to %u,%u", __func__, w->id, sx, sy);
+ resize_window(w, sx, sy);
+}
+
+void
+recalculate_sizes(void)
+{
+ struct session *s;
+ struct client *c;
+ struct window *w;
+
/*
* Clear attached count and update saved status line information for
* each session.
@@ -183,74 +290,6 @@ recalculate_sizes(void)
}
/* Walk each window and adjust the size. */
- RB_FOREACH(w, windows, &windows) {
- if (w->active == NULL)
- continue;
- log_debug("%s: @%u is %u,%u", __func__, w->id, w->sx, w->sy);
-
- type = options_get_number(w->options, "window-size");
- if (type == WINDOW_SIZE_MANUAL)
- continue;
- current = options_get_number(w->options, "aggressive-resize");
-
- changed = 1;
- if (type == WINDOW_SIZE_LARGEST) {
- sx = sy = 0;
- TAILQ_FOREACH(c, &clients, entry) {
- if (ignore_client_size(c))
- continue;
- s = c->session;
-
- if (current)
- has = (s->curw->window == w);
- else
- has = session_has(s, w);
- if (!has)
- continue;
-
- cx = c->tty.sx;
- cy = c->tty.sy - status_line_size(c);
-
- if (cx > sx)
- sx = cx;
- if (cy > sy)
- sy = cy;
- }
- if (sx == 0 || sy == 0)
- changed = 0;
- } else {
- sx = sy = UINT_MAX;
- TAILQ_FOREACH(c, &clients, entry) {
- if (ignore_client_size(c))
- continue;
- s = c->session;
-
- if (current)
- has = (s->curw->window == w);
- else
- has = session_has(s, w);
- if (!has)
- continue;
-
- cx = c->tty.sx;
- cy = c->tty.sy - status_line_size(c);
-
- if (cx < sx)
- sx = cx;
- if (cy < sy)
- sy = cy;
- }
- if (sx == UINT_MAX || sy == UINT_MAX)
- changed = 0;
- }
- if (w->sx == sx && w->sy == sy)
- changed = 0;
-
- if (!changed) {
- tty_update_window_offset(w);
- continue;
- }
- log_debug("%s: @%u changed to %u,%u", __func__, w->id, sx, sy);
- resize_window(w, sx, sy);
- }
+ RB_FOREACH(w, windows, &windows)
+ recalculate_size(w);
}