1 | /* $OpenBSD$ */ |
2 | |
3 | /* |
4 | * Copyright (c) 2018 Nicholas Marriott <[email protected]> |
5 | * |
6 | * Permission to use, copy, modify, and distribute this software for any |
7 | * purpose with or without fee is hereby granted, provided that the above |
8 | * copyright notice and this permission notice appear in all copies. |
9 | * |
10 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
11 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
12 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
13 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
14 | * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER |
15 | * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING |
16 | * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
17 | */ |
18 | |
19 | #include <sys/types.h> |
20 | |
21 | #include <stdlib.h> |
22 | |
23 | #include "tmux.h" |
24 | |
25 | /* |
26 | * Increase or decrease window size. |
27 | */ |
28 | |
29 | static enum cmd_retval cmd_resize_window_exec(struct cmd *, |
30 | struct cmdq_item *); |
31 | |
32 | const struct cmd_entry cmd_resize_window_entry = { |
33 | .name = "resize-window" , |
34 | .alias = "resizew" , |
35 | |
36 | .args = { "aADLRt:Ux:y:" , 0, 1 }, |
37 | .usage = "[-aADLRU] [-x width] [-y height] " CMD_TARGET_WINDOW_USAGE " " |
38 | "[adjustment]" , |
39 | |
40 | .target = { 't', CMD_FIND_WINDOW, 0 }, |
41 | |
42 | .flags = CMD_AFTERHOOK, |
43 | .exec = cmd_resize_window_exec |
44 | }; |
45 | |
46 | static enum cmd_retval |
47 | cmd_resize_window_exec(struct cmd *self, struct cmdq_item *item) |
48 | { |
49 | struct args *args = self->args; |
50 | struct winlink *wl = item->target.wl; |
51 | struct window *w = wl->window; |
52 | struct session *s = item->target.s; |
53 | const char *errstr; |
54 | char *cause; |
55 | u_int adjust, sx, sy; |
56 | int xpixel = -1, ypixel = -1; |
57 | |
58 | if (args->argc == 0) |
59 | adjust = 1; |
60 | else { |
61 | adjust = strtonum(args->argv[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 | resize_window(w, sx, sy, xpixel, ypixel); |
111 | |
112 | return (CMD_RETURN_NORMAL); |
113 | } |
114 | |