mirror of
https://github.com/tmate-io/tmate-ssh-server.git
synced 2020-11-18 19:53:51 -08:00
Do pane resize ioctls once at the end of the server loop rather than
immediately.
This commit is contained in:
parent
8094e82287
commit
3eae71b5b2
27
window.c
27
window.c
@ -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");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Loading…
x
Reference in New Issue
Block a user