summaryrefslogtreecommitdiffstats
path: root/usr.bin/tmux/resize.c
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2019-09-19 09:02:30 +0000
committernicm <nicm@openbsd.org>2019-09-19 09:02:30 +0000
commitf4f81a00557dfad34279abe62ce21732ae07678a (patch)
tree81382dac5aa6144673df2af3263f2fa29a0feae6 /usr.bin/tmux/resize.c
parentDo not use bright when emulating 256 colours on an 8 colour terminal (diff)
downloadwireguard-openbsd-f4f81a00557dfad34279abe62ce21732ae07678a.tar.xz
wireguard-openbsd-f4f81a00557dfad34279abe62ce21732ae07678a.zip
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 'usr.bin/tmux/resize.c')
-rw-r--r--usr.bin/tmux/resize.c185
1 files changed, 112 insertions, 73 deletions
diff --git a/usr.bin/tmux/resize.c b/usr.bin/tmux/resize.c
index c1f88eb3146..04e3f9d6723 100644
--- a/usr.bin/tmux/resize.c
+++ b/usr.bin/tmux/resize.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: resize.c,v 1.32 2019/05/11 06:34:56 nicm Exp $ */
+/* $OpenBSD: resize.c,v 1.33 2019/09/19 09:02:30 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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);
}