diff options
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/tmux/cmd-set-option.c | 3 | ||||
-rw-r--r-- | usr.bin/tmux/cmd-show-messages.c | 4 | ||||
-rw-r--r-- | usr.bin/tmux/resize.c | 27 | ||||
-rw-r--r-- | usr.bin/tmux/server-client.c | 64 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.h | 8 | ||||
-rw-r--r-- | usr.bin/tmux/window.c | 7 |
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); } |