xref: /netbsd-src/external/bsd/tmux/dist/cmd-resize-window.c (revision f844e94ef29eebc7999c12636b87f541bb86868b)
1ef36e747Schristos /* $OpenBSD$ */
2ef36e747Schristos 
3ef36e747Schristos /*
4ef36e747Schristos  * Copyright (c) 2018 Nicholas Marriott <nicholas.marriott@gmail.com>
5ef36e747Schristos  *
6ef36e747Schristos  * Permission to use, copy, modify, and distribute this software for any
7ef36e747Schristos  * purpose with or without fee is hereby granted, provided that the above
8ef36e747Schristos  * copyright notice and this permission notice appear in all copies.
9ef36e747Schristos  *
10ef36e747Schristos  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11ef36e747Schristos  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12ef36e747Schristos  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13ef36e747Schristos  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14ef36e747Schristos  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15ef36e747Schristos  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16ef36e747Schristos  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17ef36e747Schristos  */
18ef36e747Schristos 
19ef36e747Schristos #include <sys/types.h>
20ef36e747Schristos 
21ef36e747Schristos #include <stdlib.h>
22ef36e747Schristos 
23ef36e747Schristos #include "tmux.h"
24ef36e747Schristos 
25ef36e747Schristos /*
26ef36e747Schristos  * Increase or decrease window size.
27ef36e747Schristos  */
28ef36e747Schristos 
29ef36e747Schristos static enum cmd_retval	cmd_resize_window_exec(struct cmd *,
30ef36e747Schristos 			    struct cmdq_item *);
31ef36e747Schristos 
32ef36e747Schristos const struct cmd_entry cmd_resize_window_entry = {
33ef36e747Schristos 	.name = "resize-window",
34ef36e747Schristos 	.alias = "resizew",
35ef36e747Schristos 
3646548964Swiz 	.args = { "aADLRt:Ux:y:", 0, 1, NULL },
37ef36e747Schristos 	.usage = "[-aADLRU] [-x width] [-y height] " CMD_TARGET_WINDOW_USAGE " "
38ef36e747Schristos 		 "[adjustment]",
39ef36e747Schristos 
40ef36e747Schristos 	.target = { 't', CMD_FIND_WINDOW, 0 },
41ef36e747Schristos 
42ef36e747Schristos 	.flags = CMD_AFTERHOOK,
43ef36e747Schristos 	.exec = cmd_resize_window_exec
44ef36e747Schristos };
45ef36e747Schristos 
46ef36e747Schristos static enum cmd_retval
cmd_resize_window_exec(struct cmd * self,struct cmdq_item * item)47ef36e747Schristos cmd_resize_window_exec(struct cmd *self, struct cmdq_item *item)
48ef36e747Schristos {
49e271dbb8Schristos 	struct args		*args = cmd_get_args(self);
50e271dbb8Schristos 	struct cmd_find_state	*target = cmdq_get_target(item);
51e271dbb8Schristos 	struct winlink		*wl = target->wl;
52ef36e747Schristos 	struct window		*w = wl->window;
53e271dbb8Schristos 	struct session		*s = target->s;
54ef36e747Schristos 	const char	       	*errstr;
55ef36e747Schristos 	char			*cause;
56*f844e94eSwiz 	u_int			 adjust, sx, sy, xpixel = 0, ypixel = 0;
57ef36e747Schristos 
5846548964Swiz 	if (args_count(args) == 0)
59ef36e747Schristos 		adjust = 1;
60ef36e747Schristos 	else {
6146548964Swiz 		adjust = strtonum(args_string(args, 0), 1, INT_MAX, &errstr);
62ef36e747Schristos 		if (errstr != NULL) {
63ef36e747Schristos 			cmdq_error(item, "adjustment %s", errstr);
64ef36e747Schristos 			return (CMD_RETURN_ERROR);
65ef36e747Schristos 		}
66ef36e747Schristos 	}
67ef36e747Schristos 
68ef36e747Schristos 	sx = w->sx;
69ef36e747Schristos 	sy = w->sy;
70ef36e747Schristos 
71ef36e747Schristos 	if (args_has(args, 'x')) {
72ef36e747Schristos 		sx = args_strtonum(args, 'x', WINDOW_MINIMUM, WINDOW_MAXIMUM,
73ef36e747Schristos 		    &cause);
74ef36e747Schristos 		if (cause != NULL) {
75ef36e747Schristos 			cmdq_error(item, "width %s", cause);
76ef36e747Schristos 			free(cause);
77ef36e747Schristos 			return (CMD_RETURN_ERROR);
78ef36e747Schristos 		}
79ef36e747Schristos 	}
80ef36e747Schristos 	if (args_has(args, 'y')) {
81ef36e747Schristos 		sy = args_strtonum(args, 'y', WINDOW_MINIMUM, WINDOW_MAXIMUM,
82ef36e747Schristos 		    &cause);
83ef36e747Schristos 		if (cause != NULL) {
84ef36e747Schristos 			cmdq_error(item, "height %s", cause);
85ef36e747Schristos 			free(cause);
86ef36e747Schristos 			return (CMD_RETURN_ERROR);
87ef36e747Schristos 		}
88ef36e747Schristos 	}
89ef36e747Schristos 
90ef36e747Schristos 	if (args_has(args, 'L')) {
91ef36e747Schristos 		if (sx >= adjust)
92ef36e747Schristos 			sx -= adjust;
93ef36e747Schristos 	} else if (args_has(args, 'R'))
94ef36e747Schristos 		sx += adjust;
95ef36e747Schristos 	else if (args_has(args, 'U')) {
96ef36e747Schristos 		if (sy >= adjust)
97ef36e747Schristos 			sy -= adjust;
98ef36e747Schristos 	} else if (args_has(args, 'D'))
99ef36e747Schristos 		sy += adjust;
100ef36e747Schristos 
101aa83ff61Schristos 	if (args_has(args, 'A')) {
102aa83ff61Schristos 		default_window_size(NULL, s, w, &sx, &sy, &xpixel, &ypixel,
103aa83ff61Schristos 		    WINDOW_SIZE_LARGEST);
104aa83ff61Schristos 	} else if (args_has(args, 'a')) {
105aa83ff61Schristos 		default_window_size(NULL, s, w, &sx, &sy, &xpixel, &ypixel,
106aa83ff61Schristos 		    WINDOW_SIZE_SMALLEST);
107aa83ff61Schristos 	}
108ef36e747Schristos 
109ef36e747Schristos 	options_set_number(w->options, "window-size", WINDOW_SIZE_MANUAL);
11046548964Swiz 	w->manual_sx = sx;
11146548964Swiz 	w->manual_sy = sy;
11246548964Swiz 	recalculate_size(w, 1);
113ef36e747Schristos 
114ef36e747Schristos 	return (CMD_RETURN_NORMAL);
115ef36e747Schristos }
116