mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 09:26:05 +00:00 
			
		
		
		
	Add notification for input from a pane, from George Nachman.
This commit is contained in:
		@@ -24,6 +24,35 @@
 | 
			
		||||
#define CONTROL_SHOULD_NOTIFY_CLIENT(c) \
 | 
			
		||||
	((c) != NULL && ((c)->flags & CLIENT_CONTROL))
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
control_notify_input(struct client *c, struct window_pane *wp,
 | 
			
		||||
    struct evbuffer *input)
 | 
			
		||||
{
 | 
			
		||||
	u_char		*buf;
 | 
			
		||||
	size_t		 len;
 | 
			
		||||
	struct evbuffer *message;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
 | 
			
		||||
	if (c->session == NULL)
 | 
			
		||||
	    return;
 | 
			
		||||
 | 
			
		||||
	buf = EVBUFFER_DATA(input);
 | 
			
		||||
	len = EVBUFFER_LENGTH(input);
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Only write input if the window pane is linked to a window belonging
 | 
			
		||||
	 * to the client's session.
 | 
			
		||||
	 */
 | 
			
		||||
	if (winlink_find_by_window(&c->session->windows, wp->window) != NULL) {
 | 
			
		||||
		message = evbuffer_new();
 | 
			
		||||
		evbuffer_add_printf(message, "%%output %%%u ", wp->id);
 | 
			
		||||
		for (i = 0; i < len; i++)
 | 
			
		||||
			evbuffer_add_printf(message, "%02hhx", buf[i]);
 | 
			
		||||
		control_write_buffer(c, message);
 | 
			
		||||
		evbuffer_free(message);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
control_notify_window_layout_changed(struct window *w)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								input.c
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								input.c
									
									
									
									
									
								
							@@ -752,6 +752,7 @@ input_parse(struct window_pane *wp)
 | 
			
		||||
 | 
			
		||||
	buf = EVBUFFER_DATA(evb);
 | 
			
		||||
	len = EVBUFFER_LENGTH(evb);
 | 
			
		||||
	notify_input(wp, evb);
 | 
			
		||||
	off = 0;
 | 
			
		||||
 | 
			
		||||
	/* Parse the input. */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								notify.c
									
									
									
									
									
								
							
							
						
						
									
										20
									
								
								notify.c
									
									
									
									
									
								
							@@ -132,6 +132,26 @@ notify_drain(void)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
notify_input(struct window_pane *wp, struct evbuffer *input)
 | 
			
		||||
{
 | 
			
		||||
	struct client	*c;
 | 
			
		||||
	u_int		 i;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * notify_input() is not queued and only does anything when
 | 
			
		||||
	 * notifications are enabled.
 | 
			
		||||
	 */
 | 
			
		||||
	if (!notify_enabled)
 | 
			
		||||
		return;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
 | 
			
		||||
		c = ARRAY_ITEM(&clients, i);
 | 
			
		||||
		if (c != NULL && (c->flags & CLIENT_CONTROL))
 | 
			
		||||
			control_notify_input(c, wp, input);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
notify_window_layout_changed(struct window *w)
 | 
			
		||||
{
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1531,6 +1531,7 @@ enum mode_key_cmd mode_key_lookup(struct mode_key_data *, int);
 | 
			
		||||
/* notify.c */
 | 
			
		||||
void	notify_enable(void);
 | 
			
		||||
void	notify_disable(void);
 | 
			
		||||
void	notify_input(struct window_pane *, struct evbuffer *);
 | 
			
		||||
void	notify_window_layout_changed(struct window *);
 | 
			
		||||
void	notify_window_unlinked(struct session *, struct window *);
 | 
			
		||||
void	notify_window_linked(struct session *, struct window *);
 | 
			
		||||
@@ -2224,6 +2225,8 @@ void printflike2 control_write(struct client *, const char *, ...);
 | 
			
		||||
void	control_write_buffer(struct client *, struct evbuffer *);
 | 
			
		||||
 | 
			
		||||
/* control-notify.c */
 | 
			
		||||
void	control_notify_input(struct client *, struct window_pane *,
 | 
			
		||||
	    struct evbuffer *);
 | 
			
		||||
void	control_notify_window_layout_changed(struct window *);
 | 
			
		||||
void	control_notify_window_unlinked(struct session *, struct window *);
 | 
			
		||||
void	control_notify_window_linked(struct session *, struct window *);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user