xref: /minix3/external/bsd/tmux/dist/cmd-resize-pane.c (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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