xref: /netbsd-src/external/bsd/tmux/dist/cmd-move-window.c (revision 6db267571823ee3b0a1d61478df085a087f2e990)
15494e770Schristos /* $OpenBSD$ */
2698d5317Sjmmv 
3698d5317Sjmmv /*
4ed4e6cd4Schristos  * Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
5698d5317Sjmmv  *
6698d5317Sjmmv  * Permission to use, copy, modify, and distribute this software for any
7698d5317Sjmmv  * purpose with or without fee is hereby granted, provided that the above
8698d5317Sjmmv  * copyright notice and this permission notice appear in all copies.
9698d5317Sjmmv  *
10698d5317Sjmmv  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11698d5317Sjmmv  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12698d5317Sjmmv  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13698d5317Sjmmv  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14698d5317Sjmmv  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15698d5317Sjmmv  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16698d5317Sjmmv  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17698d5317Sjmmv  */
18698d5317Sjmmv 
19698d5317Sjmmv #include <sys/types.h>
20698d5317Sjmmv 
21698d5317Sjmmv #include <stdlib.h>
22698d5317Sjmmv 
23698d5317Sjmmv #include "tmux.h"
24698d5317Sjmmv 
25698d5317Sjmmv /*
26698d5317Sjmmv  * Move a window.
27698d5317Sjmmv  */
28698d5317Sjmmv 
294e179ddaSchristos static enum cmd_retval	cmd_move_window_exec(struct cmd *, struct cmdq_item *);
30698d5317Sjmmv 
31698d5317Sjmmv const struct cmd_entry cmd_move_window_entry = {
32ed4e6cd4Schristos 	.name = "move-window",
33ed4e6cd4Schristos 	.alias = "movew",
34ed4e6cd4Schristos 
35*6db26757Swiz 	.args = { "abdkrs:t:", 0, 0, NULL },
369fb66d81Schristos 	.usage = "[-abdkr] " CMD_SRCDST_WINDOW_USAGE,
37ed4e6cd4Schristos 
38c9ad075bSchristos 	.source = { 's', CMD_FIND_WINDOW, 0 },
39c9ad075bSchristos 	/* -t is special */
40ed4e6cd4Schristos 
41ed4e6cd4Schristos 	.flags = 0,
42ed4e6cd4Schristos 	.exec = cmd_move_window_exec
435494e770Schristos };
445494e770Schristos 
455494e770Schristos const struct cmd_entry cmd_link_window_entry = {
46ed4e6cd4Schristos 	.name = "link-window",
47ed4e6cd4Schristos 	.alias = "linkw",
48ed4e6cd4Schristos 
49*6db26757Swiz 	.args = { "abdks:t:", 0, 0, NULL },
509fb66d81Schristos 	.usage = "[-abdk] " CMD_SRCDST_WINDOW_USAGE,
51ed4e6cd4Schristos 
52c9ad075bSchristos 	.source = { 's', CMD_FIND_WINDOW, 0 },
53c9ad075bSchristos 	/* -t is special */
54ed4e6cd4Schristos 
55ed4e6cd4Schristos 	.flags = 0,
56ed4e6cd4Schristos 	.exec = cmd_move_window_exec
57698d5317Sjmmv };
58698d5317Sjmmv 
594e179ddaSchristos static enum cmd_retval
cmd_move_window_exec(struct cmd * self,struct cmdq_item * item)604e179ddaSchristos cmd_move_window_exec(struct cmd *self, struct cmdq_item *item)
61698d5317Sjmmv {
629fb66d81Schristos 	struct args		*args = cmd_get_args(self);
639fb66d81Schristos 	struct cmd_find_state	*source = cmdq_get_source(item);
649fb66d81Schristos 	struct cmd_find_state	 target;
65c9ad075bSchristos 	const char		*tflag = args_get(args, 't');
669fb66d81Schristos 	struct session		*src = source->s;
67c9ad075bSchristos 	struct session		*dst;
689fb66d81Schristos 	struct winlink		*wl = source->wl;
69698d5317Sjmmv 	char			*cause;
709fb66d81Schristos 	int			 idx, kflag, dflag, sflag, before;
71698d5317Sjmmv 
72928fc495Schristos 	if (args_has(args, 'r')) {
739fb66d81Schristos 		if (cmd_find_target(&target, item, tflag, CMD_FIND_SESSION,
749fb66d81Schristos 		    CMD_FIND_QUIET) != 0)
75c9ad075bSchristos 			return (CMD_RETURN_ERROR);
76c9ad075bSchristos 
779fb66d81Schristos 		session_renumber_windows(target.s);
78928fc495Schristos 		recalculate_sizes();
799fb66d81Schristos 		server_status_session(target.s);
80928fc495Schristos 
81928fc495Schristos 		return (CMD_RETURN_NORMAL);
82928fc495Schristos 	}
839fb66d81Schristos 	if (cmd_find_target(&target, item, tflag, CMD_FIND_WINDOW,
84c9ad075bSchristos 	    CMD_FIND_WINDOW_INDEX) != 0)
85c9ad075bSchristos 		return (CMD_RETURN_ERROR);
869fb66d81Schristos 	dst = target.s;
879fb66d81Schristos 	idx = target.idx;
88928fc495Schristos 
899fb66d81Schristos 	kflag = args_has(args, 'k');
909fb66d81Schristos 	dflag = args_has(args, 'd');
919fb66d81Schristos 	sflag = args_has(args, 's');
925494e770Schristos 
939fb66d81Schristos 	before = args_has(args, 'b');
949fb66d81Schristos 	if (args_has(args, 'a') || before) {
959fb66d81Schristos 		if (target.wl != NULL)
969fb66d81Schristos 			idx = winlink_shuffle_up(dst, target.wl, before);
979fb66d81Schristos 		else
989fb66d81Schristos 			idx = winlink_shuffle_up(dst, dst->curw, before);
999fb66d81Schristos 		if (idx == -1)
1005494e770Schristos 			return (CMD_RETURN_ERROR);
1015494e770Schristos 	}
1025494e770Schristos 
1039fb66d81Schristos 	if (server_link_window(src, wl, dst, idx, kflag, !dflag, &cause) != 0) {
1049fb66d81Schristos 		cmdq_error(item, "%s", cause);
105928fc495Schristos 		free(cause);
106928fc495Schristos 		return (CMD_RETURN_ERROR);
107698d5317Sjmmv 	}
1089fb66d81Schristos 	if (cmd_get_entry(self) == &cmd_move_window_entry)
109698d5317Sjmmv 		server_unlink_window(src, wl);
1105494e770Schristos 
1115494e770Schristos 	/*
1125494e770Schristos 	 * Renumber the winlinks in the src session only, the destination
1135494e770Schristos 	 * session already has the correct winlink id to us, either
1145494e770Schristos 	 * automatically or specified by -s.
1155494e770Schristos 	 */
116ed4e6cd4Schristos 	if (!sflag && options_get_number(src->options, "renumber-windows"))
1175494e770Schristos 		session_renumber_windows(src);
1185494e770Schristos 
119698d5317Sjmmv 	recalculate_sizes();
120698d5317Sjmmv 
121928fc495Schristos 	return (CMD_RETURN_NORMAL);
122698d5317Sjmmv }
123