mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-03 16:46:18 +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>
 | 
			
		||||
@@ -52,6 +52,7 @@ cmd_kill_pane_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	if (window_count_panes(wl->window) == 1) {
 | 
			
		||||
		/* Only one pane, kill the window. */
 | 
			
		||||
		server_kill_window(wl->window);
 | 
			
		||||
		recalculate_sizes();
 | 
			
		||||
		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>
 | 
			
		||||
@@ -47,6 +47,7 @@ cmd_kill_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	server_kill_window(wl->window);
 | 
			
		||||
	recalculate_sizes();
 | 
			
		||||
 | 
			
		||||
	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>
 | 
			
		||||
@@ -44,54 +44,22 @@ cmd_link_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
{
 | 
			
		||||
	struct cmd_srcdst_data	*data = self->data;
 | 
			
		||||
	struct session		*dst;
 | 
			
		||||
	struct winlink		*wl_src, *wl_dst;
 | 
			
		||||
	struct winlink		*wl;
 | 
			
		||||
	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);
 | 
			
		||||
	if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	wl_dst = NULL;
 | 
			
		||||
	if (idx != -1)
 | 
			
		||||
		wl_dst = winlink_find_by_index(&dst->windows, idx);
 | 
			
		||||
	if (wl_dst != NULL) {
 | 
			
		||||
		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);
 | 
			
		||||
	kflag = data->chflags & CMD_CHFLAG('k');
 | 
			
		||||
	dflag = data->chflags & CMD_CHFLAG('d');
 | 
			
		||||
	if (server_link_window(wl, dst, idx, kflag, !dflag, &cause) != 0) {
 | 
			
		||||
		ctx->error(ctx, "can't create session: %s", cause);
 | 
			
		||||
		xfree(cause);
 | 
			
		||||
		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();
 | 
			
		||||
 | 
			
		||||
	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>
 | 
			
		||||
@@ -44,68 +44,23 @@ cmd_move_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
{
 | 
			
		||||
	struct cmd_srcdst_data	*data = self->data;
 | 
			
		||||
	struct session		*src, *dst;
 | 
			
		||||
	struct winlink		*wl_src, *wl_dst;
 | 
			
		||||
	struct client		*c;
 | 
			
		||||
	u_int		 	 i;
 | 
			
		||||
	int		 	 destroyed, idx;
 | 
			
		||||
	struct winlink		*wl;
 | 
			
		||||
	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);
 | 
			
		||||
	if ((idx = cmd_find_index(ctx, data->dst, &dst)) == -2)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	wl_dst = NULL;
 | 
			
		||||
	if (idx != -1)
 | 
			
		||||
		wl_dst = winlink_find_by_index(&dst->windows, idx);
 | 
			
		||||
	if (wl_dst != NULL) {
 | 
			
		||||
		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);
 | 
			
		||||
	kflag = data->chflags & CMD_CHFLAG('k');
 | 
			
		||||
	dflag = data->chflags & CMD_CHFLAG('d');
 | 
			
		||||
	if (server_link_window(wl, dst, idx, kflag, !dflag, &cause) != 0) {
 | 
			
		||||
		ctx->error(ctx, "can't create session: %s", cause);
 | 
			
		||||
		xfree(cause);
 | 
			
		||||
		return (-1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	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);
 | 
			
		||||
	}
 | 
			
		||||
	server_unlink_window(src, wl);
 | 
			
		||||
	recalculate_sizes();
 | 
			
		||||
 | 
			
		||||
	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>
 | 
			
		||||
@@ -55,17 +55,7 @@ cmd_unlink_window_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
		return (-1);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
 	destroyed = session_detach(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);
 | 
			
		||||
	}
 | 
			
		||||
	server_unlink_window(s, wl);
 | 
			
		||||
	recalculate_sizes();
 | 
			
		||||
 | 
			
		||||
	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>
 | 
			
		||||
@@ -292,7 +292,59 @@ server_kill_window(struct window *w)
 | 
			
		||||
		else
 | 
			
		||||
			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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										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>
 | 
			
		||||
@@ -1454,6 +1454,9 @@ void	 server_status_window(struct window *);
 | 
			
		||||
void	 server_lock(void);
 | 
			
		||||
int	 server_unlock(const char *);
 | 
			
		||||
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_set_identify(struct client *);
 | 
			
		||||
void	 server_clear_identify(struct client *);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user