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