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 * Switch window to selected layout.
25eda6f593SDavid van Moolenbroek */
26eda6f593SDavid van Moolenbroek
27eda6f593SDavid van Moolenbroek void cmd_select_layout_key_binding(struct cmd *, int);
28*0a6a1f1dSLionel Sambuc enum cmd_retval cmd_select_layout_exec(struct cmd *, struct cmd_q *);
29eda6f593SDavid van Moolenbroek
30eda6f593SDavid van Moolenbroek const struct cmd_entry cmd_select_layout_entry = {
31eda6f593SDavid van Moolenbroek "select-layout", "selectl",
32eda6f593SDavid van Moolenbroek "npt:", 0, 1,
33eda6f593SDavid van Moolenbroek "[-np] " CMD_TARGET_WINDOW_USAGE " [layout-name]",
34eda6f593SDavid van Moolenbroek 0,
35eda6f593SDavid van Moolenbroek cmd_select_layout_key_binding,
36eda6f593SDavid van Moolenbroek cmd_select_layout_exec
37eda6f593SDavid van Moolenbroek };
38eda6f593SDavid van Moolenbroek
39eda6f593SDavid van Moolenbroek const struct cmd_entry cmd_next_layout_entry = {
40eda6f593SDavid van Moolenbroek "next-layout", "nextl",
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_layout_exec
46eda6f593SDavid van Moolenbroek };
47eda6f593SDavid van Moolenbroek
48eda6f593SDavid van Moolenbroek const struct cmd_entry cmd_previous_layout_entry = {
49eda6f593SDavid van Moolenbroek "previous-layout", "prevl",
50eda6f593SDavid van Moolenbroek "t:", 0, 0,
51eda6f593SDavid van Moolenbroek CMD_TARGET_WINDOW_USAGE,
52eda6f593SDavid van Moolenbroek 0,
53eda6f593SDavid van Moolenbroek NULL,
54eda6f593SDavid van Moolenbroek cmd_select_layout_exec
55eda6f593SDavid van Moolenbroek };
56eda6f593SDavid van Moolenbroek
57eda6f593SDavid van Moolenbroek void
cmd_select_layout_key_binding(struct cmd * self,int key)58eda6f593SDavid van Moolenbroek cmd_select_layout_key_binding(struct cmd *self, int key)
59eda6f593SDavid van Moolenbroek {
60eda6f593SDavid van Moolenbroek switch (key) {
61eda6f593SDavid van Moolenbroek case '1' | KEYC_ESCAPE:
62eda6f593SDavid van Moolenbroek self->args = args_create(1, "even-horizontal");
63eda6f593SDavid van Moolenbroek break;
64eda6f593SDavid van Moolenbroek case '2' | KEYC_ESCAPE:
65eda6f593SDavid van Moolenbroek self->args = args_create(1, "even-vertical");
66eda6f593SDavid van Moolenbroek break;
67eda6f593SDavid van Moolenbroek case '3' | KEYC_ESCAPE:
68eda6f593SDavid van Moolenbroek self->args = args_create(1, "main-horizontal");
69eda6f593SDavid van Moolenbroek break;
70eda6f593SDavid van Moolenbroek case '4' | KEYC_ESCAPE:
71eda6f593SDavid van Moolenbroek self->args = args_create(1, "main-vertical");
72eda6f593SDavid van Moolenbroek break;
73eda6f593SDavid van Moolenbroek case '5' | KEYC_ESCAPE:
74eda6f593SDavid van Moolenbroek self->args = args_create(1, "tiled");
75eda6f593SDavid van Moolenbroek break;
76eda6f593SDavid van Moolenbroek default:
77eda6f593SDavid van Moolenbroek self->args = args_create(0);
78eda6f593SDavid van Moolenbroek break;
79eda6f593SDavid van Moolenbroek }
80eda6f593SDavid van Moolenbroek }
81eda6f593SDavid van Moolenbroek
82*0a6a1f1dSLionel Sambuc enum cmd_retval
cmd_select_layout_exec(struct cmd * self,struct cmd_q * cmdq)83*0a6a1f1dSLionel Sambuc cmd_select_layout_exec(struct cmd *self, struct cmd_q *cmdq)
84eda6f593SDavid van Moolenbroek {
85eda6f593SDavid van Moolenbroek struct args *args = self->args;
86eda6f593SDavid van Moolenbroek struct winlink *wl;
87eda6f593SDavid van Moolenbroek const char *layoutname;
88eda6f593SDavid van Moolenbroek int next, previous, layout;
89eda6f593SDavid van Moolenbroek
90*0a6a1f1dSLionel Sambuc if ((wl = cmd_find_window(cmdq, args_get(args, 't'), NULL)) == NULL)
91*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
92*0a6a1f1dSLionel Sambuc server_unzoom_window(wl->window);
93eda6f593SDavid van Moolenbroek
94eda6f593SDavid van Moolenbroek next = self->entry == &cmd_next_layout_entry;
95eda6f593SDavid van Moolenbroek if (args_has(self->args, 'n'))
96eda6f593SDavid van Moolenbroek next = 1;
97eda6f593SDavid van Moolenbroek previous = self->entry == &cmd_previous_layout_entry;
98eda6f593SDavid van Moolenbroek if (args_has(self->args, 'p'))
99eda6f593SDavid van Moolenbroek previous = 1;
100eda6f593SDavid van Moolenbroek
101eda6f593SDavid van Moolenbroek if (next || previous) {
102eda6f593SDavid van Moolenbroek if (next)
103eda6f593SDavid van Moolenbroek layout = layout_set_next(wl->window);
104eda6f593SDavid van Moolenbroek else
105eda6f593SDavid van Moolenbroek layout = layout_set_previous(wl->window);
106*0a6a1f1dSLionel Sambuc server_redraw_window(wl->window);
107*0a6a1f1dSLionel Sambuc cmdq_info(cmdq, "arranging in: %s", layout_set_name(layout));
108*0a6a1f1dSLionel Sambuc return (CMD_RETURN_NORMAL);
109eda6f593SDavid van Moolenbroek }
110eda6f593SDavid van Moolenbroek
111eda6f593SDavid van Moolenbroek if (args->argc == 0)
112eda6f593SDavid van Moolenbroek layout = wl->window->lastlayout;
113eda6f593SDavid van Moolenbroek else
114eda6f593SDavid van Moolenbroek layout = layout_set_lookup(args->argv[0]);
115eda6f593SDavid van Moolenbroek if (layout != -1) {
116eda6f593SDavid van Moolenbroek layout = layout_set_select(wl->window, layout);
117*0a6a1f1dSLionel Sambuc server_redraw_window(wl->window);
118*0a6a1f1dSLionel Sambuc cmdq_info(cmdq, "arranging in: %s", layout_set_name(layout));
119*0a6a1f1dSLionel Sambuc return (CMD_RETURN_NORMAL);
120eda6f593SDavid van Moolenbroek }
121eda6f593SDavid van Moolenbroek
122eda6f593SDavid van Moolenbroek if (args->argc != 0) {
123eda6f593SDavid van Moolenbroek layoutname = args->argv[0];
124eda6f593SDavid van Moolenbroek if (layout_parse(wl->window, layoutname) == -1) {
125*0a6a1f1dSLionel Sambuc cmdq_error(cmdq, "can't set layout: %s", layoutname);
126*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
127eda6f593SDavid van Moolenbroek }
128*0a6a1f1dSLionel Sambuc server_redraw_window(wl->window);
129*0a6a1f1dSLionel Sambuc cmdq_info(cmdq, "arranging in: %s", layoutname);
130eda6f593SDavid van Moolenbroek }
131*0a6a1f1dSLionel Sambuc return (CMD_RETURN_NORMAL);
132eda6f593SDavid van Moolenbroek }
133