mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Sync OpenBSD patchset 333:
Move some common and untidy code for window link/unlink into generic functions instead of duplicating it in move/link window..
This commit is contained in:
		@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: cmd-kill-pane.c,v 1.12 2009-07-30 20:45:20 tcunha Exp $ */
 | 
					/* $Id: cmd-kill-pane.c,v 1.13 2009-09-20 22:15:32 tcunha Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -52,6 +52,7 @@ cmd_kill_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
				
			|||||||
	if (window_count_panes(wl->window) == 1) {
 | 
						if (window_count_panes(wl->window) == 1) {
 | 
				
			||||||
		/* Only one pane, kill the window. */
 | 
							/* Only one pane, kill the window. */
 | 
				
			||||||
		server_kill_window(wl->window);
 | 
							server_kill_window(wl->window);
 | 
				
			||||||
 | 
							recalculate_sizes();
 | 
				
			||||||
		return (0);
 | 
							return (0);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: cmd-kill-window.c,v 1.19 2009-07-28 22:12:16 tcunha Exp $ */
 | 
					/* $Id: cmd-kill-window.c,v 1.20 2009-09-20 22:15:32 tcunha Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -47,6 +47,7 @@ cmd_kill_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
				
			|||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	server_kill_window(wl->window);
 | 
						server_kill_window(wl->window);
 | 
				
			||||||
 | 
						recalculate_sizes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (0);
 | 
						return (0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: cmd-link-window.c,v 1.32 2009-08-16 19:16:27 tcunha Exp $ */
 | 
					/* $Id: cmd-link-window.c,v 1.33 2009-09-20 22:15:32 tcunha Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -44,54 +44,22 @@ cmd_link_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	struct cmd_srcdst_data	*data = self->data;
 | 
						struct cmd_srcdst_data	*data = self->data;
 | 
				
			||||||
	struct session		*dst;
 | 
						struct session		*dst;
 | 
				
			||||||
	struct winlink		*wl_src, *wl_dst;
 | 
						struct winlink		*wl;
 | 
				
			||||||
	char			*cause;
 | 
						char			*cause;
 | 
				
			||||||
	int			 idx;
 | 
						int			 idx, kflag, dflag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((wl_src = cmd_find_window(ctx, data->src, NULL)) == NULL)
 | 
						if ((wl = cmd_find_window(ctx, data->src, NULL)) == NULL)
 | 
				
			||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
	if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2)
 | 
						if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2)
 | 
				
			||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wl_dst = NULL;
 | 
						kflag = data->chflags & CMD_CHFLAG('k');
 | 
				
			||||||
	if (idx != -1)
 | 
						dflag = data->chflags & CMD_CHFLAG('d');
 | 
				
			||||||
		wl_dst = winlink_find_by_index(&dst->windows, idx);
 | 
						if (server_link_window(wl, dst, idx, kflag, !dflag, &cause) != 0) {
 | 
				
			||||||
	if (wl_dst != NULL) {
 | 
							ctx->error(ctx, "can't create session: %s", cause);
 | 
				
			||||||
		if (wl_dst->window == wl_src->window)
 | 
					 | 
				
			||||||
			return (0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (data->chflags & CMD_CHFLAG('k')) {
 | 
					 | 
				
			||||||
			/*
 | 
					 | 
				
			||||||
			 * Can't use session_detach as it will destroy session
 | 
					 | 
				
			||||||
			 * if this makes it empty.
 | 
					 | 
				
			||||||
			 */
 | 
					 | 
				
			||||||
			session_alert_cancel(dst, wl_dst);
 | 
					 | 
				
			||||||
			winlink_stack_remove(&dst->lastw, wl_dst);
 | 
					 | 
				
			||||||
			winlink_remove(&dst->windows, wl_dst);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			/* Force select/redraw if current. */
 | 
					 | 
				
			||||||
			if (wl_dst == dst->curw) {
 | 
					 | 
				
			||||||
				data->chflags &= ~CMD_CHFLAG('d');
 | 
					 | 
				
			||||||
				dst->curw = NULL;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (idx == -1)
 | 
					 | 
				
			||||||
		idx = -1 - options_get_number(&dst->options, "base-index");
 | 
					 | 
				
			||||||
	wl_dst = session_attach(dst, wl_src->window, idx, &cause);
 | 
					 | 
				
			||||||
	if (wl_dst == NULL) {
 | 
					 | 
				
			||||||
		ctx->error(ctx, "create session failed: %s", cause);
 | 
					 | 
				
			||||||
		xfree(cause);
 | 
							xfree(cause);
 | 
				
			||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (data->chflags & CMD_CHFLAG('d'))
 | 
					 | 
				
			||||||
		server_status_session(dst);
 | 
					 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		session_select(dst, wl_dst->idx);
 | 
					 | 
				
			||||||
		server_redraw_session(dst);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	recalculate_sizes();
 | 
						recalculate_sizes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (0);
 | 
						return (0);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: cmd-move-window.c,v 1.9 2009-08-16 19:16:27 tcunha Exp $ */
 | 
					/* $Id: cmd-move-window.c,v 1.10 2009-09-20 22:15:32 tcunha Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -44,68 +44,23 @@ cmd_move_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
	struct cmd_srcdst_data	*data = self->data;
 | 
						struct cmd_srcdst_data	*data = self->data;
 | 
				
			||||||
	struct session		*src, *dst;
 | 
						struct session		*src, *dst;
 | 
				
			||||||
	struct winlink		*wl_src, *wl_dst;
 | 
						struct winlink		*wl;
 | 
				
			||||||
	struct client		*c;
 | 
					 | 
				
			||||||
	u_int		 	 i;
 | 
					 | 
				
			||||||
	int		 	 destroyed, idx;
 | 
					 | 
				
			||||||
	char			*cause;
 | 
						char			*cause;
 | 
				
			||||||
 | 
						int			 idx, kflag, dflag;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((wl_src = cmd_find_window(ctx, data->src, &src)) == NULL)
 | 
						if ((wl = cmd_find_window(ctx, data->src, &src)) == NULL)
 | 
				
			||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
	if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2)
 | 
						if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2)
 | 
				
			||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	wl_dst = NULL;
 | 
						kflag = data->chflags & CMD_CHFLAG('k');
 | 
				
			||||||
	if (idx != -1)
 | 
						dflag = data->chflags & CMD_CHFLAG('d');
 | 
				
			||||||
		wl_dst = winlink_find_by_index(&dst->windows, idx);
 | 
						if (server_link_window(wl, dst, idx, kflag, !dflag, &cause) != 0) {
 | 
				
			||||||
	if (wl_dst != NULL) {
 | 
							ctx->error(ctx, "can't create session: %s", cause);
 | 
				
			||||||
		if (wl_dst->window == wl_src->window)
 | 
					 | 
				
			||||||
			return (0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
		if (data->chflags & CMD_CHFLAG('k')) {
 | 
					 | 
				
			||||||
			/*
 | 
					 | 
				
			||||||
			 * Can't use session_detach as it will destroy session
 | 
					 | 
				
			||||||
			 * if this makes it empty.
 | 
					 | 
				
			||||||
			 */
 | 
					 | 
				
			||||||
			session_alert_cancel(dst, wl_dst);
 | 
					 | 
				
			||||||
			winlink_stack_remove(&dst->lastw, wl_dst);
 | 
					 | 
				
			||||||
			winlink_remove(&dst->windows, wl_dst);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
			/* Force select/redraw if current. */
 | 
					 | 
				
			||||||
			if (wl_dst == dst->curw) {
 | 
					 | 
				
			||||||
				data->chflags &= ~CMD_CHFLAG('d');
 | 
					 | 
				
			||||||
				dst->curw = NULL;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (idx == -1)
 | 
					 | 
				
			||||||
		idx = -1 - options_get_number(&dst->options, "base-index");
 | 
					 | 
				
			||||||
	wl_dst = session_attach(dst, wl_src->window, idx, &cause);
 | 
					 | 
				
			||||||
	if (wl_dst == NULL) {
 | 
					 | 
				
			||||||
		ctx->error(ctx, "attach window failed: %s", cause);
 | 
					 | 
				
			||||||
		xfree(cause);
 | 
							xfree(cause);
 | 
				
			||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						server_unlink_window(src, wl);
 | 
				
			||||||
	destroyed = session_detach(src, wl_src);
 | 
					 | 
				
			||||||
	for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
 | 
					 | 
				
			||||||
		c = ARRAY_ITEM(&clients, i);
 | 
					 | 
				
			||||||
		if (c == NULL || c->session != src)
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		if (destroyed) {
 | 
					 | 
				
			||||||
			c->session = NULL;
 | 
					 | 
				
			||||||
			server_write_client(c, MSG_EXIT, NULL, 0);
 | 
					 | 
				
			||||||
		} else
 | 
					 | 
				
			||||||
			server_redraw_client(c);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (data->chflags & CMD_CHFLAG('d'))
 | 
					 | 
				
			||||||
		server_status_session(dst);
 | 
					 | 
				
			||||||
	else {
 | 
					 | 
				
			||||||
		session_select(dst, wl_dst->idx);
 | 
					 | 
				
			||||||
		server_redraw_session(dst);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	recalculate_sizes();
 | 
						recalculate_sizes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (0);
 | 
						return (0);
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: cmd-unlink-window.c,v 1.16 2009-07-28 22:12:16 tcunha Exp $ */
 | 
					/* $Id: cmd-unlink-window.c,v 1.17 2009-09-20 22:15:32 tcunha Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -55,17 +55,7 @@ cmd_unlink_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
				
			|||||||
		return (-1);
 | 
							return (-1);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 	destroyed = session_detach(s, wl);
 | 
						server_unlink_window(s, wl);
 | 
				
			||||||
	for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
 | 
					 | 
				
			||||||
		c = ARRAY_ITEM(&clients, i);
 | 
					 | 
				
			||||||
		if (c == NULL || c->session != s)
 | 
					 | 
				
			||||||
			continue;
 | 
					 | 
				
			||||||
		if (destroyed) {
 | 
					 | 
				
			||||||
			c->session = NULL;
 | 
					 | 
				
			||||||
			server_write_client(c, MSG_EXIT, NULL, 0);
 | 
					 | 
				
			||||||
		} else
 | 
					 | 
				
			||||||
			server_redraw_client(c);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	recalculate_sizes();
 | 
						recalculate_sizes();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (0);
 | 
						return (0);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										56
									
								
								server-fn.c
									
									
									
									
									
								
							
							
						
						
									
										56
									
								
								server-fn.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: server-fn.c,v 1.88 2009-09-20 22:11:27 tcunha Exp $ */
 | 
					/* $Id: server-fn.c,v 1.89 2009-09-20 22:15:32 tcunha Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -292,7 +292,59 @@ server_kill_window(struct window *w)
 | 
				
			|||||||
		else
 | 
							else
 | 
				
			||||||
			server_redraw_session(s);
 | 
								server_redraw_session(s);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	recalculate_sizes();
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					server_link_window(
 | 
				
			||||||
 | 
					    struct winlink *srcwl, struct session *dst, int dstidx,
 | 
				
			||||||
 | 
					    int killflag, int selectflag, char **cause)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct winlink	*dstwl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dstwl = NULL;
 | 
				
			||||||
 | 
						if (dstidx != -1)
 | 
				
			||||||
 | 
							dstwl = winlink_find_by_index(&dst->windows, dstidx);
 | 
				
			||||||
 | 
						if (dstwl != NULL) {
 | 
				
			||||||
 | 
							if (dstwl->window == srcwl->window)
 | 
				
			||||||
 | 
								return (0);
 | 
				
			||||||
 | 
							if (killflag) {
 | 
				
			||||||
 | 
								/*
 | 
				
			||||||
 | 
								 * Can't use session_detach as it will destroy session
 | 
				
			||||||
 | 
								 * if this makes it empty.
 | 
				
			||||||
 | 
								 */
 | 
				
			||||||
 | 
								session_alert_cancel(dst, dstwl);
 | 
				
			||||||
 | 
								winlink_stack_remove(&dst->lastw, dstwl);
 | 
				
			||||||
 | 
								winlink_remove(&dst->windows, dstwl);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								/* Force select/redraw if current. */
 | 
				
			||||||
 | 
								if (dstwl == dst->curw)
 | 
				
			||||||
 | 
									selectflag = 1;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (dstidx == -1)
 | 
				
			||||||
 | 
							dstidx = -1 - options_get_number(&dst->options, "base-index");
 | 
				
			||||||
 | 
						dstwl = session_attach(dst, srcwl->window, dstidx, cause);
 | 
				
			||||||
 | 
						if (dstwl == NULL)
 | 
				
			||||||
 | 
							return (-1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!selectflag)
 | 
				
			||||||
 | 
							server_status_session(dst);
 | 
				
			||||||
 | 
						else {
 | 
				
			||||||
 | 
							session_select(dst, dstwl->idx);
 | 
				
			||||||
 | 
							server_redraw_session(dst);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					server_unlink_window(struct session *s, struct winlink *wl)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (session_detach(s, wl))
 | 
				
			||||||
 | 
							server_destroy_session(s);
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							server_redraw_session(s);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										5
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $Id: tmux.h,v 1.443 2009-09-16 12:36:27 nicm Exp $ */
 | 
					/* $Id: tmux.h,v 1.444 2009-09-20 22:15:32 tcunha Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
					 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
				
			||||||
@@ -1454,6 +1454,9 @@ void	 server_status_window(struct window *);
 | 
				
			|||||||
void	 server_lock(void);
 | 
					void	 server_lock(void);
 | 
				
			||||||
int	 server_unlock(const char *);
 | 
					int	 server_unlock(const char *);
 | 
				
			||||||
void	 server_kill_window(struct window *);
 | 
					void	 server_kill_window(struct window *);
 | 
				
			||||||
 | 
					int	 server_link_window(
 | 
				
			||||||
 | 
						     struct winlink *, struct session *, int, int, int, char **);
 | 
				
			||||||
 | 
					void	 server_unlink_window(struct session *, struct winlink *);
 | 
				
			||||||
void	 server_destroy_session(struct session *);
 | 
					void	 server_destroy_session(struct session *);
 | 
				
			||||||
void	 server_set_identify(struct client *);
 | 
					void	 server_set_identify(struct client *);
 | 
				
			||||||
void	 server_clear_identify(struct client *);
 | 
					void	 server_clear_identify(struct client *);
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user