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