mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Add support for a single "marked pane". There is one marked pane in the
server at a time; it may be toggled or cleared with select-pane -m and
-M (the border is highlighted). A new target '~' or '{marked}' specifies
the marked pane to commands and it is the default target for the
swap-pane and join-pane -s flag (this makes them much simpler to use -
mark the source pane and then change to the target pane to run swapp or
joinp).
			
			
This commit is contained in:
		
							
								
								
									
										92
									
								
								server.c
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								server.c
									
									
									
									
									
								
							@@ -50,19 +50,85 @@ int		 server_shutdown;
 | 
			
		||||
struct event	 server_ev_accept;
 | 
			
		||||
struct event	 server_ev_second;
 | 
			
		||||
 | 
			
		||||
int		 server_create_socket(void);
 | 
			
		||||
void		 server_loop(void);
 | 
			
		||||
int		 server_should_shutdown(void);
 | 
			
		||||
void		 server_send_shutdown(void);
 | 
			
		||||
void		 server_clean_dead(void);
 | 
			
		||||
void		 server_accept_callback(int, short, void *);
 | 
			
		||||
void		 server_signal_callback(int, short, void *);
 | 
			
		||||
void		 server_child_signal(void);
 | 
			
		||||
void		 server_child_exited(pid_t, int);
 | 
			
		||||
void		 server_child_stopped(pid_t, int);
 | 
			
		||||
void		 server_second_callback(int, short, void *);
 | 
			
		||||
void		 server_lock_server(void);
 | 
			
		||||
void		 server_lock_sessions(void);
 | 
			
		||||
struct session		*marked_session;
 | 
			
		||||
struct winlink		*marked_winlink;
 | 
			
		||||
struct window		*marked_window;
 | 
			
		||||
struct window_pane	*marked_window_pane;
 | 
			
		||||
struct layout_cell	*marked_layout_cell;
 | 
			
		||||
 | 
			
		||||
int	server_create_socket(void);
 | 
			
		||||
void	server_loop(void);
 | 
			
		||||
int	server_should_shutdown(void);
 | 
			
		||||
void	server_send_shutdown(void);
 | 
			
		||||
void	server_clean_dead(void);
 | 
			
		||||
void	server_accept_callback(int, short, void *);
 | 
			
		||||
void	server_signal_callback(int, short, void *);
 | 
			
		||||
void	server_child_signal(void);
 | 
			
		||||
void	server_child_exited(pid_t, int);
 | 
			
		||||
void	server_child_stopped(pid_t, int);
 | 
			
		||||
void	server_second_callback(int, short, void *);
 | 
			
		||||
void	server_lock_server(void);
 | 
			
		||||
void	server_lock_sessions(void);
 | 
			
		||||
 | 
			
		||||
/* Set marked pane. */
 | 
			
		||||
void
 | 
			
		||||
server_set_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	marked_session = s;
 | 
			
		||||
	marked_winlink = wl;
 | 
			
		||||
	marked_window = wl->window;
 | 
			
		||||
	marked_window_pane = wp;
 | 
			
		||||
	marked_layout_cell = wp->layout_cell;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Clear marked pane. */
 | 
			
		||||
void
 | 
			
		||||
server_clear_marked(void)
 | 
			
		||||
{
 | 
			
		||||
	marked_session = NULL;
 | 
			
		||||
	marked_winlink = NULL;
 | 
			
		||||
	marked_window = NULL;
 | 
			
		||||
	marked_window_pane = NULL;
 | 
			
		||||
	marked_layout_cell = NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Is this the marked pane? */
 | 
			
		||||
int
 | 
			
		||||
server_is_marked(struct session *s, struct winlink *wl, struct window_pane *wp)
 | 
			
		||||
{
 | 
			
		||||
	if (s == NULL || wl == NULL || wp == NULL)
 | 
			
		||||
		return (0);
 | 
			
		||||
	if (marked_session != s || marked_winlink != wl)
 | 
			
		||||
		return (0);
 | 
			
		||||
	if (marked_window_pane != wp)
 | 
			
		||||
		return (0);
 | 
			
		||||
	return (server_check_marked());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Check if the marked pane is still valid. */
 | 
			
		||||
int
 | 
			
		||||
server_check_marked(void)
 | 
			
		||||
{
 | 
			
		||||
	struct winlink	*wl;
 | 
			
		||||
 | 
			
		||||
	if (marked_window_pane == NULL)
 | 
			
		||||
		return (0);
 | 
			
		||||
	if (marked_layout_cell != marked_window_pane->layout_cell)
 | 
			
		||||
		return (0);
 | 
			
		||||
 | 
			
		||||
	if (!session_alive(marked_session))
 | 
			
		||||
		return (0);
 | 
			
		||||
	RB_FOREACH(wl, winlinks, &marked_session->windows) {
 | 
			
		||||
		if (wl->window == marked_window && wl == marked_winlink)
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
	if (wl == NULL)
 | 
			
		||||
		return (0);
 | 
			
		||||
 | 
			
		||||
	if (!window_has_pane(marked_window, marked_window_pane))
 | 
			
		||||
		return (0);
 | 
			
		||||
	return (window_pane_visible(marked_window_pane));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Create server socket. */
 | 
			
		||||
int
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user