Actually, I just thought that this creates a regression for the existing
.tmux.conf of users with 'set bell-on-alert on'

Maybe a 'on' option could be added, which would alias 'BELL_OTHER' as the
previous default behaviour ?

Best regards,

Yvain

2017-07-26 11:58 GMT+02:00 Yvain Thonnart <[email protected]>:

> Hi Nicholas,
>
> Thanks for the feedback.
> I tried and went for your second option in the patch below.
>
> 'bell-on-alert' mimics 'bell-action' as much as possible.
> In particular, 'bell-on-alert' now notifies all the clients, as for
> 'alerts_check_bell'
>
> Nevertheless, I kept the original behaviour of both visual+audible (or
> hint),
> instead of the if (!visible) in 'alerts_check_bell'.
>
> The patch also fixes a typo in 'alerts_check_bell', for
> 'bell-action'=other (ws!=w -> ws==w)
>
> Is that what you had in mind ?
>
> Best regards,
>
> Yvain
>
>
> From 38a59edc4ed70857e67d88c62d188ecd08515191 Mon Sep 17 00:00:00 2001
> From: Yvain Thonnart <[email protected]>
> Date: Wed, 26 Jul 2017 11:14:18 +0200
> Subject: [PATCH] turn bell-on-alert to a choice option
>
> bell-on-alert becomes a choice option like bell-action.
>
> bell-on-alert [any | none | current | other]
>         Set action on window alert.  any means an alert in any window
> linked
>         to a session causes an alert in the current window of that session,
>         none means all alerts are ignored, current means only alerts in
> win-
>         dows other than the current window are ignored and other means
> alerts
>         in the current window are ignored but not those in other windows.
>
> Rationale:
> Bell can be used as an urgency hint.
> Excluding current window is fine when the actual terminal running tmux is
> in the foreground e.g. in a X session, but actually hides the upstream
> notification to terminal and window-manager.
>
> Also fixes a typo in alerts_check_bell, for bell-action=other (ws!=w ->
> ws==w)
> ---
>  alerts.c        | 85 ++++++++++++++++++++++++++++++
> +++++++++++++++------------
>  options-table.c |  5 ++--
>  tmux.1          | 14 ++++++++--
>  3 files changed, 81 insertions(+), 23 deletions(-)
>
> diff --git a/alerts.c b/alerts.c
> index a489d44..9a9f627 100644
> --- a/alerts.c
> +++ b/alerts.c
> @@ -199,7 +199,7 @@ alerts_check_bell(struct window *w)
>
>   if (action == BELL_CURRENT && ws != w)
>   action = BELL_NONE;
> - if (action == BELL_OTHER && ws != w)
> + if (action == BELL_OTHER && ws == w)
>   action = BELL_NONE;
>
>   if (!visual) {
> @@ -222,8 +222,11 @@ alerts_check_bell(struct window *w)
>  static int
>  alerts_check_activity(struct window *w)
>  {
> + struct window *ws;
>   struct winlink *wl;
>   struct session *s;
> + struct client *c;
> + int action, visual;
>
>   if (~w->flags & WINDOW_ACTIVITY)
>   return (0);
> @@ -237,20 +240,41 @@ alerts_check_activity(struct window *w)
>   if (wl->flags & WINLINK_ACTIVITY)
>   continue;
>   s = wl->session;
> - if (s->curw == wl)
> - continue;
> -
> - wl->flags |= WINLINK_ACTIVITY;
> - notify_winlink("alert-activity", wl);
> + if (s->curw != wl) {
> + wl->flags |= WINLINK_ACTIVITY;
> + notify_winlink("alert-activity", wl);
> + }
>
>   if (s->flags & SESSION_ALERTED)
>   continue;
>   s->flags |= SESSION_ALERTED;
>
> - if (options_get_number(s->options, "bell-on-alert"))
> - alerts_ring_bell(s);
> - if (options_get_number(s->options, "visual-activity"))
> - alerts_set_message(s, "Activity in window %d", wl->idx);
> + action = options_get_number(s->options, "bell-on-alert");
> + if (action == BELL_NONE)
> + return (0);
> +
> + visual = options_get_number(s->options, "visual-activity");
> + TAILQ_FOREACH(c, &clients, entry) {
> + if (c->session != s || c->flags & CLIENT_CONTROL)
> + continue;
> + ws = c->session->curw->window;
> +
> + if (action == BELL_CURRENT && ws != w)
> + action = BELL_NONE;
> + if (action == BELL_OTHER && ws == w)
> + action = BELL_NONE;
> +
> + if (action != BELL_NONE)
> + tty_putcode(&c->tty, TTYC_BEL);
> + if (visual) {
> + if (action == BELL_CURRENT)
> + status_message_set(c, "Activity in current window");
> + else if (action != BELL_NONE) {
> + status_message_set(c, "Activity in window %d",
> +    wl->idx);
> + }
> + }
> + }
>   }
>
>   return (WINDOW_ACTIVITY);
> @@ -259,8 +283,11 @@ alerts_check_activity(struct window *w)
>  static int
>  alerts_check_silence(struct window *w)
>  {
> + struct window *ws;
>   struct winlink *wl;
>   struct session *s;
> + struct client *c;
> + int action, visual;
>
>   if (~w->flags & WINDOW_SILENCE)
>   return (0);
> @@ -274,19 +301,41 @@ alerts_check_silence(struct window *w)
>   if (wl->flags & WINLINK_SILENCE)
>   continue;
>   s = wl->session;
> - if (s->curw == wl)
> - continue;
> - wl->flags |= WINLINK_SILENCE;
> - notify_winlink("alert-silence", wl);
> + if (s->curw != wl) {
> + wl->flags |= WINLINK_SILENCE;
> + notify_winlink("alert-silence", wl);
> + }
>
>   if (s->flags & SESSION_ALERTED)
>   continue;
>   s->flags |= SESSION_ALERTED;
>
> - if (options_get_number(s->options, "bell-on-alert"))
> - alerts_ring_bell(s);
> - if (options_get_number(s->options, "visual-silence"))
> - alerts_set_message(s, "Silence in window %d", wl->idx);
> + action = options_get_number(s->options, "bell-on-alert");
> + if (action == BELL_NONE)
> + return (0);
> +
> + visual = options_get_number(s->options, "visual-silence");
> + TAILQ_FOREACH(c, &clients, entry) {
> + if (c->session != s || c->flags & CLIENT_CONTROL)
> + continue;
> + ws = c->session->curw->window;
> +
> + if (action == BELL_CURRENT && ws != w)
> + action = BELL_NONE;
> + if (action == BELL_OTHER && ws == w)
> + action = BELL_NONE;
> +
> + if (action != BELL_NONE)
> + tty_putcode(&c->tty, TTYC_BEL);
> + if (visual) {
> + if (action == BELL_CURRENT)
> + status_message_set(c, "Silence in current window");
> + else if (action != BELL_NONE) {
> + status_message_set(c, "Silence in window %d",
> +    wl->idx);
> + }
> + }
> + }
>   }
>
>   return (WINDOW_SILENCE);
> diff --git a/options-table.c b/options-table.c
> index 0c0039f..b7bbdcc 100644
> --- a/options-table.c
> +++ b/options-table.c
> @@ -166,9 +166,10 @@ const struct options_table_entry options_table[] = {
>   },
>
>   { .name = "bell-on-alert",
> -  .type = OPTIONS_TABLE_FLAG,
> +  .type = OPTIONS_TABLE_CHOICE,
>    .scope = OPTIONS_TABLE_SESSION,
> -  .default_num = 0
> +  .choices = options_table_bell_action_list,
> +  .default_num = BELL_NONE
>   },
>
>   { .name = "default-command",
> diff --git a/tmux.1 b/tmux.1
> index 09eee74..24acb8e 100644
> --- a/tmux.1
> +++ b/tmux.1
> @@ -2544,10 +2544,18 @@ means only bells in windows other than the current
> window are ignored and
>  .Ic other
>  means bells in the current window are ignored but not those in other
> windows.
>  .It Xo Ic bell-on-alert
> -.Op Ic on | off
> +.Op Ic any | none | current | other
>  .Xc
> -If on, ring the terminal bell when an alert
> -occurs.
> +Set action on window alert.
> +.Ic any
> +means an alert in any window linked to a session causes an alert in the
> +current window of that session,
> +.Ic none
> +means all alerts are ignored,
> +.Ic current
> +means only alerts in windows other than the current window are ignored and
> +.Ic other
> +means alerts in the current window are ignored but not those in other
> windows.
>  .It Ic default-command Ar shell-command
>  Set the command used for new windows (if not specified when the window is
>  created) to
> --
> 2.7.0.25.gfc10eb5
>
>
> 2017-07-26 9:32 GMT+02:00 Nicholas Marriott <[email protected]>:
>
>> Hi
>>
>> Thanks - I don't think we should do this for everyone by default, but
>> you could do a couple of things instead:
>>
>> - bell-on-alert could also check bell-action to decide whether to send
>>   the bell (so bell-action "current" would also affect bell-on-alert);
>>
>> - Or bell-on-alert could become a three-state option like bell-action,
>>   so you set bell-on-alert to "current" to make it work in the current
>>   window.
>>
>> I think the second option would probably be better. In both cases you
>> would need to change both alerts_check_activity and
>> alerts_check_silence.
>>
>>
>>
>>
>>
>>
>> On Mon, Jul 17, 2017 at 07:53:54PM +0200, Yvain Thonnart wrote:
>> >    Dear tmux maintainers,
>> >    First of all, many thanks for your impressive continued work on this
>> great
>> >    program.
>> >    I stumbled upon an issue with activity monitoring in trying to setup
>> a new
>> >    workflow.
>> >    I am using the bell as an urgency hint in most of my console
>> programs, to
>> >    notify my terminal and windowmanager (namely xterm and i3wm) of
>> important
>> >    notices. I have been using it with tmux to pass on a bell signal for
>> a
>> >    long time.
>> >    Yet, as I recently tried to use activity monitoring, I found out
>> that the
>> >    alert is sent only when the alterting window is not the current
>> window.
>> >    However, as I am using several terminals and workspaces, the current
>> >    window is not always visible, so I needed to create a dummy window to
>> >    switch to in order to get the notification from the real window.
>> >    I tried to play a bit with the options, and even with the hooks in
>> the
>> >    latest versions, with no success.
>> >    Diggig in the code, I saw that you filter the alerts from the current
>> >    window.
>> >    I propose you a little modification, which actually suits my needs,
>> where
>> >    the bell is passed even in current window.
>> >    Apparently your integration strategy is via email patches, so I will
>> post
>> >    it as a followup.
>> >    I will be happy to discuss this, whether you think it is relevant or
>> not,
>> >    or if I missed a simple configuration setup...
>> >    Best regards,A
>> >    Yvain Thonnart
>> >    --------------------
>> >    Yvain THONNART (1):
>> >    A  alerts: activity/silence bell in current window
>> >    A alerts.c | 8 ++++----
>> >    A 1 file changed, 4 insertions(+), 4 deletions(-)
>> >
>> >    --
>> >    You received this message because you are subscribed to the Google
>> Groups
>> >    "tmux-users" group.
>> >    To unsubscribe from this group and stop receiving emails from it,
>> send an
>> >    email to [email protected].
>> >    To post to this group, send email to [email protected].
>> >    For more options, visit https://groups.google.com/d/optout.
>>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"tmux-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send an email to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to