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) \
 | 
					#define CONTROL_SHOULD_NOTIFY_CLIENT(c) \
 | 
				
			||||||
	((c) != NULL && ((c)->flags & CLIENT_CONTROL))
 | 
						((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
 | 
					void
 | 
				
			||||||
control_notify_window_layout_changed(struct window *w)
 | 
					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);
 | 
						buf = EVBUFFER_DATA(evb);
 | 
				
			||||||
	len = EVBUFFER_LENGTH(evb);
 | 
						len = EVBUFFER_LENGTH(evb);
 | 
				
			||||||
 | 
						notify_input(wp, evb);
 | 
				
			||||||
	off = 0;
 | 
						off = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Parse the input. */
 | 
						/* 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
 | 
					void
 | 
				
			||||||
notify_window_layout_changed(struct window *w)
 | 
					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 */
 | 
					/* notify.c */
 | 
				
			||||||
void	notify_enable(void);
 | 
					void	notify_enable(void);
 | 
				
			||||||
void	notify_disable(void);
 | 
					void	notify_disable(void);
 | 
				
			||||||
 | 
					void	notify_input(struct window_pane *, struct evbuffer *);
 | 
				
			||||||
void	notify_window_layout_changed(struct window *);
 | 
					void	notify_window_layout_changed(struct window *);
 | 
				
			||||||
void	notify_window_unlinked(struct session *, struct window *);
 | 
					void	notify_window_unlinked(struct session *, struct window *);
 | 
				
			||||||
void	notify_window_linked(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 *);
 | 
					void	control_write_buffer(struct client *, struct evbuffer *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* control-notify.c */
 | 
					/* 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_layout_changed(struct window *);
 | 
				
			||||||
void	control_notify_window_unlinked(struct session *, struct window *);
 | 
					void	control_notify_window_unlinked(struct session *, struct window *);
 | 
				
			||||||
void	control_notify_window_linked(struct session *, struct window *);
 | 
					void	control_notify_window_linked(struct session *, struct window *);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user