xref: /openbsd/usr.bin/tmux/cmd-move-window.c (revision 8d471e80)
1*8d471e80Snicm /* $OpenBSD: cmd-move-window.c,v 1.24 2015/12/14 00:31:54 nicm Exp $ */
2311827fbSnicm 
3311827fbSnicm /*
4311827fbSnicm  * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
5311827fbSnicm  *
6311827fbSnicm  * Permission to use, copy, modify, and distribute this software for any
7311827fbSnicm  * purpose with or without fee is hereby granted, provided that the above
8311827fbSnicm  * copyright notice and this permission notice appear in all copies.
9311827fbSnicm  *
10311827fbSnicm  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11311827fbSnicm  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12311827fbSnicm  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13311827fbSnicm  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14311827fbSnicm  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15311827fbSnicm  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16311827fbSnicm  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17311827fbSnicm  */
18311827fbSnicm 
19311827fbSnicm #include <sys/types.h>
20311827fbSnicm 
21311827fbSnicm #include <stdlib.h>
22311827fbSnicm 
23311827fbSnicm #include "tmux.h"
24311827fbSnicm 
25311827fbSnicm /*
26311827fbSnicm  * Move a window.
27311827fbSnicm  */
28311827fbSnicm 
29175d36ccSnicm enum cmd_retval	 cmd_move_window_exec(struct cmd *, struct cmd_q *);
30311827fbSnicm 
31311827fbSnicm const struct cmd_entry cmd_move_window_entry = {
32c057646bSnicm 	.name = "move-window",
33c057646bSnicm 	.alias = "movew",
34c057646bSnicm 
35c057646bSnicm 	.args = { "adkrs:t:", 0, 0 },
36c057646bSnicm 	.usage = "[-dkr] " CMD_SRCDST_WINDOW_USAGE,
37c057646bSnicm 
38*8d471e80Snicm 	.sflag = CMD_WINDOW,
39*8d471e80Snicm 	.tflag = CMD_MOVEW_R,
40*8d471e80Snicm 
41*8d471e80Snicm 	.flags = 0,
42c057646bSnicm 	.exec = cmd_move_window_exec
43311827fbSnicm };
44311827fbSnicm 
45abb3f5acSnicm const struct cmd_entry cmd_link_window_entry = {
46c057646bSnicm 	.name = "link-window",
47c057646bSnicm 	.alias = "linkw",
48c057646bSnicm 
49c057646bSnicm 	.args = { "adks:t:", 0, 0 },
50c057646bSnicm 	.usage = "[-dk] " CMD_SRCDST_WINDOW_USAGE,
51c057646bSnicm 
52*8d471e80Snicm 	.sflag = CMD_WINDOW,
53*8d471e80Snicm 	.tflag = CMD_WINDOW_INDEX,
54*8d471e80Snicm 
55*8d471e80Snicm 	.flags = 0,
56c057646bSnicm 	.exec = cmd_move_window_exec
57abb3f5acSnicm };
58abb3f5acSnicm 
59a224d0d3Snicm enum cmd_retval
60175d36ccSnicm cmd_move_window_exec(struct cmd *self, struct cmd_q *cmdq)
61311827fbSnicm {
62ca7befccSnicm 	struct args	*args = self->args;
633447b427Snicm 	struct session	*src = cmdq->state.sflag.s;
643447b427Snicm 	struct session	*dst = cmdq->state.tflag.s;
653447b427Snicm 	struct winlink	*wl = cmdq->state.sflag.wl;
66311827fbSnicm 	char		*cause;
673447b427Snicm 	int		 idx = cmdq->state.tflag.idx, kflag, dflag, sflag;
683447b427Snicm 
693447b427Snicm 	kflag = args_has(self->args, 'k');
703447b427Snicm 	dflag = args_has(self->args, 'd');
71311827fbSnicm 
72559d6335Snicm 	if (args_has(args, 'r')) {
733447b427Snicm 		session_renumber_windows(dst);
7453c15224Snicm 		recalculate_sizes();
7553c15224Snicm 
76a224d0d3Snicm 		return (CMD_RETURN_NORMAL);
7753c15224Snicm 	}
7853c15224Snicm 
79ca7befccSnicm 	kflag = args_has(self->args, 'k');
80ca7befccSnicm 	dflag = args_has(self->args, 'd');
816df8b7e5Snicm 	sflag = args_has(self->args, 's');
82fe1fa7a5Snicm 
83fe1fa7a5Snicm 	if (args_has(self->args, 'a')) {
843447b427Snicm 		if ((idx = winlink_shuffle_up(dst, dst->curw)) == -1)
85fe1fa7a5Snicm 			return (CMD_RETURN_ERROR);
86fe1fa7a5Snicm 	}
87fe1fa7a5Snicm 
88abb3f5acSnicm 	if (server_link_window(src, wl, dst, idx, kflag, !dflag,
89abb3f5acSnicm 	    &cause) != 0) {
90abb3f5acSnicm 		cmdq_error(cmdq, "can't link window: %s", cause);
917d053cf9Snicm 		free(cause);
92a224d0d3Snicm 		return (CMD_RETURN_ERROR);
93311827fbSnicm 	}
94abb3f5acSnicm 	if (self->entry == &cmd_move_window_entry)
9521ced74dSnicm 		server_unlink_window(src, wl);
966df8b7e5Snicm 
976df8b7e5Snicm 	/*
986df8b7e5Snicm 	 * Renumber the winlinks in the src session only, the destination
996df8b7e5Snicm 	 * session already has the correct winlink id to us, either
1006df8b7e5Snicm 	 * automatically or specified by -s.
1016df8b7e5Snicm 	 */
102d89252e5Snicm 	if (!sflag && options_get_number(src->options, "renumber-windows"))
1036df8b7e5Snicm 		session_renumber_windows(src);
1046df8b7e5Snicm 
105311827fbSnicm 	recalculate_sizes();
106311827fbSnicm 
107a224d0d3Snicm 	return (CMD_RETURN_NORMAL);
108311827fbSnicm }
109