diff options
author | nicm <nicm> | 2017-10-12 11:32:27 +0000 |
---|---|---|
committer | nicm <nicm> | 2017-10-12 11:32:27 +0000 |
commit | a5fd5782f87362b8ee31cd5c6975728e112db9ff (patch) | |
tree | 2dd2cd2c900ab37fb592ac3d883d1615ed93e534 /server-fn.c | |
parent | eb9839fd32d51688fe1877776921d2d76f2642a2 (diff) | |
download | rtmux-a5fd5782f87362b8ee31cd5c6975728e112db9ff.tar.gz rtmux-a5fd5782f87362b8ee31cd5c6975728e112db9ff.tar.bz2 rtmux-a5fd5782f87362b8ee31cd5c6975728e112db9ff.zip |
Show exit status and time in the remain-on-exit pane text, mostly from
Timo Boettcher in GitHub issue 1103.
Diffstat (limited to 'server-fn.c')
-rw-r--r-- | server-fn.c | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/server-fn.c b/server-fn.c index f5ede2c2..713e85b7 100644 --- a/server-fn.c +++ b/server-fn.c @@ -18,6 +18,7 @@ #include <sys/types.h> #include <sys/queue.h> +#include <sys/wait.h> #include <sys/uio.h> #include <imsg.h> @@ -278,11 +279,11 @@ void server_destroy_pane(struct window_pane *wp, int notify) { struct window *w = wp->window; - int old_fd; struct screen_write_ctx ctx; struct grid_cell gc; + time_t t; + char tim[26]; - old_fd = wp->fd; if (wp->fd != -1) { bufferevent_free(wp->event); close(wp->fd); @@ -290,9 +291,13 @@ server_destroy_pane(struct window_pane *wp, int notify) } if (options_get_number(w->options, "remain-on-exit")) { - if (old_fd == -1) + if (~wp->flags & PANE_STATUSREADY) return; + if (wp->flags & PANE_STATUSDRAWN) + return; + wp->flags |= PANE_STATUSDRAWN; + if (notify) notify_pane("pane-died", wp); @@ -301,11 +306,24 @@ server_destroy_pane(struct window_pane *wp, int notify) screen_write_cursormove(&ctx, 0, screen_size_y(ctx.s) - 1); screen_write_linefeed(&ctx, 1, 8); memcpy(&gc, &grid_default_cell, sizeof gc); - gc.attr |= GRID_ATTR_BRIGHT; - screen_write_puts(&ctx, &gc, "Pane is dead"); + + time(&t); + ctime_r(&t, tim); + + if (WIFEXITED(wp->status)) { + screen_write_nputs(&ctx, -1, &gc, + "Pane is dead (status %d, %s)", + WEXITSTATUS(wp->status), + tim); + } else if (WIFSIGNALED(wp->status)) { + screen_write_nputs(&ctx, -1, &gc, + "Pane is dead (signal %d, %s)", + WTERMSIG(wp->status), + tim); + } + screen_write_stop(&ctx); wp->flags |= PANE_REDRAW; - return; } |