4 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
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>
26 * Select window by index.
29 void cmd_select_window_key_binding(struct cmd
*, int);
30 enum cmd_retval
cmd_select_window_exec(struct cmd
*, struct cmd_q
*);
32 const struct cmd_entry cmd_select_window_entry
= {
33 "select-window", "selectw",
35 "[-lnpT] " CMD_TARGET_WINDOW_USAGE
,
37 cmd_select_window_key_binding
,
39 cmd_select_window_exec
42 const struct cmd_entry cmd_next_window_entry
= {
43 "next-window", "next",
45 "[-a] " CMD_TARGET_SESSION_USAGE
,
47 cmd_select_window_key_binding
,
49 cmd_select_window_exec
52 const struct cmd_entry cmd_previous_window_entry
= {
53 "previous-window", "prev",
55 "[-a] " CMD_TARGET_SESSION_USAGE
,
57 cmd_select_window_key_binding
,
59 cmd_select_window_exec
62 const struct cmd_entry cmd_last_window_entry
= {
63 "last-window", "last",
65 CMD_TARGET_SESSION_USAGE
,
69 cmd_select_window_exec
73 cmd_select_window_key_binding(struct cmd
*self
, int key
)
77 self
->args
= args_create(0);
78 if (key
>= '0' && key
<= '9') {
79 xsnprintf(tmp
, sizeof tmp
, ":%d", key
- '0');
80 args_set(self
->args
, 't', tmp
);
82 if (key
== ('n' | KEYC_ESCAPE
) || key
== ('p' | KEYC_ESCAPE
))
83 args_set(self
->args
, 'a', NULL
);
87 cmd_select_window_exec(struct cmd
*self
, struct cmd_q
*cmdq
)
89 struct args
*args
= self
->args
;
92 int next
, previous
, last
, activity
;
94 next
= self
->entry
== &cmd_next_window_entry
;
95 if (args_has(self
->args
, 'n'))
97 previous
= self
->entry
== &cmd_previous_window_entry
;
98 if (args_has(self
->args
, 'p'))
100 last
= self
->entry
== &cmd_last_window_entry
;
101 if (args_has(self
->args
, 'l'))
104 if (next
|| previous
|| last
) {
105 s
= cmd_find_session(cmdq
, args_get(args
, 't'), 0);
107 return (CMD_RETURN_ERROR
);
109 activity
= args_has(self
->args
, 'a');
111 if (session_next(s
, activity
) != 0) {
112 cmdq_error(cmdq
, "no next window");
113 return (CMD_RETURN_ERROR
);
115 } else if (previous
) {
116 if (session_previous(s
, activity
) != 0) {
117 cmdq_error(cmdq
, "no previous window");
118 return (CMD_RETURN_ERROR
);
121 if (session_last(s
) != 0) {
122 cmdq_error(cmdq
, "no last window");
123 return (CMD_RETURN_ERROR
);
127 server_redraw_session(s
);
129 wl
= cmd_find_window(cmdq
, args_get(args
, 't'), &s
);
131 return (CMD_RETURN_ERROR
);
134 * If -T and select-window is invoked on same window as
135 * current, switch to previous window.
137 if (args_has(self
->args
, 'T') && wl
== s
->curw
) {
138 if (session_last(s
) != 0) {
139 cmdq_error(cmdq
, "no last window");
142 server_redraw_session(s
);
143 } else if (session_select(s
, wl
->idx
) == 0)
144 server_redraw_session(s
);
148 return (CMD_RETURN_NORMAL
);