Merge branch 'obsd-master' into master

pull/2525/head
Thomas Adam 2021-01-04 10:01:20 +00:00
commit 5a2db4c7e8
3 changed files with 22 additions and 7 deletions

View File

@ -68,6 +68,9 @@ static const char *options_table_set_clipboard_list[] = {
static const char *options_table_window_size_list[] = { static const char *options_table_window_size_list[] = {
"largest", "smallest", "manual", "latest", NULL "largest", "smallest", "manual", "latest", NULL
}; };
static const char *options_table_remain_on_exit_list[] = {
"off", "on", "failed", NULL
};
/* Status line format. */ /* Status line format. */
#define OPTIONS_TABLE_STATUS_FORMAT1 \ #define OPTIONS_TABLE_STATUS_FORMAT1 \
@ -948,11 +951,12 @@ const struct options_table_entry options_table[] = {
}, },
{ .name = "remain-on-exit", { .name = "remain-on-exit",
.type = OPTIONS_TABLE_FLAG, .type = OPTIONS_TABLE_CHOICE,
.scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE, .scope = OPTIONS_TABLE_WINDOW|OPTIONS_TABLE_PANE,
.choices = options_table_remain_on_exit_list,
.default_num = 0, .default_num = 0,
.text = "Whether panes should remain ('on') or be automatically " .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", { .name = "synchronize-panes",

View File

@ -312,6 +312,7 @@ server_destroy_pane(struct window_pane *wp, int notify)
struct grid_cell gc; struct grid_cell gc;
time_t t; time_t t;
char tim[26]; char tim[26];
int remain_on_exit;
if (wp->fd != -1) { if (wp->fd != -1) {
#ifdef HAVE_UTEMPTER #ifdef HAVE_UTEMPTER
@ -323,10 +324,17 @@ server_destroy_pane(struct window_pane *wp, int notify)
wp->fd = -1; wp->fd = -1;
} }
if (options_get_number(wp->options, "remain-on-exit")) { remain_on_exit = options_get_number(wp->options, "remain-on-exit");
if (~wp->flags & PANE_STATUSREADY) if (remain_on_exit != 0 && (~wp->flags & PANE_STATUSREADY))
return; 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) if (wp->flags & PANE_STATUSDRAWN)
return; return;
wp->flags |= PANE_STATUSDRAWN; wp->flags |= PANE_STATUSDRAWN;

5
tmux.1
View File

@ -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. visible before the application starts reappears unchanged after it exits.
.Pp .Pp
.It Xo Ic remain-on-exit .It Xo Ic remain-on-exit
.Op Ic on | off .Op Ic on | off | failed
.Xc .Xc
A pane with this flag set is not destroyed when the program running in it A pane with this flag set is not destroyed when the program running in it
exits. exits.
If set to
.Ic failed ,
then only when the program exit status is not zero.
The pane may be reactivated with the The pane may be reactivated with the
.Ic respawn-pane .Ic respawn-pane
command. command.