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 > tmux-users@lists.sourceforge.net > 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 tmux-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tmux-users