mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Merge unlink-window into kill-window.
This commit is contained in:
		
							
								
								
									
										1
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Makefile
									
									
									
									
									
								
							@@ -69,7 +69,6 @@ SRCS=	arguments.c \
 | 
			
		||||
	cmd-swap-window.c \
 | 
			
		||||
	cmd-switch-client.c \
 | 
			
		||||
	cmd-unbind-key.c \
 | 
			
		||||
	cmd-unlink-window.c \
 | 
			
		||||
	cmd-wait-for.c \
 | 
			
		||||
	cmd.c \
 | 
			
		||||
	cmd-queue.c \
 | 
			
		||||
 
 | 
			
		||||
@@ -34,23 +34,48 @@ const struct cmd_entry cmd_kill_window_entry = {
 | 
			
		||||
	cmd_kill_window_exec
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const struct cmd_entry cmd_unlink_window_entry = {
 | 
			
		||||
	"unlink-window", "unlinkw",
 | 
			
		||||
	"kt:", 0, 0,
 | 
			
		||||
	"[-k] " CMD_TARGET_WINDOW_USAGE,
 | 
			
		||||
	0,
 | 
			
		||||
	cmd_kill_window_exec
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum cmd_retval
 | 
			
		||||
cmd_kill_window_exec(struct cmd *self, struct cmd_q *cmdq)
 | 
			
		||||
{
 | 
			
		||||
	struct args	*args = self->args;
 | 
			
		||||
	struct winlink	*wl, *wl2, *wl3;
 | 
			
		||||
	struct session	*s;
 | 
			
		||||
	struct args		*args = self->args;
 | 
			
		||||
	struct winlink		*wl, *wl2, *wl3;
 | 
			
		||||
	struct window		*w;
 | 
			
		||||
	struct session		*s;
 | 
			
		||||
	struct session_group	*sg;
 | 
			
		||||
	u_int			 references;
 | 
			
		||||
 | 
			
		||||
	if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
	w = wl->window;
 | 
			
		||||
 | 
			
		||||
	if (args_has(args, 'a')) {
 | 
			
		||||
		RB_FOREACH_SAFE(wl2, winlinks, &s->windows, wl3) {
 | 
			
		||||
			if (wl != wl2)
 | 
			
		||||
				server_kill_window(wl2->window);
 | 
			
		||||
	if (self->entry == &cmd_unlink_window_entry) {
 | 
			
		||||
		sg = session_group_find(s);
 | 
			
		||||
		if (sg != NULL)
 | 
			
		||||
			references = session_group_count(sg);
 | 
			
		||||
		else
 | 
			
		||||
			references = 1;
 | 
			
		||||
		if (!args_has(self->args, 'k') && w->references == references) {
 | 
			
		||||
			cmdq_error(cmdq, "window only linked to one session");
 | 
			
		||||
			return (CMD_RETURN_ERROR);
 | 
			
		||||
		}
 | 
			
		||||
	} else
 | 
			
		||||
		server_kill_window(wl->window);
 | 
			
		||||
		server_unlink_window(s, wl);
 | 
			
		||||
	} else {
 | 
			
		||||
		if (args_has(args, 'a')) {
 | 
			
		||||
			RB_FOREACH_SAFE(wl2, winlinks, &s->windows, wl3) {
 | 
			
		||||
				if (wl != wl2)
 | 
			
		||||
					server_kill_window(wl2->window);
 | 
			
		||||
			}
 | 
			
		||||
		} else
 | 
			
		||||
			server_kill_window(wl->window);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	recalculate_sizes();
 | 
			
		||||
	return (CMD_RETURN_NORMAL);
 | 
			
		||||
 
 | 
			
		||||
@@ -1,68 +0,0 @@
 | 
			
		||||
/* $OpenBSD$ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
 *
 | 
			
		||||
 * Permission to use, copy, modify, and distribute this software for any
 | 
			
		||||
 * purpose with or without fee is hereby granted, provided that the above
 | 
			
		||||
 * copyright notice and this permission notice appear in all copies.
 | 
			
		||||
 *
 | 
			
		||||
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 | 
			
		||||
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 | 
			
		||||
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 | 
			
		||||
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 | 
			
		||||
 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
 | 
			
		||||
 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
 | 
			
		||||
 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include "tmux.h"
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Unlink a window, unless it would be destroyed by doing so (only one link).
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
enum cmd_retval	 cmd_unlink_window_exec(struct cmd *, struct cmd_q *);
 | 
			
		||||
 | 
			
		||||
const struct cmd_entry cmd_unlink_window_entry = {
 | 
			
		||||
	"unlink-window", "unlinkw",
 | 
			
		||||
	"kt:", 0, 0,
 | 
			
		||||
	"[-k] " CMD_TARGET_WINDOW_USAGE,
 | 
			
		||||
	0,
 | 
			
		||||
	cmd_unlink_window_exec
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
enum cmd_retval
 | 
			
		||||
cmd_unlink_window_exec(struct cmd *self, struct cmd_q *cmdq)
 | 
			
		||||
{
 | 
			
		||||
	struct args		*args = self->args;
 | 
			
		||||
	struct winlink		*wl;
 | 
			
		||||
	struct window		*w;
 | 
			
		||||
	struct session		*s, *s2;
 | 
			
		||||
	struct session_group	*sg;
 | 
			
		||||
	u_int			 references;
 | 
			
		||||
 | 
			
		||||
	if ((wl = cmd_find_window(cmdq, args_get(args, 't'), &s)) == NULL)
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
	w = wl->window;
 | 
			
		||||
 | 
			
		||||
	sg = session_group_find(s);
 | 
			
		||||
	if (sg != NULL) {
 | 
			
		||||
		references = 0;
 | 
			
		||||
		TAILQ_FOREACH(s2, &sg->sessions, gentry)
 | 
			
		||||
			references++;
 | 
			
		||||
	} else
 | 
			
		||||
		references = 1;
 | 
			
		||||
 | 
			
		||||
	if (!args_has(self->args, 'k') && w->references == references) {
 | 
			
		||||
		cmdq_error(cmdq, "window is only linked to one session");
 | 
			
		||||
		return (CMD_RETURN_ERROR);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	server_unlink_window(s, wl);
 | 
			
		||||
	recalculate_sizes();
 | 
			
		||||
 | 
			
		||||
	return (CMD_RETURN_NORMAL);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										18
									
								
								session.c
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								session.c
									
									
									
									
									
								
							@@ -492,6 +492,19 @@ session_group_remove(struct session *s)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Count number of sessions in session group. */
 | 
			
		||||
u_int
 | 
			
		||||
session_group_count(struct session_group *sg)
 | 
			
		||||
{
 | 
			
		||||
	struct session	*s;
 | 
			
		||||
	u_int		 n;
 | 
			
		||||
 | 
			
		||||
	n = 0;
 | 
			
		||||
	TAILQ_FOREACH(s, &sg->sessions, gentry)
 | 
			
		||||
	    n++;
 | 
			
		||||
	return (n);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Synchronize a session to its session group. */
 | 
			
		||||
void
 | 
			
		||||
session_group_synchronize_to(struct session *s)
 | 
			
		||||
@@ -579,8 +592,9 @@ session_group_synchronize1(struct session *target, struct session *s)
 | 
			
		||||
	/* Then free the old winlinks list. */
 | 
			
		||||
	while (!RB_EMPTY(&old_windows)) {
 | 
			
		||||
		wl = RB_ROOT(&old_windows);
 | 
			
		||||
		if (winlink_find_by_window_id(&s->windows, wl->window->id) == NULL)
 | 
			
		||||
		    notify_window_unlinked(s, wl->window);
 | 
			
		||||
		wl2 = winlink_find_by_window_id(&s->windows, wl->window->id);
 | 
			
		||||
		if (wl2 == NULL)
 | 
			
		||||
			notify_window_unlinked(s, wl->window);
 | 
			
		||||
		winlink_remove(&old_windows, wl);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								tmux.h
									
									
									
									
									
								
							@@ -2296,6 +2296,7 @@ struct session_group *session_group_find(struct session *);
 | 
			
		||||
u_int		 session_group_index(struct session_group *);
 | 
			
		||||
void		 session_group_add(struct session *, struct session *);
 | 
			
		||||
void		 session_group_remove(struct session *);
 | 
			
		||||
u_int		 session_group_count(struct session_group *);
 | 
			
		||||
void		 session_group_synchronize_to(struct session *);
 | 
			
		||||
void		 session_group_synchronize_from(struct session *);
 | 
			
		||||
void		 session_group_synchronize1(struct session *, struct session *);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user