mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 01:34:18 +00:00 
			
		
		
		
	Fix bell indicators across detach, reported by Torbjorn Lonnemark, diff
from Thomas Adam.
This commit is contained in:
		
							
								
								
									
										44
									
								
								alerts.c
									
									
									
									
									
								
							
							
						
						
									
										44
									
								
								alerts.c
									
									
									
									
									
								
							@@ -29,6 +29,7 @@ int	alerts_enabled(struct window *, int);
 | 
				
			|||||||
void	alerts_callback(int, short, void *);
 | 
					void	alerts_callback(int, short, void *);
 | 
				
			||||||
void	alerts_reset(struct window *);
 | 
					void	alerts_reset(struct window *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int	alerts_check_all(struct session *, struct winlink *);
 | 
				
			||||||
int	alerts_check_bell(struct session *, struct winlink *);
 | 
					int	alerts_check_bell(struct session *, struct winlink *);
 | 
				
			||||||
int	alerts_check_activity(struct session *, struct winlink *);
 | 
					int	alerts_check_activity(struct session *, struct winlink *);
 | 
				
			||||||
int	alerts_check_silence(struct session *, struct winlink *);
 | 
					int	alerts_check_silence(struct session *, struct winlink *);
 | 
				
			||||||
@@ -54,16 +55,14 @@ alerts_callback(__unused int fd, __unused short events, __unused void *arg)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	RB_FOREACH(w, windows, &windows) {
 | 
						RB_FOREACH(w, windows, &windows) {
 | 
				
			||||||
		RB_FOREACH(s, sessions, &sessions) {
 | 
							RB_FOREACH(s, sessions, &sessions) {
 | 
				
			||||||
 | 
								if (s->flags & SESSION_UNATTACHED)
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
			RB_FOREACH(wl, winlinks, &s->windows) {
 | 
								RB_FOREACH(wl, winlinks, &s->windows) {
 | 
				
			||||||
				if (wl->window != w)
 | 
									if (wl->window != w)
 | 
				
			||||||
					continue;
 | 
										continue;
 | 
				
			||||||
				flags = w->flags;
 | 
									flags = w->flags;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				alerts  = alerts_check_bell(s, wl);
 | 
									alerts = alerts_check_all(s, wl);
 | 
				
			||||||
				alerts |= alerts_check_activity(s, wl);
 | 
					 | 
				
			||||||
				alerts |= alerts_check_silence(s, wl);
 | 
					 | 
				
			||||||
				if (alerts != 0)
 | 
					 | 
				
			||||||
					server_status_session(s);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
				log_debug("%s:%d @%u alerts check, alerts %#x, "
 | 
									log_debug("%s:%d @%u alerts check, alerts %#x, "
 | 
				
			||||||
				    "flags %#x", s->name, wl->idx, w->id,
 | 
									    "flags %#x", s->name, wl->idx, w->id,
 | 
				
			||||||
@@ -74,6 +73,29 @@ alerts_callback(__unused int fd, __unused short events, __unused void *arg)
 | 
				
			|||||||
	alerts_fired = 0;
 | 
						alerts_fired = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					alerts_check_all(struct session *s, struct winlink *wl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int	alerts;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						alerts  = alerts_check_bell(s, wl);
 | 
				
			||||||
 | 
						alerts |= alerts_check_activity(s, wl);
 | 
				
			||||||
 | 
						alerts |= alerts_check_silence(s, wl);
 | 
				
			||||||
 | 
						if (alerts != 0)
 | 
				
			||||||
 | 
							server_status_session(s);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (alerts);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					alerts_check_session(struct session *s)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct winlink	*wl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						RB_FOREACH(wl, winlinks, &s->windows)
 | 
				
			||||||
 | 
							alerts_check_all(s, wl);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
alerts_enabled(struct window *w, int flags)
 | 
					alerts_enabled(struct window *w, int flags)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@@ -143,12 +165,12 @@ alerts_check_bell(struct session *s, struct winlink *wl)
 | 
				
			|||||||
	struct window	*w = wl->window;
 | 
						struct window	*w = wl->window;
 | 
				
			||||||
	int		 action, visual;
 | 
						int		 action, visual;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!(w->flags & WINDOW_BELL) || wl->flags & WINLINK_BELL)
 | 
						if (!(w->flags & WINDOW_BELL))
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	if (s->curw != wl || s->flags & SESSION_UNATTACHED)
 | 
						if (s->curw != wl) {
 | 
				
			||||||
		wl->flags |= WINLINK_BELL;
 | 
							wl->flags |= WINLINK_BELL;
 | 
				
			||||||
	if (s->flags & SESSION_UNATTACHED)
 | 
							w->flags &= ~WINDOW_BELL;
 | 
				
			||||||
		return (0);
 | 
						}
 | 
				
			||||||
	if (s->curw->window == w)
 | 
						if (s->curw->window == w)
 | 
				
			||||||
		w->flags &= ~WINDOW_BELL;
 | 
							w->flags &= ~WINDOW_BELL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -190,7 +212,7 @@ alerts_check_activity(struct session *s, struct winlink *wl)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (!(w->flags & WINDOW_ACTIVITY) || wl->flags & WINLINK_ACTIVITY)
 | 
						if (!(w->flags & WINDOW_ACTIVITY) || wl->flags & WINLINK_ACTIVITY)
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	if (s->curw == wl && !(s->flags & SESSION_UNATTACHED))
 | 
						if (s->curw == wl)
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!options_get_number(w->options, "monitor-activity"))
 | 
						if (!options_get_number(w->options, "monitor-activity"))
 | 
				
			||||||
@@ -222,7 +244,7 @@ alerts_check_silence(struct session *s, struct winlink *wl)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (!(w->flags & WINDOW_SILENCE) || wl->flags & WINLINK_SILENCE)
 | 
						if (!(w->flags & WINDOW_SILENCE) || wl->flags & WINLINK_SILENCE)
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	if (s->curw == wl && !(s->flags & SESSION_UNATTACHED))
 | 
						if (s->curw == wl)
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (options_get_number(w->options, "monitor-silence") == 0)
 | 
						if (options_get_number(w->options, "monitor-silence") == 0)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -162,6 +162,7 @@ cmd_attach_session(struct cmd_q *cmdq, const char *tflag, int dflag, int rflag,
 | 
				
			|||||||
		cmdq->client_exit = 0;
 | 
							cmdq->client_exit = 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	recalculate_sizes();
 | 
						recalculate_sizes();
 | 
				
			||||||
 | 
						alerts_check_session(s);
 | 
				
			||||||
	server_update_socket();
 | 
						server_update_socket();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (CMD_RETURN_NORMAL);
 | 
						return (CMD_RETURN_NORMAL);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1757,6 +1757,7 @@ const char	*key_string_lookup_key(key_code);
 | 
				
			|||||||
/* alerts.c */
 | 
					/* alerts.c */
 | 
				
			||||||
void	alerts_reset_all(void);
 | 
					void	alerts_reset_all(void);
 | 
				
			||||||
void	alerts_queue(struct window *, int);
 | 
					void	alerts_queue(struct window *, int);
 | 
				
			||||||
 | 
					void	alerts_check_session(struct session *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* server.c */
 | 
					/* server.c */
 | 
				
			||||||
extern struct tmuxproc *server_proc;
 | 
					extern struct tmuxproc *server_proc;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user