Hi
You definitely shouldn't use C0 control codes for this, you should
probably use DCS but with a different prefix instead of "tmux;" which is
used for raw passthrough (look at input_dcs_dispatch).
However, I'm not sure we need code to do this at all. Can't you use a
wrapper script that sets the colour/renames the window/etc? That's what
I do for ssh.
For example something like:
#!/bin/sh
[ -z "$TMUX" ] && exit
W=$(tmux display -pt $TMUX_PANE -F '#{window_id}')
tmux renamew -t $W "Running-$1"
tmux setw -t $W window-status-bg red >/dev/null
"$@"
tmux setw -ut $W window-status-bg >/dev/null
tmux setw -ut $W automatic-rename >/dev/null
Or do similar with whatever hooks your shell provides - I'm sure you get
the idea.
On Wed, Dec 12, 2012 at 01:37:35PM -0500, Scott Frazer wrote:
> I tend to have a lot of windows with long-ish processes running in them, and
> wanted a way to see their status at a glance. Specifically:
>
> 1) When a command completes the window status shows that it passed or failed,
> and the indicator disappears when I visit the window.
>
> 2) When a command starts, the window status gets a 'sticky' indicator showing
> that something is running. I can visit the window to see how a command is
> progressing, then when I switch to another window the running status stays.
>
> I was sort of able to do (1) using the alert and monitor-content indicators.
> I would use the return code of the finished command with my prompt command to
> echo a BEL char if it failed (causing the alert indicator), or the
> monitor-content would see my unlikely-to-appear prompt (causing that
> indicator). This worked okay, but sometimes processes would send a BEL and
> falsely trigger the done-and-failed indication, and the monitor-content
> indicator has the known behavior that some output causes the window to be
> rescanned and a previous prompt would falsely trigger the done-and-passed
> indication. I couldn't figure out a way to do (2).
>
> And so this patch. It does the simplest possible thing that would work: I
> copied the behavior of the alert indicator and check for certain low-number
> ASCII codes and change the indicator accordingly. Then I use the pre-command
> and post-command variables of my shell to send the appropriate ASCII codes.
> This works with zsh and tcsh (which I'm forced to use at work -- yeah yeah I
> know), and I have seen ways you could get the same behavior with bash.
>
> This is probably a rather naive approach; suggestions of a better way to do it
> are welcome. A cool extension of this would be allowing the user to add any
> number of regular/sticky indicators of their choosing.
>
>
>
> ---
> input.c | 11 +++++++++++
> options-table.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
> server-window.c | 42 +++++++++++++++++++++++++++++++++++++++++-
> status.c | 32 ++++++++++++++++++++++++++++++++
> tmux.h | 9 ++++++++-
> window.c | 6 ++++++
> 6 files changed, 143 insertions(+), 2 deletions(-)
>
> diff --git a/input.c b/input.c
> index 960a0e6..e165771 100644
> --- a/input.c
> +++ b/input.c
> @@ -971,6 +971,17 @@ input_c0_dispatch(struct input_ctx *ictx)
> case '\017': /* SI */
> ictx->cell.attr &= ~GRID_ATTR_CHARSET;
> break;
> +
> + case '\006': /* ACK */
> + wp->window->flags |= WINDOW_PROC_PASS;
> + break;
> + case '\025': /* NAK */
> + wp->window->flags |= WINDOW_PROC_FAIL;
> + break;
> + case '\026': /* SYN */
> + wp->window->flags |= WINDOW_PROC_RUNNING;
> + break;
> +
> default:
> log_debug("%s: unknown '%c'", __func__, ictx->ch);
> break;
> diff --git a/options-table.c b/options-table.c
> index 8ce838a..8e06927 100644
> --- a/options-table.c
> +++ b/options-table.c
> @@ -655,6 +655,51 @@ const struct options_table_entry window_options_table[]
> = {
> .default_num = 8
> },
>
> + { .name = "window-status-proc-pass-attr",
> + .type = OPTIONS_TABLE_ATTRIBUTES,
> + .default_num = GRID_ATTR_REVERSE
> + },
> +
> + { .name = "window-status-proc-pass-bg",
> + .type = OPTIONS_TABLE_COLOUR,
> + .default_num = 8
> + },
> +
> + { .name = "window-status-proc-pass-fg",
> + .type = OPTIONS_TABLE_COLOUR,
> + .default_num = 8
> + },
> +
> + { .name = "window-status-proc-fail-attr",
> + .type = OPTIONS_TABLE_ATTRIBUTES,
> + .default_num = GRID_ATTR_REVERSE
> + },
> +
> + { .name = "window-status-proc-fail-bg",
> + .type = OPTIONS_TABLE_COLOUR,
> + .default_num = 8
> + },
> +
> + { .name = "window-status-proc-fail-fg",
> + .type = OPTIONS_TABLE_COLOUR,
> + .default_num = 8
> + },
> +
> + { .name = "window-status-proc-running-attr",
> + .type = OPTIONS_TABLE_ATTRIBUTES,
> + .default_num = GRID_ATTR_REVERSE
> + },
> +
> + { .name = "window-status-proc-running-bg",
> + .type = OPTIONS_TABLE_COLOUR,
> + .default_num = 8
> + },
> +
> + { .name = "window-status-proc-running-fg",
> + .type = OPTIONS_TABLE_COLOUR,
> + .default_num = 8
> + },
> +
> { .name = "window-status-attr",
> .type = OPTIONS_TABLE_ATTRIBUTES,
> .default_num = 0
> diff --git a/server-window.c b/server-window.c
> index fce6439..97b3bbf 100644
> --- a/server-window.c
> +++ b/server-window.c
> @@ -29,6 +29,7 @@ int server_window_check_activity(struct session *,
> struct winlink *);
> int server_window_check_silence(struct session *, struct winlink *);
> int server_window_check_content(
> struct session *, struct winlink *, struct window_pane *);
> +int server_window_check_proc(struct session *, struct winlink *);
> void ring_bell(struct session *);
>
> /* Window functions that need to happen every loop. */
> @@ -53,7 +54,8 @@ server_window_loop(void)
>
> if (server_window_check_bell(s, wl) ||
> server_window_check_activity(s, wl) ||
> - server_window_check_silence(s, wl))
> + server_window_check_silence(s, wl) ||
> + server_window_check_proc(s, wl))
> server_status_session(s);
> TAILQ_FOREACH(wp, &w->panes, entry)
> server_window_check_content(s, wl, wp);
> @@ -233,6 +235,44 @@ server_window_check_content(
> return (1);
> }
>
> +/* Check process state flags of window. */
> +int
> +server_window_check_proc(struct session *s, struct winlink *wl)
> +{
> + struct window *w = wl->window;
> + u_int modified = 0;
> +
> + if (w->flags & WINDOW_PROC_PASS && !(wl->flags & WINLINK_PROC_PASS)) {
> + if (s->curw != wl || s->flags & SESSION_UNATTACHED)
> + wl->flags |= WINLINK_PROC_PASS;
> + modified = 1;
> + }
> +
> + if (w->flags & WINDOW_PROC_FAIL && !(wl->flags & WINLINK_PROC_FAIL)) {
> + if (s->curw != wl || s->flags & SESSION_UNATTACHED)
> + wl->flags |= WINLINK_PROC_FAIL;
> + modified = 1;
> + }
> +
> + if (w->flags & WINDOW_PROC_RUNNING && !(wl->flags &
> WINLINK_PROC_RUNNING)) {
> + if (s->curw != wl || s->flags & SESSION_UNATTACHED)
> + wl->flags |= WINLINK_PROC_RUNNING;
> + modified = 1;
> + }
> +
> + if (s->flags & SESSION_UNATTACHED)
> + return (0);
> + if (w->flags & (WINDOW_PROC_PASS | WINDOW_PROC_FAIL)) {
> + w->flags &= ~WINDOW_PROC_RUNNING;
> + }
> + if (s->curw->window == wl->window) {
> + w->flags &= ~WINDOW_PROC_PASS;
> + w->flags &= ~WINDOW_PROC_FAIL;
> + }
> +
> + return (modified);
> +}
> +
> /* Ring terminal bell. */
> void
> ring_bell(struct session *s)
> diff --git a/status.c b/status.c
> index e841d80..c5d253b 100644
> --- a/status.c
> +++ b/status.c
> @@ -738,6 +738,38 @@ status_print(
> gc->attr = attr;
> }
>
> + if (wl->flags & WINLINK_PROC_PASS) {
> + fg = options_get_number(oo, "window-status-proc-pass-fg");
> + if (fg != 8)
> + colour_set_fg(gc, fg);
> + bg = options_get_number(oo, "window-status-proc-pass-bg");
> + if (bg != 8)
> + colour_set_bg(gc, bg);
> + attr = options_get_number(oo, "window-status-proc-pass-attr");
> + if (attr != 0)
> + gc->attr = attr;
> + } else if (wl->flags & WINLINK_PROC_FAIL) {
> + fg = options_get_number(oo, "window-status-proc-fail-fg");
> + if (fg != 8)
> + colour_set_fg(gc, fg);
> + bg = options_get_number(oo, "window-status-proc-fail-bg");
> + if (bg != 8)
> + colour_set_bg(gc, bg);
> + attr = options_get_number(oo, "window-status-proc-fail-attr");
> + if (attr != 0)
> + gc->attr = attr;
> + } else if ((wl->flags & WINLINK_PROC_RUNNING) && (wl != s->curw)) {
> + fg = options_get_number(oo, "window-status-proc-running-fg");
> + if (fg != 8)
> + colour_set_fg(gc, fg);
> + bg = options_get_number(oo, "window-status-proc-running-bg");
> + if (bg != 8)
> + colour_set_bg(gc, bg);
> + attr = options_get_number(oo,
> "window-status-proc-running-attr");
> + if (attr != 0)
> + gc->attr = attr;
> + }
> +
> text = status_replace(c, NULL, wl, NULL, fmt, t, 1);
> return (text);
> }
> diff --git a/tmux.h b/tmux.h
> index faab3fe..02cbc49 100644
> --- a/tmux.h
> +++ b/tmux.h
> @@ -1001,6 +1001,9 @@ struct window {
> #define WINDOW_ACTIVITY 0x2
> #define WINDOW_REDRAW 0x4
> #define WINDOW_SILENCE 0x8
> +#define WINDOW_PROC_RUNNING 0x10
> +#define WINDOW_PROC_PASS 0x20
> +#define WINDOW_PROC_FAIL 0x40
>
> struct options options;
>
> @@ -1022,8 +1025,12 @@ struct winlink {
> #define WINLINK_ACTIVITY 0x2
> #define WINLINK_CONTENT 0x4
> #define WINLINK_SILENCE 0x8
> +#define WINLINK_PROC_RUNNING 0x10
> +#define WINLINK_PROC_PASS 0x20
> +#define WINLINK_PROC_FAIL 0x40
> +
> #define WINLINK_ALERTFLAGS \
> - (WINLINK_BELL|WINLINK_ACTIVITY|WINLINK_CONTENT|WINLINK_SILENCE)
> +
> (WINLINK_BELL|WINLINK_ACTIVITY|WINLINK_CONTENT|WINLINK_SILENCE|WINLINK_PROC_RUNNING|WINLINK_PROC_PASS|WINLINK_PROC_FAIL)
>
> RB_ENTRY(winlink) entry;
> TAILQ_ENTRY(winlink) sentry;
> diff --git a/window.c b/window.c
> index 5cdc504..71557b6 100644
> --- a/window.c
> +++ b/window.c
> @@ -582,6 +582,12 @@ window_printable_flags(struct session *s, struct
> winlink *wl)
> flags[pos++] = '+';
> if (wl->flags & WINLINK_SILENCE)
> flags[pos++] = '~';
> + if (wl->flags & WINLINK_PROC_PASS)
> + flags[pos++] = '$';
> + if (wl->flags & WINLINK_PROC_FAIL)
> + flags[pos++] = '%';
> + if (wl->flags & WINLINK_PROC_RUNNING)
> + flags[pos++] = '&';
> if (wl == s->curw)
> flags[pos++] = '*';
> if (wl == TAILQ_FIRST(&s->lastw))
> --
> 1.7.8
>
> ------------------------------------------------------------------------------
> LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
> Remotely access PCs and mobile devices and provide instant support
> Improve your efficiency, and focus on delivering more value-add services
> Discover what IT Professionals Know. Rescue delivers
> http://p.sf.net/sfu/logmein_12329d2d
> _______________________________________________
> tmux-users mailing list
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/tmux-users
------------------------------------------------------------------------------
LogMeIn Rescue: Anywhere, Anytime Remote support for IT. Free Trial
Remotely access PCs and mobile devices and provide instant support
Improve your efficiency, and focus on delivering more value-add services
Discover what IT Professionals Know. Rescue delivers
http://p.sf.net/sfu/logmein_12329d2d
_______________________________________________
tmux-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/tmux-users