diff options
Diffstat (limited to 'cmd-respawn-window.c')
-rw-r--r-- | cmd-respawn-window.c | 72 |
1 files changed, 21 insertions, 51 deletions
diff --git a/cmd-respawn-window.c b/cmd-respawn-window.c index 68791990..2ccb2fde 100644 --- a/cmd-respawn-window.c +++ b/cmd-respawn-window.c @@ -19,7 +19,7 @@ #include <sys/types.h> #include <stdlib.h> -#include <unistd.h> +#include <string.h> #include "tmux.h" @@ -48,64 +48,34 @@ static enum cmd_retval cmd_respawn_window_exec(struct cmd *self, struct cmdq_item *item) { struct args *args = self->args; + struct spawn_context sc; struct session *s = item->target.s; struct winlink *wl = item->target.wl; - struct window *w = wl->window; - struct window_pane *wp; - struct client *c = cmd_find_client(item, NULL, 1); - struct environ *env; - const char *path = NULL, *cp; - char *cause, *cwd = NULL; - struct environ_entry *envent; - - if (!args_has(self->args, 'k')) { - TAILQ_FOREACH(wp, &w->panes, entry) { - if (wp->fd == -1) - continue; - cmdq_error(item, "window still active: %s:%d", s->name, - wl->idx); - return (CMD_RETURN_ERROR); - } - } + char *cause = NULL; + + memset(&sc, 0, sizeof sc); + sc.item = item; + sc.s = s; + sc.wl = wl; + + sc.name = NULL; + sc.argc = args->argc; + sc.argv = args->argv; - wp = TAILQ_FIRST(&w->panes); - TAILQ_REMOVE(&w->panes, wp, entry); - layout_free(w); - window_destroy_panes(w); - TAILQ_INSERT_HEAD(&w->panes, wp, entry); - window_pane_resize(wp, w->sx, w->sy); - - if (item->client != NULL && item->client->session == NULL) - envent = environ_find(item->client->environ, "PATH"); - else - envent = environ_find(s->environ, "PATH"); - if (envent != NULL) - path = envent->value; - - if ((cp = args_get(args, 'c')) != NULL) - cwd = format_single(item, cp, c, s, NULL, NULL); - - env = environ_for_session(s, 0); - if (window_pane_spawn(wp, args->argc, args->argv, path, NULL, cwd, env, - s->tio, &cause) != 0) { + sc.idx = -1; + sc.cwd = args_get(args, 'c'); + + sc.flags = SPAWN_RESPAWN; + if (args_has(args, 'k')) + sc.flags |= SPAWN_KILL; + + if (spawn_window(&sc, &cause) == NULL) { cmdq_error(item, "respawn window failed: %s", cause); free(cause); - environ_free(env); - free(cwd); - server_destroy_pane(wp, 0); return (CMD_RETURN_ERROR); } - environ_free(env); - free(cwd); - - layout_init(w, wp); - window_pane_reset_mode_all(wp); - screen_reinit(&wp->base); - input_init(wp); - window_set_active_pane(w, wp); - recalculate_sizes(); - server_redraw_window(w); + server_redraw_window(wl->window); return (CMD_RETURN_NORMAL); } |