1 /* $OpenBSD: cmd-resize-window.c,v 1.5 2020/04/13 10:59:58 nicm Exp $ */ 2 3 /* 4 * Copyright (c) 2018 Nicholas Marriott <nicholas.marriott@gmail.com> 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 = 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; 57 int xpixel = -1, ypixel = -1; 58 59 if (args->argc == 0) 60 adjust = 1; 61 else { 62 adjust = strtonum(args->argv[0], 1, INT_MAX, &errstr); 63 if (errstr != NULL) { 64 cmdq_error(item, "adjustment %s", errstr); 65 return (CMD_RETURN_ERROR); 66 } 67 } 68 69 sx = w->sx; 70 sy = w->sy; 71 72 if (args_has(args, 'x')) { 73 sx = args_strtonum(args, 'x', WINDOW_MINIMUM, WINDOW_MAXIMUM, 74 &cause); 75 if (cause != NULL) { 76 cmdq_error(item, "width %s", cause); 77 free(cause); 78 return (CMD_RETURN_ERROR); 79 } 80 } 81 if (args_has(args, 'y')) { 82 sy = args_strtonum(args, 'y', WINDOW_MINIMUM, WINDOW_MAXIMUM, 83 &cause); 84 if (cause != NULL) { 85 cmdq_error(item, "height %s", cause); 86 free(cause); 87 return (CMD_RETURN_ERROR); 88 } 89 } 90 91 if (args_has(args, 'L')) { 92 if (sx >= adjust) 93 sx -= adjust; 94 } else if (args_has(args, 'R')) 95 sx += adjust; 96 else if (args_has(args, 'U')) { 97 if (sy >= adjust) 98 sy -= adjust; 99 } else if (args_has(args, 'D')) 100 sy += adjust; 101 102 if (args_has(args, 'A')) { 103 default_window_size(NULL, s, w, &sx, &sy, &xpixel, &ypixel, 104 WINDOW_SIZE_LARGEST); 105 } else if (args_has(args, 'a')) { 106 default_window_size(NULL, s, w, &sx, &sy, &xpixel, &ypixel, 107 WINDOW_SIZE_SMALLEST); 108 } 109 110 options_set_number(w->options, "window-size", WINDOW_SIZE_MANUAL); 111 resize_window(w, sx, sy, xpixel, ypixel); 112 113 return (CMD_RETURN_NORMAL); 114 } 115