Do pane resize ioctls once at the end of the server loop rather than

immediately.
pull/1/head
Nicholas Marriott 2013-03-24 09:25:04 +00:00
parent 8094e82287
commit 3eae71b5b2
1 changed files with 16 additions and 11 deletions

View File

@ -310,24 +310,36 @@ window_create1(u_int sx, u_int sy)
struct window * struct window *
window_create(const char *name, const char *cmd, const char *shell, window_create(const char *name, const char *cmd, const char *shell,
const char *cwd, struct environ *env, struct termios *tio, const char *cwd, struct environ *env, struct termios *tio,
u_int sx, u_int sy, u_int hlimit,char **cause) u_int sx, u_int sy, u_int hlimit, char **cause)
{ {
struct window *w; struct window *w;
struct window_pane *wp; struct window_pane *wp;
const char *prefix;
char *cmd1;
w = window_create1(sx, sy); w = window_create1(sx, sy);
wp = window_add_pane(w, hlimit); wp = window_add_pane(w, hlimit);
layout_init(w); layout_init(w);
if (window_pane_spawn(wp, cmd, shell, cwd, env, tio, cause) != 0) {
if (*cmd != '\0') {
prefix = options_get_string(&w->options, "command-prefix");
xasprintf(&cmd1, "%s%s", prefix, cmd);
} else
cmd1 = xstrdup("");
if (window_pane_spawn(wp, cmd1, shell, cwd, env, tio, cause) != 0) {
window_destroy(w); window_destroy(w);
free(cmd1);
return (NULL); return (NULL);
} }
free(cmd1);
w->active = TAILQ_FIRST(&w->panes); w->active = TAILQ_FIRST(&w->panes);
if (name != NULL) { if (name != NULL) {
w->name = xstrdup(name); w->name = xstrdup(name);
options_set_number(&w->options, "automatic-rename", 0); options_set_number(&w->options, "automatic-rename", 0);
} else } else
w->name = default_window_name(w); w->name = default_window_name(w);
return (w); return (w);
} }
@ -704,6 +716,8 @@ window_pane_spawn(struct window_pane *wp, const char *cmd, const char *shell,
wp->cwd = xstrdup(cwd); wp->cwd = xstrdup(cwd);
} }
log_debug("spawn: %s -- %s", wp->shell, wp->cmd);
memset(&ws, 0, sizeof ws); memset(&ws, 0, sizeof ws);
ws.ws_col = screen_size_x(&wp->base); ws.ws_col = screen_size_x(&wp->base);
ws.ws_row = screen_size_y(&wp->base); ws.ws_row = screen_size_y(&wp->base);
@ -840,23 +854,14 @@ window_pane_error_callback(
void void
window_pane_resize(struct window_pane *wp, u_int sx, u_int sy) window_pane_resize(struct window_pane *wp, u_int sx, u_int sy)
{ {
struct winsize ws;
if (sx == wp->sx && sy == wp->sy) if (sx == wp->sx && sy == wp->sy)
return; return;
wp->sx = sx; wp->sx = sx;
wp->sy = sy; 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); screen_resize(&wp->base, sx, sy, wp->saved_grid == NULL);
if (wp->mode != NULL) if (wp->mode != NULL)
wp->mode->resize(wp, sx, sy); wp->mode->resize(wp, sx, sy);
if (wp->fd != -1 && ioctl(wp->fd, TIOCSWINSZ, &ws) == -1)
fatal("ioctl failed");
} }
/* /*