1106356Smarcel/* $OpenBSD: cmd-resize-window.c,v 1.10 2023/06/30 13:19:32 nicm Exp $ */
2106356Smarcel
3106356Smarcel/*
4106356Smarcel * Copyright (c) 2018 Nicholas Marriott <nicholas.marriott@gmail.com>
5106356Smarcel *
6136018Sru * Permission to use, copy, modify, and distribute this software for any
7136018Sru * purpose with or without fee is hereby granted, provided that the above
8136018Sru * copyright notice and this permission notice appear in all copies.
9136018Sru *
10136018Sru * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11106356Smarcel * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12106356Smarcel * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13106356Smarcel * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14106356Smarcel * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
15136018Sru * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
16136018Sru * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17136018Sru */
18179563Smarcel
19136018Sru#include <sys/types.h>
20136018Sru
21136018Sru#include <stdlib.h>
22136018Sru
23136018Sru#include "tmux.h"
24136018Sru
25136018Sru/*
26136018Sru * Increase or decrease window size.
27175567Skensmith */
28175567Skensmith
29179563Smarcelstatic enum cmd_retval	cmd_resize_window_exec(struct cmd *,
30179563Smarcel			    struct cmdq_item *);
31106356Smarcel
32106356Smarcelconst struct cmd_entry cmd_resize_window_entry = {
33181927Skensmith	.name = "resize-window",
34136018Sru	.alias = "resizew",
35136018Sru
36136018Sru	.args = { "aADLRt:Ux:y:", 0, 1, NULL },
37106356Smarcel	.usage = "[-aADLRU] [-x width] [-y height] " CMD_TARGET_WINDOW_USAGE " "
38106356Smarcel		 "[adjustment]",
39106356Smarcel
40106356Smarcel	.target = { 't', CMD_FIND_WINDOW, 0 },
41106356Smarcel
42136018Sru	.flags = CMD_AFTERHOOK,
43136018Sru	.exec = cmd_resize_window_exec
44136018Sru};
45189300Snyan
46106356Smarcelstatic enum cmd_retval
47136017Srucmd_resize_window_exec(struct cmd *self, struct cmdq_item *item)
48156436Ssam{
49189300Snyan	struct args		*args = cmd_get_args(self);
50	struct cmd_find_state	*target = cmdq_get_target(item);
51	struct winlink		*wl = target->wl;
52	struct window		*w = wl->window;
53	struct session		*s = target->s;
54	const char	       	*errstr;
55	char			*cause;
56	u_int			 adjust, sx, sy, xpixel = 0, ypixel = 0;
57
58	if (args_count(args) == 0)
59		adjust = 1;
60	else {
61		adjust = strtonum(args_string(args, 0), 1, INT_MAX, &errstr);
62		if (errstr != NULL) {
63			cmdq_error(item, "adjustment %s", errstr);
64			return (CMD_RETURN_ERROR);
65		}
66	}
67
68	sx = w->sx;
69	sy = w->sy;
70
71	if (args_has(args, 'x')) {
72		sx = args_strtonum(args, 'x', WINDOW_MINIMUM, WINDOW_MAXIMUM,
73		    &cause);
74		if (cause != NULL) {
75			cmdq_error(item, "width %s", cause);
76			free(cause);
77			return (CMD_RETURN_ERROR);
78		}
79	}
80	if (args_has(args, 'y')) {
81		sy = args_strtonum(args, 'y', WINDOW_MINIMUM, WINDOW_MAXIMUM,
82		    &cause);
83		if (cause != NULL) {
84			cmdq_error(item, "height %s", cause);
85			free(cause);
86			return (CMD_RETURN_ERROR);
87		}
88	}
89
90	if (args_has(args, 'L')) {
91		if (sx >= adjust)
92			sx -= adjust;
93	} else if (args_has(args, 'R'))
94		sx += adjust;
95	else if (args_has(args, 'U')) {
96		if (sy >= adjust)
97			sy -= adjust;
98	} else if (args_has(args, 'D'))
99		sy += adjust;
100
101	if (args_has(args, 'A')) {
102		default_window_size(NULL, s, w, &sx, &sy, &xpixel, &ypixel,
103		    WINDOW_SIZE_LARGEST);
104	} else if (args_has(args, 'a')) {
105		default_window_size(NULL, s, w, &sx, &sy, &xpixel, &ypixel,
106		    WINDOW_SIZE_SMALLEST);
107	}
108
109	options_set_number(w->options, "window-size", WINDOW_SIZE_MANUAL);
110	w->manual_sx = sx;
111	w->manual_sy = sy;
112	recalculate_size(w, 1);
113
114	return (CMD_RETURN_NORMAL);
115}
116