summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authornicm <nicm@openbsd.org>2020-05-16 16:50:55 +0000
committernicm <nicm@openbsd.org>2020-05-16 16:50:55 +0000
commit061703b1ecda7e16a6e1803e0b9638d52de703df (patch)
tree74e03a6059dadf576eb7dfc789d1cbc9cb0606a6 /usr.bin
parentOn select-window, make this client the latest client for the window. (diff)
downloadwireguard-openbsd-061703b1ecda7e16a6e1803e0b9638d52de703df.tar.xz
wireguard-openbsd-061703b1ecda7e16a6e1803e0b9638d52de703df.zip
Move lazy resize from the pane to the window, there is no point in
resizing the window unless it is the current window, and if we do and don't resize the pane until later there are problems if the size changes from A to B then back to A.
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/tmux/cmd-set-option.c3
-rw-r--r--usr.bin/tmux/cmd-show-messages.c4
-rw-r--r--usr.bin/tmux/resize.c27
-rw-r--r--usr.bin/tmux/server-client.c64
-rw-r--r--usr.bin/tmux/tmux.h8
-rw-r--r--usr.bin/tmux/window.c7
6 files changed, 69 insertions, 44 deletions
diff --git a/usr.bin/tmux/cmd-set-option.c b/usr.bin/tmux/cmd-set-option.c
index d2013192d3c..24b8a22c4dc 100644
--- a/usr.bin/tmux/cmd-set-option.c
+++ b/usr.bin/tmux/cmd-set-option.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-set-option.c,v 1.135 2020/05/16 16:02:24 nicm Exp $ */
+/* $OpenBSD: cmd-set-option.c,v 1.136 2020/05/16 16:50:55 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -18,7 +18,6 @@
#include <sys/types.h>
-#include <fnmatch.h>
#include <stdlib.h>
#include <string.h>
diff --git a/usr.bin/tmux/cmd-show-messages.c b/usr.bin/tmux/cmd-show-messages.c
index 9d1c25659db..5f04e2c70b4 100644
--- a/usr.bin/tmux/cmd-show-messages.c
+++ b/usr.bin/tmux/cmd-show-messages.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-show-messages.c,v 1.34 2020/05/16 16:02:24 nicm Exp $ */
+/* $OpenBSD: cmd-show-messages.c,v 1.35 2020/05/16 16:50:55 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -27,7 +27,7 @@
#include "tmux.h"
/*
- * Show client message log.
+ * Show message log.
*/
#define SHOW_MESSAGES_TEMPLATE \
diff --git a/usr.bin/tmux/resize.c b/usr.bin/tmux/resize.c
index 560d47effcc..b37ddfbcb20 100644
--- a/usr.bin/tmux/resize.c
+++ b/usr.bin/tmux/resize.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: resize.c,v 1.39 2020/05/16 15:45:29 nicm Exp $ */
+/* $OpenBSD: resize.c,v 1.40 2020/05/16 16:50:55 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -61,6 +61,7 @@ resize_window(struct window *w, u_int sx, u_int sy, int xpixel, int ypixel)
tty_update_window_offset(w);
server_redraw_window(w);
notify_window("window-layout-changed", w);
+ w->flags &= ~WINDOW_RESIZE;
}
static int
@@ -346,16 +347,30 @@ recalculate_size(struct window *w)
changed = 0;
break;
}
- if (changed && w->sx == sx && w->sy == sy)
- changed = 0;
+ if (w->flags & WINDOW_RESIZE) {
+ if (changed && w->new_sx == sx && w->new_sy == sy)
+ changed = 0;
+ } else {
+ 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 (%ux%u)", __func__, w->id, sx, sy,
- xpixel, ypixel);
- resize_window(w, sx, sy, xpixel, ypixel);
+ log_debug("%s: @%u new size %u,%u", __func__, w->id, sx, sy);
+ if (type == WINDOW_SIZE_MANUAL)
+ resize_window(w, sx, sy, xpixel, ypixel);
+ else {
+ w->new_sx = sx;
+ w->new_sy = sy;
+ w->new_xpixel = xpixel;
+ w->new_ypixel = ypixel;
+
+ w->flags |= WINDOW_RESIZE;
+ tty_update_window_offset(w);
+ }
}
void
diff --git a/usr.bin/tmux/server-client.c b/usr.bin/tmux/server-client.c
index 7c878911e24..092b0a8f4e9 100644
--- a/usr.bin/tmux/server-client.c
+++ b/usr.bin/tmux/server-client.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: server-client.c,v 1.343 2020/05/16 16:35:13 nicm Exp $ */
+/* $OpenBSD: server-client.c,v 1.344 2020/05/16 16:50:55 nicm Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -33,8 +33,9 @@
#include "tmux.h"
static void server_client_free(int, short, void *);
-static void server_client_check_focus(struct window_pane *);
-static void server_client_check_resize(struct window_pane *);
+static void server_client_check_pane_focus(struct window_pane *);
+static void server_client_check_pane_resize(struct window_pane *);
+static void server_client_check_window_resize(struct window *);
static key_code server_client_check_mouse(struct client *, struct key_event *);
static void server_client_repeat_timer(int, short, void *);
static void server_client_click_timer(int, short, void *);
@@ -1341,10 +1342,13 @@ server_client_loop(void)
struct client *c;
struct window *w;
struct window_pane *wp;
- struct winlink *wl;
- struct session *s;
- int focus, attached, resize;
+ int focus;
+
+ /* Check for window resize. This is done before redrawing. */
+ RB_FOREACH(w, windows, &windows)
+ server_client_check_window_resize(w);
+ /* Check clients. */
TAILQ_FOREACH(c, &clients, entry) {
server_client_check_exit(c);
if (c->session != NULL) {
@@ -1356,34 +1360,14 @@ server_client_loop(void)
/*
* Any windows will have been redrawn as part of clients, so clear
* 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");
RB_FOREACH(w, windows, &windows) {
- attached = resize = 0;
- TAILQ_FOREACH(wl, &w->winlinks, wentry) {
- s = wl->session;
- if (s->attached != 0)
- attached = 1;
- if (s->attached != 0 && s->curw == wl) {
- resize = 1;
- break;
- }
- }
- if (!attached)
- resize = 1;
TAILQ_FOREACH(wp, &w->panes, entry) {
if (wp->fd != -1) {
if (focus)
- server_client_check_focus(wp);
- if (resize)
- server_client_check_resize(wp);
+ server_client_check_pane_focus(wp);
+ server_client_check_pane_resize(wp);
}
wp->flags &= ~PANE_REDRAW;
}
@@ -1391,6 +1375,26 @@ server_client_loop(void)
}
}
+/* Check if window needs to be resized. */
+static void
+server_client_check_window_resize(struct window *w)
+{
+ struct winlink *wl;
+
+ if (~w->flags & WINDOW_RESIZE)
+ return;
+
+ TAILQ_FOREACH(wl, &w->winlinks, wentry) {
+ if (wl->session->attached != 0 && wl->session->curw == wl)
+ break;
+ }
+ if (wl == NULL)
+ return;
+
+ log_debug("%s: resizing window @%u", __func__, w->id);
+ resize_window(w, w->new_sx, w->new_sy, w->new_xpixel, w->new_ypixel);
+}
+
/* Check if we need to force a resize. */
static int
server_client_resize_force(struct window_pane *wp)
@@ -1472,7 +1476,7 @@ server_client_resize_event(__unused int fd, __unused short events, void *data)
/* Check if pane should be resized. */
static void
-server_client_check_resize(struct window_pane *wp)
+server_client_check_pane_resize(struct window_pane *wp)
{
if (~wp->flags & PANE_RESIZE)
return;
@@ -1490,7 +1494,7 @@ server_client_check_resize(struct window_pane *wp)
/* Check whether pane should be focused. */
static void
-server_client_check_focus(struct window_pane *wp)
+server_client_check_pane_focus(struct window_pane *wp)
{
struct client *c;
int push;
diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index 114c649f075..77a6a09384c 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.1047 2020/05/16 16:44:54 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.1048 2020/05/16 16:50:55 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -1010,12 +1010,18 @@ struct window {
u_int xpixel;
u_int ypixel;
+ u_int new_sx;
+ u_int new_sy;
+ u_int new_xpixel;
+ u_int new_ypixel;
+
int flags;
#define WINDOW_BELL 0x1
#define WINDOW_ACTIVITY 0x2
#define WINDOW_SILENCE 0x4
#define WINDOW_ZOOMED 0x8
#define WINDOW_WASZOOMED 0x10
+#define WINDOW_RESIZE 0x20
#define WINDOW_ALERTFLAGS (WINDOW_BELL|WINDOW_ACTIVITY|WINDOW_SILENCE)
int alerts_queued;
diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c
index e308be9abf7..663b67fb6d3 100644
--- a/usr.bin/tmux/window.c
+++ b/usr.bin/tmux/window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: window.c,v 1.261 2020/05/16 16:35:13 nicm Exp $ */
+/* $OpenBSD: window.c,v 1.262 2020/05/16 16:50:55 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -440,13 +440,15 @@ window_pane_send_resize(struct window_pane *wp, int yadjust)
{
struct window *w = wp->window;
struct winsize ws;
+ u_int sy = wp->sy + yadjust;
if (wp->fd == -1)
return;
+ log_debug("%s: %%%u resize to %u,%u", __func__, wp->id, wp->sx, sy);
memset(&ws, 0, sizeof ws);
ws.ws_col = wp->sx;
- ws.ws_row = wp->sy + yadjust;
+ ws.ws_row = sy;
ws.ws_xpixel = w->xpixel * ws.ws_col;
ws.ws_ypixel = w->ypixel * ws.ws_row;
if (ioctl(wp->fd, TIOCSWINSZ, &ws) == -1)
@@ -991,7 +993,6 @@ window_pane_resize(struct window_pane *wp, u_int sx, u_int sy)
wme = TAILQ_FIRST(&wp->modes);
if (wme != NULL && wme->mode->resize != NULL)
wme->mode->resize(wme, sx, sy);
-
wp->flags |= (PANE_RESIZE|PANE_RESIZED);
}