From dbd8e478469a6eb01f1bada1984f902a51fe65c9 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Fri, 22 Feb 2013 21:35:29 +0000 Subject: [PATCH] Do pane resize ioctls once at the end of the server loop rather than immediately. --- server-client.c | 33 ++++++++++++++++++++++++++++++++- window.c | 18 +----------------- 2 files changed, 33 insertions(+), 18 deletions(-) diff --git a/server-client.c b/server-client.c index d9a647e8..3c14ff87 100644 --- a/server-client.c +++ b/server-client.c @@ -28,6 +28,7 @@ #include "tmux.h" void server_client_check_focus(struct window_pane *); +void server_client_check_resize(struct window_pane *); void server_client_check_mouse(struct client *, struct window_pane *); void server_client_repeat_timer(int, short, void *); void server_client_check_exit(struct client *); @@ -495,7 +496,7 @@ server_client_loop(void) /* * Any windows will have been redrawn as part of clients, so clear - * their flags now. Also check and update pane focus. + * their flags now. Also check pane focus and resize. */ for (i = 0; i < ARRAY_LENGTH(&windows); i++) { w = ARRAY_ITEM(&windows, i); @@ -505,11 +506,41 @@ server_client_loop(void) w->flags &= ~WINDOW_REDRAW; TAILQ_FOREACH(wp, &w->panes, entry) { server_client_check_focus(wp); + server_client_check_resize(wp); wp->flags &= ~PANE_REDRAW; } } } +/* Check if pane should be resized. */ +void +server_client_check_resize(struct window_pane *wp) +{ + struct winsize ws; + + if (wp->fd == -1 || !(wp->flags & PANE_RESIZE)) + return; + + memset(&ws, 0, sizeof ws); + ws.ws_col = wp->sx; + ws.ws_row = wp->sy; + + if (ioctl(wp->fd, TIOCSWINSZ, &ws) == -1) { +#ifdef __sun + /* + * Some versions of Solaris apparently can return an error when + * resizing; don't know why this happens, can't reproduce on + * other platforms and ignoring it doesn't seem to cause any + * issues. + */ + if (errno != EINVAL) +#endif + fatal("ioctl failed"); + } + + wp->flags &= ~PANE_RESIZE; +} + /* Check whether pane should be focused. */ void server_client_check_focus(struct window_pane *wp) diff --git a/window.c b/window.c index 4bb53489..5ca18114 100644 --- a/window.c +++ b/window.c @@ -855,32 +855,16 @@ window_pane_error_callback( void window_pane_resize(struct window_pane *wp, u_int sx, u_int sy) { - struct winsize ws; - if (sx == wp->sx && sy == wp->sy) return; wp->sx = sx; wp->sy = sy; - memset(&ws, 0, sizeof ws); - ws.ws_col = sx; - ws.ws_row = sy; - screen_resize(&wp->base, sx, sy, wp->saved_grid == NULL); if (wp->mode != NULL) wp->mode->resize(wp, sx, sy); - if (wp->fd != -1 && ioctl(wp->fd, TIOCSWINSZ, &ws) == -1) -#ifdef __sun - /* - * Some versions of Solaris apparently can return an error when - * resizing; don't know why this happens, can't reproduce on - * other platforms and ignoring it doesn't seem to cause any - * issues. - */ - if (errno != EINVAL) -#endif - fatal("ioctl failed"); + wp->flags |= PANE_RESIZE; } /*