diff options
author | Thomas Adam <thomas@xteddy.org> | 2021-01-04 10:01:20 +0000 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2021-01-04 10:01:20 +0000 |
commit | 5a2db4c7e8ba94fadb31075e6813cf53b87b5366 (patch) | |
tree | 7cbd0a3f9fcf8d0faba5aef225c7740b0c2818e2 | |
parent | f04cc3997629823f0e304d4e4184e2ec93c703f0 (diff) | |
parent | bd0fb22f0a206a73ec3f41322571d56d9d7d7c5d (diff) | |
download | rtmux-5a2db4c7e8ba94fadb31075e6813cf53b87b5366.tar.gz rtmux-5a2db4c7e8ba94fadb31075e6813cf53b87b5366.tar.bz2 rtmux-5a2db4c7e8ba94fadb31075e6813cf53b87b5366.zip |
Merge branch 'obsd-master' into master
-rw-r--r-- | options-table.c | 8 | ||||
-rw-r--r-- | server-fn.c | 16 | ||||
-rw-r--r-- | tmux.1 | 5 |
3 files changed, 22 insertions, 7 deletions
diff --git a/options-table.c b/options-table.c index cf0d8c5e..3fd3fe4a 100644 --- a/options-table.c +++ b/options-table.c @@ -68,6 +68,9 @@ static const char *options_table_set_clipboard_list[] = { static const char *options_table_window_size_list[] = { "largest", "smallest", "manual", "latest", NULL }; +static const char *options_table_remain_on_exit_list[] = { + "off", "on", "failed", NULL +}; /* Status line format. */ #define OPTIONS_TABLE_STATUS_FORMAT1 \ @@ -948,11 +951,12 @@ const struct options_table_entry options_table[] = { }, { .name = "remain-on-exit", - .type = OPTIONS_TABLE_FLAG, + .type = OPTIONS_TABLE_CHOICE, .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE, + .choices = options_table_remain_on_exit_list, .default_num = 0, .text = "Whether panes should remain ('on') or be automatically " - "killed ('off') when the program inside exits." + "killed ('off' or 'failed') when the program inside exits." }, { .name = "synchronize-panes", diff --git a/server-fn.c b/server-fn.c index e3cc181f..0bda8198 100644 --- a/server-fn.c +++ b/server-fn.c @@ -312,6 +312,7 @@ server_destroy_pane(struct window_pane *wp, int notify) struct grid_cell gc; time_t t; char tim[26]; + int remain_on_exit; if (wp->fd != -1) { #ifdef HAVE_UTEMPTER @@ -323,10 +324,17 @@ server_destroy_pane(struct window_pane *wp, int notify) wp->fd = -1; } - if (options_get_number(wp->options, "remain-on-exit")) { - if (~wp->flags & PANE_STATUSREADY) - return; - + remain_on_exit = options_get_number(wp->options, "remain-on-exit"); + if (remain_on_exit != 0 && (~wp->flags & PANE_STATUSREADY)) + return; + switch (remain_on_exit) { + case 0: + break; + case 2: + if (WIFEXITED(wp->status) && WEXITSTATUS(wp->status) == 0) + break; + /* FALLTHROUGH */ + case 1: if (wp->flags & PANE_STATUSDRAWN) return; wp->flags |= PANE_STATUSDRAWN; @@ -4181,10 +4181,13 @@ interactive application starts and restores it on exit, so that any output visible before the application starts reappears unchanged after it exits. .Pp .It Xo Ic remain-on-exit -.Op Ic on | off +.Op Ic on | off | failed .Xc A pane with this flag set is not destroyed when the program running in it exits. +If set to +.Ic failed , +then only when the program exit status is not zero. The pane may be reactivated with the .Ic respawn-pane command. |