From 376c808b503dbee0991b5eb4027ca6e4f4ece702 Mon Sep 17 00:00:00 2001 From: Tiago Cunha Date: Sun, 19 Jul 2009 14:35:56 +0000 Subject: [PATCH] Add three new session options: visual-activity, visual-bell, visual-content. If these are enabled (and the monitor-activity, bell-action and monitor-content options are configurated appropriately), when activity, a bell, or content is detected, a message is shown. Also tidy up the bell/activity/content code in server.c slightly and fix a couple of errors. --- cmd-set-option.c | 5 ++- server.c | 90 +++++++++++++++++++++++++++++++++++++++--------- tmux.1 | 26 +++++++++++++- tmux.c | 5 ++- tmux.h | 6 ++-- 5 files changed, 109 insertions(+), 23 deletions(-) diff --git a/cmd-set-option.c b/cmd-set-option.c index 0457a2cc..608f26c4 100644 --- a/cmd-set-option.c +++ b/cmd-set-option.c @@ -1,4 +1,4 @@ -/* $Id: cmd-set-option.c,v 1.67 2009-07-15 17:44:47 nicm Exp $ */ +/* $Id: cmd-set-option.c,v 1.68 2009-07-19 14:35:56 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -75,6 +75,9 @@ const struct set_option_entry set_option_table[] = { { "status-right", SET_OPTION_STRING, 0, 0, NULL }, { "status-right-length", SET_OPTION_NUMBER, 0, SHRT_MAX, NULL }, { "status-utf8", SET_OPTION_FLAG, 0, 0, NULL }, + { "visual-activity", SET_OPTION_FLAG, 0, 0, NULL }, + { "visual-bell", SET_OPTION_FLAG, 0, 0, NULL }, + { "visual-content", SET_OPTION_FLAG, 0, 0, NULL }, { NULL, 0, 0, 0, NULL } }; diff --git a/server.c b/server.c index 3d3d6f40..f1941082 100644 --- a/server.c +++ b/server.c @@ -1,4 +1,4 @@ -/* $Id: server.c,v 1.158 2009-07-15 17:43:45 nicm Exp $ */ +/* $Id: server.c,v 1.159 2009-07-19 14:35:56 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -54,8 +54,7 @@ void server_handle_clients(struct pollfd **); struct client *server_accept_client(int); void server_handle_client(struct client *); void server_handle_window(struct window *, struct window_pane *); -int server_check_window_bell(struct session *, struct window *, - struct window_pane *); +int server_check_window_bell(struct session *, struct window *); int server_check_window_activity(struct session *, struct window *); int server_check_window_content(struct session *, struct window *, @@ -914,7 +913,7 @@ server_handle_window(struct window *w, struct window_pane *wp) if (s == NULL || !session_has(s, w)) continue; - update += server_check_window_bell(s, w, wp); + update += server_check_window_bell(s, w); update += server_check_window_activity(s, w); update += server_check_window_content(s, w, wp); } @@ -925,12 +924,11 @@ server_handle_window(struct window *w, struct window_pane *wp) } int -server_check_window_bell( - struct session *s, struct window *w, struct window_pane *wp) +server_check_window_bell(struct session *s, struct window *w) { struct client *c; u_int i; - int action; + int action, visual; if (!(w->flags & WINDOW_BELL)) return (0); @@ -943,19 +941,38 @@ server_check_window_bell( case BELL_ANY: if (s->flags & SESSION_UNATTACHED) break; + visual = options_get_number(&s->options, "visual-bell"); for (i = 0; i < ARRAY_LENGTH(&clients); i++) { c = ARRAY_ITEM(&clients, i); - if (c != NULL && c->session == s) + if (c == NULL || c->session != s) + continue; + if (!visual) { tty_putcode(&c->tty, TTYC_BEL); + continue; + } + if (c->session->curw->window == w) { + status_message_set(c, "Bell in current window"); + continue; + } + status_message_set(c, "Bell in window %u", + winlink_find_by_window(&s->windows, w)->idx); } break; case BELL_CURRENT: - if (w->active != wp) + if (s->flags & SESSION_UNATTACHED) break; + visual = options_get_number(&s->options, "visual-bell"); for (i = 0; i < ARRAY_LENGTH(&clients); i++) { c = ARRAY_ITEM(&clients, i); - if (c != NULL && c->session == s) + if (c == NULL || c->session != s) + continue; + if (c->session->curw->window != w) + continue; + if (!visual) { tty_putcode(&c->tty, TTYC_BEL); + continue; + } + status_message_set(c, "Bell in current window"); } break; } @@ -965,13 +982,33 @@ server_check_window_bell( int server_check_window_activity(struct session *s, struct window *w) { + struct client *c; + u_int i; + if (!(w->flags & WINDOW_ACTIVITY)) return (0); + if (!options_get_number(&w->options, "monitor-activity")) return (0); + if (session_alert_has_window(s, w, WINDOW_ACTIVITY)) return (0); + if (s->curw->window == w) + return (0); + session_alert_add(s, w, WINDOW_ACTIVITY); + if (s->flags & SESSION_UNATTACHED) + return (0); + if (options_get_number(&s->options, "visual-activity")) { + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session != s) + continue; + status_message_set(c, "Activity in window %u", + winlink_find_by_window(&s->windows, w)->idx); + } + } + return (1); } @@ -979,20 +1016,39 @@ int server_check_window_content( struct session *s, struct window *w, struct window_pane *wp) { - char *found, *ptr; + struct client *c; + u_int i; + char *found, *ptr; + + if (!(w->flags & WINDOW_ACTIVITY)) /* activity for new content */ + return (0); - if (!(w->flags & WINDOW_CONTENT)) - return (0); - if ((ptr = options_get_string(&w->options, "monitor-content")) == NULL) - return (0); - if (*ptr == '\0') + ptr = options_get_string(&w->options, "monitor-content"); + if (ptr == NULL || *ptr == '\0') return (0); + if (session_alert_has_window(s, w, WINDOW_CONTENT)) return (0); + if (s->curw->window == w) + return (0); + if ((found = window_pane_search(wp, ptr, NULL)) == NULL) return (0); - session_alert_add(s, w, WINDOW_CONTENT); xfree(found); + + session_alert_add(s, w, WINDOW_CONTENT); + if (s->flags & SESSION_UNATTACHED) + return (0); + if (options_get_number(&s->options, "visual-content")) { + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { + c = ARRAY_ITEM(&clients, i); + if (c == NULL || c->session != s) + continue; + status_message_set(c, "Content in window %u", + winlink_find_by_window(&s->windows, w)->idx); + } + } + return (1); } diff --git a/tmux.1 b/tmux.1 index 3fe84346..ccc9505f 100644 --- a/tmux.1 +++ b/tmux.1 @@ -1,4 +1,4 @@ -.\" $Id: tmux.1,v 1.122 2009-07-19 00:39:37 tcunha Exp $ +.\" $Id: tmux.1,v 1.123 2009-07-19 14:35:56 tcunha Exp $ .\" .\" Copyright (c) 2007 Nicholas Marriott .\" @@ -1324,6 +1324,30 @@ and .Ic status-right strings as UTF-8; notably, this is important for wide characters. This option defaults to off. +.It Xo Ic visual-activity +.Op Ic on | Ic off +.Xc +If on, display a status line message when activity occurs in a window +for with the +.Ic monitor-activity +window option is enabled. +.It Xo Ic visual-bell +.Op Ic on | Ic off +.Xc +If this option is on, a message is shown on a bell instead of it being passed +through to the terminal (which normally makes a sound). +Also see the +.Ic bell-action +option. +.It Xo Ic visual-content +.Op Ic on | Ic off +.Xc +Like +.Ic visual-activity , +display a message when content is present in a window +for with the +.Ic monitor-content +window option is enabled. .El .It Xo Ic set-password .Op Fl c diff --git a/tmux.c b/tmux.c index c1a7f5f3..048f5b65 100644 --- a/tmux.c +++ b/tmux.c @@ -1,4 +1,4 @@ -/* $Id: tmux.c,v 1.143 2009-07-18 11:05:13 nicm Exp $ */ +/* $Id: tmux.c,v 1.144 2009-07-19 14:35:56 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -321,6 +321,9 @@ main(int argc, char **argv) options_set_number(&global_s_options, "status-utf8", 1); else options_set_number(&global_s_options, "status-utf8", 0); + options_set_number(&global_s_options, "visual-activity", 0); + options_set_number(&global_s_options, "visual-bell", 0); + options_set_number(&global_s_options, "visual-content", 0); options_init(&global_w_options, NULL); options_set_number(&global_w_options, "aggressive-resize", 0); diff --git a/tmux.h b/tmux.h index d67e9e5e..4f6cd4c3 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.371 2009-07-18 11:07:14 nicm Exp $ */ +/* $Id: tmux.h,v 1.372 2009-07-19 14:35:56 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -643,8 +643,8 @@ struct window { #define WINDOW_BELL 0x1 #define WINDOW_HIDDEN 0x2 #define WINDOW_ACTIVITY 0x4 -#define WINDOW_CONTENT 0x6 -#define WINDOW_REDRAW 0x8 +#define WINDOW_CONTENT 0x8 +#define WINDOW_REDRAW 0x10 struct options options;