From 820067826a07cc8f36e65943b4b23217ed2e8dd2 Mon Sep 17 00:00:00 2001 From: nicm Date: Fri, 3 Jul 2026 16:09:49 +0000 Subject: [PATCH] Add -E to new-window and respawn-pane and respawn-window to create empty panes. --- cmd-new-window.c | 15 ++++++++++++--- cmd-respawn-pane.c | 6 ++++-- cmd-respawn-window.c | 6 ++++-- spawn.c | 13 ++++++++++--- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/cmd-new-window.c b/cmd-new-window.c index bb6113fd6..6e6d70ccc 100644 --- a/cmd-new-window.c +++ b/cmd-new-window.c @@ -38,8 +38,8 @@ const struct cmd_entry cmd_new_window_entry = { .name = "new-window", .alias = "neww", - .args = { "abc:de:F:kn:PSt:", 0, -1, NULL }, - .usage = "[-abdkPS] [-c start-directory] [-e environment] [-F format] " + .args = { "abc:de:EF:kn:PSt:", 0, -1, NULL }, + .usage = "[-abdEkPS] [-c start-directory] [-e environment] [-F format] " "[-n window-name] " CMD_TARGET_WINDOW_USAGE " [shell-command [argument ...]]", @@ -60,12 +60,19 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item) struct client *tc = cmdq_get_target_client(item); struct session *s = target->s; struct winlink *wl = target->wl, *new_wl = NULL; - int idx = target->idx, before; + int idx = target->idx, before, count = args_count(args); char *cause = NULL, *cp, *expanded, *wname = NULL; const char *template, *name; struct cmd_find_state fs; struct args_value *av; + if (args_has(args, 'E') && + count != 0 && + (count != 1 || *args_string(args, 0) != '\0')) { + cmdq_error(item, "command cannot be given for empty pane"); + return (CMD_RETURN_ERROR); + } + /* * If -S and -n are given and -t is not and a single window with this * name already exists, select it. @@ -134,6 +141,8 @@ cmd_new_window_exec(struct cmd *self, struct cmdq_item *item) sc.cwd = args_get(args, 'c'); sc.flags = 0; + if (args_has(args, 'E')) + sc.flags |= SPAWN_EMPTY; if (args_has(args, 'd')) sc.flags |= SPAWN_DETACHED; if (args_has(args, 'k')) diff --git a/cmd-respawn-pane.c b/cmd-respawn-pane.c index 1e1dd4c6c..bf058a267 100644 --- a/cmd-respawn-pane.c +++ b/cmd-respawn-pane.c @@ -34,8 +34,8 @@ const struct cmd_entry cmd_respawn_pane_entry = { .name = "respawn-pane", .alias = "respawnp", - .args = { "c:e:kt:", 0, -1, NULL }, - .usage = "[-k] [-c start-directory] [-e environment] " + .args = { "c:e:Ekt:", 0, -1, NULL }, + .usage = "[-Ek] [-c start-directory] [-e environment] " CMD_TARGET_PANE_USAGE " [shell-command [argument ...]]", .target = { 't', CMD_FIND_PANE, 0 }, @@ -75,6 +75,8 @@ cmd_respawn_pane_exec(struct cmd *self, struct cmdq_item *item) sc.cwd = args_get(args, 'c'); sc.flags = SPAWN_RESPAWN; + if (args_has(args, 'E')) + sc.flags |= SPAWN_EMPTY; if (args_has(args, 'k')) sc.flags |= SPAWN_KILL; diff --git a/cmd-respawn-window.c b/cmd-respawn-window.c index e1eae0afc..e67757e1b 100644 --- a/cmd-respawn-window.c +++ b/cmd-respawn-window.c @@ -34,8 +34,8 @@ const struct cmd_entry cmd_respawn_window_entry = { .name = "respawn-window", .alias = "respawnw", - .args = { "c:e:kt:", 0, -1, NULL }, - .usage = "[-k] [-c start-directory] [-e environment] " + .args = { "c:e:Ekt:", 0, -1, NULL }, + .usage = "[-Ek] [-c start-directory] [-e environment] " CMD_TARGET_WINDOW_USAGE " [shell-command [argument ...]]", .target = { 't', CMD_FIND_WINDOW, 0 }, @@ -74,6 +74,8 @@ cmd_respawn_window_exec(struct cmd *self, struct cmdq_item *item) sc.cwd = args_get(args, 'c'); sc.flags = SPAWN_RESPAWN; + if (args_has(args, 'E')) + sc.flags |= SPAWN_EMPTY; if (args_has(args, 'k')) sc.flags |= SPAWN_KILL; diff --git a/spawn.c b/spawn.c index 4f7a9611e..9f0c87db9 100644 --- a/spawn.c +++ b/spawn.c @@ -266,14 +266,20 @@ spawn_pane(struct spawn_context *sc, char **cause) free(cwd); return (NULL); } - if (sc->wp0->fd != -1) { + if (sc->wp0->event != NULL) { bufferevent_free(sc->wp0->event); + sc->wp0->event = NULL; + } + if (sc->wp0->fd != -1) { close(sc->wp0->fd); + sc->wp0->fd = -1; } window_pane_reset_mode_all(sc->wp0); screen_reinit(&sc->wp0->base); - input_free(sc->wp0->ictx); - sc->wp0->ictx = NULL; + if (sc->wp0->ictx != NULL) { + input_free(sc->wp0->ictx); + sc->wp0->ictx = NULL; + } new_wp = sc->wp0; new_wp->flags &= ~(PANE_STATUSREADY|PANE_STATUSDRAWN); } else { @@ -389,6 +395,7 @@ spawn_pane(struct spawn_context *sc, char **cause) new_wp->base.mode |= MODE_CRLF; goto complete; } + new_wp->flags &= ~PANE_EMPTY; /* Store current working directory and change to new one. */ if (getcwd(path, sizeof path) != NULL) {