mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Add three new session options: visual-activity, visual-bell, visual-content. If
these are enabled (and the monitor-activity, bell-actio 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.
This commit is contained in:
		
							
								
								
									
										88
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										88
									
								
								server.c
									
									
									
									
									
								
							@@ -55,8 +55,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 *,
 | 
			
		||||
@@ -909,7 +908,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);
 | 
			
		||||
	}
 | 
			
		||||
@@ -920,12 +919,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);
 | 
			
		||||
@@ -938,19 +936,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;
 | 
			
		||||
	}
 | 
			
		||||
@@ -960,13 +977,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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -974,20 +1011,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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user