1*0a6a1f1dSLionel Sambuc /* Id */
2eda6f593SDavid van Moolenbroek
3eda6f593SDavid van Moolenbroek /*
4eda6f593SDavid van Moolenbroek * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
5eda6f593SDavid van Moolenbroek *
6eda6f593SDavid van Moolenbroek * Permission to use, copy, modify, and distribute this software for any
7eda6f593SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
8eda6f593SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
9eda6f593SDavid van Moolenbroek *
10eda6f593SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11eda6f593SDavid van Moolenbroek * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12eda6f593SDavid van Moolenbroek * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13eda6f593SDavid van Moolenbroek * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14eda6f593SDavid van Moolenbroek * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15eda6f593SDavid van Moolenbroek * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16eda6f593SDavid van Moolenbroek * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17eda6f593SDavid van Moolenbroek */
18eda6f593SDavid van Moolenbroek
19eda6f593SDavid van Moolenbroek #include <sys/types.h>
20eda6f593SDavid van Moolenbroek
21eda6f593SDavid van Moolenbroek #include "tmux.h"
22eda6f593SDavid van Moolenbroek
23eda6f593SDavid van Moolenbroek /*
24eda6f593SDavid van Moolenbroek * Select pane.
25eda6f593SDavid van Moolenbroek */
26eda6f593SDavid van Moolenbroek
27eda6f593SDavid van Moolenbroek void cmd_select_pane_key_binding(struct cmd *, int);
28*0a6a1f1dSLionel Sambuc enum cmd_retval cmd_select_pane_exec(struct cmd *, struct cmd_q *);
29eda6f593SDavid van Moolenbroek
30eda6f593SDavid van Moolenbroek const struct cmd_entry cmd_select_pane_entry = {
31eda6f593SDavid van Moolenbroek "select-pane", "selectp",
32eda6f593SDavid van Moolenbroek "lDLRt:U", 0, 0,
33eda6f593SDavid van Moolenbroek "[-lDLRU] " CMD_TARGET_PANE_USAGE,
34eda6f593SDavid van Moolenbroek 0,
35eda6f593SDavid van Moolenbroek cmd_select_pane_key_binding,
36eda6f593SDavid van Moolenbroek cmd_select_pane_exec
37eda6f593SDavid van Moolenbroek };
38eda6f593SDavid van Moolenbroek
39eda6f593SDavid van Moolenbroek const struct cmd_entry cmd_last_pane_entry = {
40eda6f593SDavid van Moolenbroek "last-pane", "lastp",
41eda6f593SDavid van Moolenbroek "t:", 0, 0,
42eda6f593SDavid van Moolenbroek CMD_TARGET_WINDOW_USAGE,
43eda6f593SDavid van Moolenbroek 0,
44eda6f593SDavid van Moolenbroek NULL,
45eda6f593SDavid van Moolenbroek cmd_select_pane_exec
46eda6f593SDavid van Moolenbroek };
47eda6f593SDavid van Moolenbroek
48eda6f593SDavid van Moolenbroek void
cmd_select_pane_key_binding(struct cmd * self,int key)49eda6f593SDavid van Moolenbroek cmd_select_pane_key_binding(struct cmd *self, int key)
50eda6f593SDavid van Moolenbroek {
51eda6f593SDavid van Moolenbroek self->args = args_create(0);
52eda6f593SDavid van Moolenbroek if (key == KEYC_UP)
53eda6f593SDavid van Moolenbroek args_set(self->args, 'U', NULL);
54eda6f593SDavid van Moolenbroek if (key == KEYC_DOWN)
55eda6f593SDavid van Moolenbroek args_set(self->args, 'D', NULL);
56eda6f593SDavid van Moolenbroek if (key == KEYC_LEFT)
57eda6f593SDavid van Moolenbroek args_set(self->args, 'L', NULL);
58eda6f593SDavid van Moolenbroek if (key == KEYC_RIGHT)
59eda6f593SDavid van Moolenbroek args_set(self->args, 'R', NULL);
60eda6f593SDavid van Moolenbroek if (key == 'o')
61eda6f593SDavid van Moolenbroek args_set(self->args, 't', ":.+");
62eda6f593SDavid van Moolenbroek }
63eda6f593SDavid van Moolenbroek
64*0a6a1f1dSLionel Sambuc enum cmd_retval
cmd_select_pane_exec(struct cmd * self,struct cmd_q * cmdq)65*0a6a1f1dSLionel Sambuc cmd_select_pane_exec(struct cmd *self, struct cmd_q *cmdq)
66eda6f593SDavid van Moolenbroek {
67eda6f593SDavid van Moolenbroek struct args *args = self->args;
68eda6f593SDavid van Moolenbroek struct winlink *wl;
69eda6f593SDavid van Moolenbroek struct window_pane *wp;
70eda6f593SDavid van Moolenbroek
71eda6f593SDavid van Moolenbroek if (self->entry == &cmd_last_pane_entry || args_has(args, 'l')) {
72*0a6a1f1dSLionel Sambuc wl = cmd_find_window(cmdq, args_get(args, 't'), NULL);
73eda6f593SDavid van Moolenbroek if (wl == NULL)
74*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
75eda6f593SDavid van Moolenbroek
76eda6f593SDavid van Moolenbroek if (wl->window->last == NULL) {
77*0a6a1f1dSLionel Sambuc cmdq_error(cmdq, "no last pane");
78*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
79eda6f593SDavid van Moolenbroek }
80eda6f593SDavid van Moolenbroek
81*0a6a1f1dSLionel Sambuc server_unzoom_window(wl->window);
82eda6f593SDavid van Moolenbroek window_set_active_pane(wl->window, wl->window->last);
83eda6f593SDavid van Moolenbroek server_status_window(wl->window);
84eda6f593SDavid van Moolenbroek server_redraw_window_borders(wl->window);
85eda6f593SDavid van Moolenbroek
86*0a6a1f1dSLionel Sambuc return (CMD_RETURN_NORMAL);
87eda6f593SDavid van Moolenbroek }
88eda6f593SDavid van Moolenbroek
89*0a6a1f1dSLionel Sambuc if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
90*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
91eda6f593SDavid van Moolenbroek
92*0a6a1f1dSLionel Sambuc server_unzoom_window(wp->window);
93eda6f593SDavid van Moolenbroek if (!window_pane_visible(wp)) {
94*0a6a1f1dSLionel Sambuc cmdq_error(cmdq, "pane not visible");
95*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
96eda6f593SDavid van Moolenbroek }
97eda6f593SDavid van Moolenbroek
98eda6f593SDavid van Moolenbroek if (args_has(self->args, 'L'))
99eda6f593SDavid van Moolenbroek wp = window_pane_find_left(wp);
100eda6f593SDavid van Moolenbroek else if (args_has(self->args, 'R'))
101eda6f593SDavid van Moolenbroek wp = window_pane_find_right(wp);
102eda6f593SDavid van Moolenbroek else if (args_has(self->args, 'U'))
103eda6f593SDavid van Moolenbroek wp = window_pane_find_up(wp);
104eda6f593SDavid van Moolenbroek else if (args_has(self->args, 'D'))
105eda6f593SDavid van Moolenbroek wp = window_pane_find_down(wp);
106eda6f593SDavid van Moolenbroek if (wp == NULL) {
107*0a6a1f1dSLionel Sambuc cmdq_error(cmdq, "pane not found");
108*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
109eda6f593SDavid van Moolenbroek }
110eda6f593SDavid van Moolenbroek
111eda6f593SDavid van Moolenbroek window_set_active_pane(wl->window, wp);
112eda6f593SDavid van Moolenbroek server_status_window(wl->window);
113eda6f593SDavid van Moolenbroek server_redraw_window_borders(wl->window);
114eda6f593SDavid van Moolenbroek
115*0a6a1f1dSLionel Sambuc return (CMD_RETURN_NORMAL);
116eda6f593SDavid van Moolenbroek }
117