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 <stdlib.h>
22eda6f593SDavid van Moolenbroek
23eda6f593SDavid van Moolenbroek #include "tmux.h"
24eda6f593SDavid van Moolenbroek
25eda6f593SDavid van Moolenbroek /*
26eda6f593SDavid van Moolenbroek * Increase or decrease pane size.
27eda6f593SDavid van Moolenbroek */
28eda6f593SDavid van Moolenbroek
29eda6f593SDavid van Moolenbroek void cmd_resize_pane_key_binding(struct cmd *, int);
30*0a6a1f1dSLionel Sambuc enum cmd_retval cmd_resize_pane_exec(struct cmd *, struct cmd_q *);
31eda6f593SDavid van Moolenbroek
32eda6f593SDavid van Moolenbroek const struct cmd_entry cmd_resize_pane_entry = {
33eda6f593SDavid van Moolenbroek "resize-pane", "resizep",
34*0a6a1f1dSLionel Sambuc "DLRt:Ux:y:Z", 0, 1,
35*0a6a1f1dSLionel Sambuc "[-DLRUZ] [-x width] [-y height] " CMD_TARGET_PANE_USAGE " [adjustment]",
36eda6f593SDavid van Moolenbroek 0,
37eda6f593SDavid van Moolenbroek cmd_resize_pane_key_binding,
38eda6f593SDavid van Moolenbroek cmd_resize_pane_exec
39eda6f593SDavid van Moolenbroek };
40eda6f593SDavid van Moolenbroek
41eda6f593SDavid van Moolenbroek void
cmd_resize_pane_key_binding(struct cmd * self,int key)42eda6f593SDavid van Moolenbroek cmd_resize_pane_key_binding(struct cmd *self, int key)
43eda6f593SDavid van Moolenbroek {
44eda6f593SDavid van Moolenbroek switch (key) {
45eda6f593SDavid van Moolenbroek case KEYC_UP | KEYC_CTRL:
46eda6f593SDavid van Moolenbroek self->args = args_create(0);
47eda6f593SDavid van Moolenbroek args_set(self->args, 'U', NULL);
48eda6f593SDavid van Moolenbroek break;
49eda6f593SDavid van Moolenbroek case KEYC_DOWN | KEYC_CTRL:
50eda6f593SDavid van Moolenbroek self->args = args_create(0);
51eda6f593SDavid van Moolenbroek args_set(self->args, 'D', NULL);
52eda6f593SDavid van Moolenbroek break;
53eda6f593SDavid van Moolenbroek case KEYC_LEFT | KEYC_CTRL:
54eda6f593SDavid van Moolenbroek self->args = args_create(0);
55eda6f593SDavid van Moolenbroek args_set(self->args, 'L', NULL);
56eda6f593SDavid van Moolenbroek break;
57eda6f593SDavid van Moolenbroek case KEYC_RIGHT | KEYC_CTRL:
58eda6f593SDavid van Moolenbroek self->args = args_create(0);
59eda6f593SDavid van Moolenbroek args_set(self->args, 'R', NULL);
60eda6f593SDavid van Moolenbroek break;
61eda6f593SDavid van Moolenbroek case KEYC_UP | KEYC_ESCAPE:
62eda6f593SDavid van Moolenbroek self->args = args_create(1, "5");
63eda6f593SDavid van Moolenbroek args_set(self->args, 'U', NULL);
64eda6f593SDavid van Moolenbroek break;
65eda6f593SDavid van Moolenbroek case KEYC_DOWN | KEYC_ESCAPE:
66eda6f593SDavid van Moolenbroek self->args = args_create(1, "5");
67eda6f593SDavid van Moolenbroek args_set(self->args, 'D', NULL);
68eda6f593SDavid van Moolenbroek break;
69eda6f593SDavid van Moolenbroek case KEYC_LEFT | KEYC_ESCAPE:
70eda6f593SDavid van Moolenbroek self->args = args_create(1, "5");
71eda6f593SDavid van Moolenbroek args_set(self->args, 'L', NULL);
72eda6f593SDavid van Moolenbroek break;
73eda6f593SDavid van Moolenbroek case KEYC_RIGHT | KEYC_ESCAPE:
74eda6f593SDavid van Moolenbroek self->args = args_create(1, "5");
75eda6f593SDavid van Moolenbroek args_set(self->args, 'R', NULL);
76eda6f593SDavid van Moolenbroek break;
77*0a6a1f1dSLionel Sambuc case 'z':
78*0a6a1f1dSLionel Sambuc self->args = args_create(0);
79*0a6a1f1dSLionel Sambuc args_set(self->args, 'Z', NULL);
80*0a6a1f1dSLionel Sambuc break;
81eda6f593SDavid van Moolenbroek default:
82eda6f593SDavid van Moolenbroek self->args = args_create(0);
83eda6f593SDavid van Moolenbroek break;
84eda6f593SDavid van Moolenbroek }
85eda6f593SDavid van Moolenbroek }
86eda6f593SDavid van Moolenbroek
87*0a6a1f1dSLionel Sambuc enum cmd_retval
cmd_resize_pane_exec(struct cmd * self,struct cmd_q * cmdq)88*0a6a1f1dSLionel Sambuc cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq)
89eda6f593SDavid van Moolenbroek {
90eda6f593SDavid van Moolenbroek struct args *args = self->args;
91eda6f593SDavid van Moolenbroek struct winlink *wl;
92*0a6a1f1dSLionel Sambuc struct window *w;
93eda6f593SDavid van Moolenbroek const char *errstr;
94*0a6a1f1dSLionel Sambuc char *cause;
95eda6f593SDavid van Moolenbroek struct window_pane *wp;
96eda6f593SDavid van Moolenbroek u_int adjust;
97*0a6a1f1dSLionel Sambuc int x, y;
98eda6f593SDavid van Moolenbroek
99*0a6a1f1dSLionel Sambuc if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
100*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
101*0a6a1f1dSLionel Sambuc w = wl->window;
102*0a6a1f1dSLionel Sambuc
103*0a6a1f1dSLionel Sambuc if (args_has(args, 'Z')) {
104*0a6a1f1dSLionel Sambuc if (w->flags & WINDOW_ZOOMED)
105*0a6a1f1dSLionel Sambuc window_unzoom(w);
106*0a6a1f1dSLionel Sambuc else
107*0a6a1f1dSLionel Sambuc window_zoom(wp);
108*0a6a1f1dSLionel Sambuc server_redraw_window(w);
109*0a6a1f1dSLionel Sambuc server_status_window(w);
110*0a6a1f1dSLionel Sambuc return (CMD_RETURN_NORMAL);
111*0a6a1f1dSLionel Sambuc }
112*0a6a1f1dSLionel Sambuc server_unzoom_window(w);
113eda6f593SDavid van Moolenbroek
114eda6f593SDavid van Moolenbroek if (args->argc == 0)
115eda6f593SDavid van Moolenbroek adjust = 1;
116eda6f593SDavid van Moolenbroek else {
117eda6f593SDavid van Moolenbroek adjust = strtonum(args->argv[0], 1, INT_MAX, &errstr);
118eda6f593SDavid van Moolenbroek if (errstr != NULL) {
119*0a6a1f1dSLionel Sambuc cmdq_error(cmdq, "adjustment %s", errstr);
120*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
121eda6f593SDavid van Moolenbroek }
122eda6f593SDavid van Moolenbroek }
123eda6f593SDavid van Moolenbroek
124*0a6a1f1dSLionel Sambuc if (args_has(self->args, 'x')) {
125*0a6a1f1dSLionel Sambuc x = args_strtonum(self->args, 'x', PANE_MINIMUM, INT_MAX,
126*0a6a1f1dSLionel Sambuc &cause);
127*0a6a1f1dSLionel Sambuc if (cause != NULL) {
128*0a6a1f1dSLionel Sambuc cmdq_error(cmdq, "width %s", cause);
129*0a6a1f1dSLionel Sambuc free(cause);
130*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
131*0a6a1f1dSLionel Sambuc }
132*0a6a1f1dSLionel Sambuc layout_resize_pane_to(wp, LAYOUT_LEFTRIGHT, x);
133*0a6a1f1dSLionel Sambuc }
134*0a6a1f1dSLionel Sambuc if (args_has(self->args, 'y')) {
135*0a6a1f1dSLionel Sambuc y = args_strtonum(self->args, 'y', PANE_MINIMUM, INT_MAX,
136*0a6a1f1dSLionel Sambuc &cause);
137*0a6a1f1dSLionel Sambuc if (cause != NULL) {
138*0a6a1f1dSLionel Sambuc cmdq_error(cmdq, "height %s", cause);
139*0a6a1f1dSLionel Sambuc free(cause);
140*0a6a1f1dSLionel Sambuc return (CMD_RETURN_ERROR);
141*0a6a1f1dSLionel Sambuc }
142*0a6a1f1dSLionel Sambuc layout_resize_pane_to(wp, LAYOUT_TOPBOTTOM, y);
143*0a6a1f1dSLionel Sambuc }
144*0a6a1f1dSLionel Sambuc
145eda6f593SDavid van Moolenbroek if (args_has(self->args, 'L'))
146eda6f593SDavid van Moolenbroek layout_resize_pane(wp, LAYOUT_LEFTRIGHT, -adjust);
147eda6f593SDavid van Moolenbroek else if (args_has(self->args, 'R'))
148eda6f593SDavid van Moolenbroek layout_resize_pane(wp, LAYOUT_LEFTRIGHT, adjust);
149eda6f593SDavid van Moolenbroek else if (args_has(self->args, 'U'))
150eda6f593SDavid van Moolenbroek layout_resize_pane(wp, LAYOUT_TOPBOTTOM, -adjust);
151eda6f593SDavid van Moolenbroek else if (args_has(self->args, 'D'))
152eda6f593SDavid van Moolenbroek layout_resize_pane(wp, LAYOUT_TOPBOTTOM, adjust);
153eda6f593SDavid van Moolenbroek server_redraw_window(wl->window);
154eda6f593SDavid van Moolenbroek
155*0a6a1f1dSLionel Sambuc return (CMD_RETURN_NORMAL);
156eda6f593SDavid van Moolenbroek }
157