4 * Copyright (c) 2007 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>
27 * Switch client to a different session.
30 static enum cmd_retval
cmd_switch_client_exec(struct cmd
*,
33 const struct cmd_entry cmd_switch_client_entry
= {
34 .name
= "switch-client",
37 .args
= { "lc:EFnpt:rT:Z", 0, 0, NULL
},
38 .usage
= "[-ElnprZ] [-c target-client] [-t target-session] "
43 .flags
= CMD_READONLY
|CMD_CLIENT_CFLAG
,
44 .exec
= cmd_switch_client_exec
47 static enum cmd_retval
48 cmd_switch_client_exec(struct cmd
*self
, struct cmdq_item
*item
)
50 struct args
*args
= cmd_get_args(self
);
51 struct cmd_find_state
*current
= cmdq_get_current(item
);
52 struct cmd_find_state target
;
53 const char *tflag
= args_get(args
, 't');
54 enum cmd_find_type type
;
56 struct client
*tc
= cmdq_get_target_client(item
);
60 struct window_pane
*wp
;
61 const char *tablename
;
62 struct key_table
*table
;
64 if (tflag
!= NULL
&& tflag
[strcspn(tflag
, ":.%")] != '\0') {
68 type
= CMD_FIND_SESSION
;
69 flags
= CMD_FIND_PREFER_UNATTACHED
;
71 if (cmd_find_target(&target
, item
, tflag
, type
, flags
) != 0)
72 return (CMD_RETURN_ERROR
);
77 if (args_has(args
, 'r')) {
78 if (tc
->flags
& CLIENT_READONLY
)
79 tc
->flags
&= ~(CLIENT_READONLY
|CLIENT_IGNORESIZE
);
81 tc
->flags
|= (CLIENT_READONLY
|CLIENT_IGNORESIZE
);
84 tablename
= args_get(args
, 'T');
85 if (tablename
!= NULL
) {
86 table
= key_bindings_get_table(tablename
, 0);
88 cmdq_error(item
, "table %s doesn't exist", tablename
);
89 return (CMD_RETURN_ERROR
);
92 key_bindings_unref_table(tc
->keytable
);
94 return (CMD_RETURN_NORMAL
);
97 if (args_has(args
, 'n')) {
98 if ((s
= session_next_session(tc
->session
)) == NULL
) {
99 cmdq_error(item
, "can't find next session");
100 return (CMD_RETURN_ERROR
);
102 } else if (args_has(args
, 'p')) {
103 if ((s
= session_previous_session(tc
->session
)) == NULL
) {
104 cmdq_error(item
, "can't find previous session");
105 return (CMD_RETURN_ERROR
);
107 } else if (args_has(args
, 'l')) {
108 if (tc
->last_session
!= NULL
&& session_alive(tc
->last_session
))
109 s
= tc
->last_session
;
113 cmdq_error(item
, "can't find last session");
114 return (CMD_RETURN_ERROR
);
117 if (cmdq_get_client(item
) == NULL
)
118 return (CMD_RETURN_NORMAL
);
119 if (wl
!= NULL
&& wp
!= NULL
&& wp
!= wl
->window
->active
) {
121 if (window_push_zoom(w
, 0, args_has(args
, 'Z')))
122 server_redraw_window(w
);
123 window_redraw_active_switch(w
, wp
);
124 window_set_active_pane(w
, wp
, 1);
125 if (window_pop_zoom(w
))
126 server_redraw_window(w
);
129 session_set_current(s
, wl
);
130 cmd_find_from_session(current
, s
, 0);
134 if (!args_has(args
, 'E'))
135 environ_update(s
->options
, tc
->environ
, s
->environ
);
137 server_client_set_session(tc
, s
);
138 if (~cmdq_get_flags(item
) & CMDQ_STATE_REPEAT
)
139 server_client_set_key_table(tc
, NULL
);
141 return (CMD_RETURN_NORMAL
);