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 int cmd_select_window_exec(struct cmd
*, struct cmd_ctx
*);
32 const struct cmd_entry cmd_select_window_entry
= {
33 "select-window", "selectw",
35 "[-lnp] " 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_ctx
*ctx
)
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(ctx
, args_get(args
, 't'), 0);
109 activity
= args_has(self
->args
, 'a');
111 if (session_next(s
, activity
) != 0) {
112 ctx
->error(ctx
, "no next window");
115 } else if (previous
) {
116 if (session_previous(s
, activity
) != 0) {
117 ctx
->error(ctx
, "no previous window");
121 if (session_last(s
) != 0) {
122 ctx
->error(ctx
, "no last window");
127 server_redraw_session(s
);
129 wl
= cmd_find_window(ctx
, args_get(args
, 't'), &s
);
133 if (session_select(s
, wl
->idx
) == 0)
134 server_redraw_session(s
);