From f12158bc258c9d1e1d64d55c436b5a94adabd3e8 Mon Sep 17 00:00:00 2001
From: Nicholas Marriott <nicm@openbsd.org>
Date: Sun, 3 Jul 2011 19:07:54 +0000
Subject: [PATCH] Add an option to trigger the terminal bell when there is an
 alert, from Marco Beck.

---
 options-table.c |  5 +++++
 server-window.c | 22 ++++++++++++++++++++++
 tmux.1          |  5 +++++
 3 files changed, 32 insertions(+)

diff --git a/options-table.c b/options-table.c
index 4b2f40bc..4a385051 100644
--- a/options-table.c
+++ b/options-table.c
@@ -98,6 +98,11 @@ const struct options_table_entry session_options_table[] = {
 	  .default_num = BELL_ANY
 	},
 
+	{ .name = "bell-on-alert",
+	  .type = OPTIONS_TABLE_FLAG,
+	  .default_num = 0
+	},
+
 	{ .name = "default-command",
 	  .type = OPTIONS_TABLE_STRING,
 	  .default_str = ""
diff --git a/server-window.c b/server-window.c
index b081355c..b444982d 100644
--- a/server-window.c
+++ b/server-window.c
@@ -28,6 +28,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 *);
+void	ring_bell(struct session *);
 
 /* Window functions that need to happen every loop. */
 void
@@ -134,6 +135,8 @@ server_window_check_activity(struct session *s, struct winlink *wl)
 	if (!options_get_number(&w->options, "monitor-activity"))
 		return (0);
 
+	if (options_get_number(&s->options, "bell-on-alert"))
+		ring_bell(s);
 	wl->flags |= WINLINK_ACTIVITY;
 
 	if (options_get_number(&s->options, "visual-activity")) {
@@ -183,6 +186,9 @@ server_window_check_silence(struct session *s, struct winlink *wl)
 	timer_difference = timer.tv_sec - w->silence_timer.tv_sec;
 	if (timer_difference <= silence_interval)
 		return (0);
+
+	if (options_get_number(&s->options, "bell-on-alert"))
+		ring_bell(s);
 	wl->flags |= WINLINK_SILENCE;
 
 	if (options_get_number(&s->options, "visual-silence")) {
@@ -221,6 +227,8 @@ server_window_check_content(
 		return (0);
 	xfree(found);
 
+	if (options_get_number(&s->options, "bell-on-alert"))
+		ring_bell(s);
 	wl->flags |= WINLINK_CONTENT;
 
 	if (options_get_number(&s->options, "visual-content")) {
@@ -235,3 +243,17 @@ server_window_check_content(
 
 	return (1);
 }
+
+/* Ring terminal bell. */
+void
+ring_bell(struct session *s)
+{
+	struct client	*c;
+	u_int		 i;
+
+	for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
+		c = ARRAY_ITEM(&clients, i);
+		if (c != NULL && c->session == s)
+			tty_putcode(&c->tty, TTYC_BEL);
+	}
+}
diff --git a/tmux.1 b/tmux.1
index 60d900a3..69ea5819 100644
--- a/tmux.1
+++ b/tmux.1
@@ -1779,6 +1779,11 @@ window of that session,
 means all bells are ignored and
 .Ic current
 means only bell in windows other than the current window are ignored.
+.It Xo Ic bell-on-alert
+.Op Ic on | off
+.Xc
+If on, ring the terminal bell when an activity, content or silence alert
+occurs.
 .It Ic default-command Ar shell-command
 Set the command used for new windows (if not specified when the window is
 created) to