4 * Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16 * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #include <sys/types.h>
29 static enum cmd_retval
cmd_move_window_exec(struct cmd
*, struct cmdq_item
*);
31 const struct cmd_entry cmd_move_window_entry
= {
32 .name
= "move-window",
35 .args
= { "abdkrs:t:", 0, 0, NULL
},
36 .usage
= "[-abdkr] " CMD_SRCDST_WINDOW_USAGE
,
38 .source
= { 's', CMD_FIND_WINDOW
, 0 },
42 .exec
= cmd_move_window_exec
45 const struct cmd_entry cmd_link_window_entry
= {
46 .name
= "link-window",
49 .args
= { "abdks:t:", 0, 0, NULL
},
50 .usage
= "[-abdk] " CMD_SRCDST_WINDOW_USAGE
,
52 .source
= { 's', CMD_FIND_WINDOW
, 0 },
56 .exec
= cmd_move_window_exec
59 static enum cmd_retval
60 cmd_move_window_exec(struct cmd
*self
, struct cmdq_item
*item
)
62 struct args
*args
= cmd_get_args(self
);
63 struct cmd_find_state
*source
= cmdq_get_source(item
);
64 struct cmd_find_state target
;
65 const char *tflag
= args_get(args
, 't');
66 struct session
*src
= source
->s
;
68 struct winlink
*wl
= source
->wl
;
70 int idx
, kflag
, dflag
, sflag
, before
;
72 if (args_has(args
, 'r')) {
73 if (cmd_find_target(&target
, item
, tflag
, CMD_FIND_SESSION
,
75 return (CMD_RETURN_ERROR
);
77 session_renumber_windows(target
.s
);
79 server_status_session(target
.s
);
81 return (CMD_RETURN_NORMAL
);
83 if (cmd_find_target(&target
, item
, tflag
, CMD_FIND_WINDOW
,
84 CMD_FIND_WINDOW_INDEX
) != 0)
85 return (CMD_RETURN_ERROR
);
89 kflag
= args_has(args
, 'k');
90 dflag
= args_has(args
, 'd');
91 sflag
= args_has(args
, 's');
93 before
= args_has(args
, 'b');
94 if (args_has(args
, 'a') || before
) {
95 if (target
.wl
!= NULL
)
96 idx
= winlink_shuffle_up(dst
, target
.wl
, before
);
98 idx
= winlink_shuffle_up(dst
, dst
->curw
, before
);
100 return (CMD_RETURN_ERROR
);
103 if (server_link_window(src
, wl
, dst
, idx
, kflag
, !dflag
, &cause
) != 0) {
104 cmdq_error(item
, "%s", cause
);
106 return (CMD_RETURN_ERROR
);
108 if (cmd_get_entry(self
) == &cmd_move_window_entry
)
109 server_unlink_window(src
, wl
);
112 * Renumber the winlinks in the src session only, the destination
113 * session already has the correct winlink id to us, either
114 * automatically or specified by -s.
116 if (!sflag
&& options_get_number(src
->options
, "renumber-windows"))
117 session_renumber_windows(src
);
121 return (CMD_RETURN_NORMAL
);