Nicholas Marriott | 93230a6 | 2009-01-19 18:23:40 +0000 | [diff] [blame] | 1 | /* $Id: cmd-resize-pane-down.c,v 1.6 2009-01-19 18:23:40 nicm Exp $ */ |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 2 | |
| 3 | /* |
| 4 | * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> |
| 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 | /* |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 26 | * Decrease pane size. |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 27 | */ |
| 28 | |
Nicholas Marriott | 0a99ba0 | 2009-01-14 21:08:52 +0000 | [diff] [blame] | 29 | void cmd_resize_pane_down_init(struct cmd *, int); |
Nicholas Marriott | 93230a6 | 2009-01-19 18:23:40 +0000 | [diff] [blame] | 30 | int cmd_resize_pane_down_exec(struct cmd *, struct cmd_ctx *); |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 31 | |
| 32 | const struct cmd_entry cmd_resize_pane_down_entry = { |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 33 | "resize-pane-down", "resizep-down", |
| 34 | CMD_PANE_WINDOW_USAGE " [adjustment]", |
Nicholas Marriott | 78c9675 | 2009-01-14 22:16:57 +0000 | [diff] [blame] | 35 | CMD_ARG01|CMD_CANREPEAT, |
Nicholas Marriott | 0a99ba0 | 2009-01-14 21:08:52 +0000 | [diff] [blame] | 36 | cmd_resize_pane_down_init, |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 37 | cmd_pane_parse, |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 38 | cmd_resize_pane_down_exec, |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 39 | cmd_pane_send, |
| 40 | cmd_pane_recv, |
| 41 | cmd_pane_free, |
| 42 | cmd_pane_print |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 43 | }; |
| 44 | |
| 45 | void |
Nicholas Marriott | 0a99ba0 | 2009-01-14 21:08:52 +0000 | [diff] [blame] | 46 | cmd_resize_pane_down_init(struct cmd *self, int key) |
| 47 | { |
| 48 | struct cmd_pane_data *data; |
| 49 | |
| 50 | cmd_pane_init(self, key); |
| 51 | data = self->data; |
| 52 | |
| 53 | if (key == KEYC_ADDESC(KEYC_DOWN)) |
| 54 | data->arg = xstrdup("5"); |
| 55 | } |
| 56 | |
Nicholas Marriott | 93230a6 | 2009-01-19 18:23:40 +0000 | [diff] [blame] | 57 | int |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 58 | cmd_resize_pane_down_exec(struct cmd *self, struct cmd_ctx *ctx) |
| 59 | { |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 60 | struct cmd_pane_data *data = self->data; |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 61 | struct winlink *wl; |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 62 | const char *errstr; |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 63 | struct window_pane *wp, *wq; |
| 64 | u_int adjust; |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 65 | |
| 66 | if ((wl = cmd_find_window(ctx, data->target, NULL)) == NULL) |
Nicholas Marriott | 93230a6 | 2009-01-19 18:23:40 +0000 | [diff] [blame] | 67 | return (-1); |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 68 | if (data->pane == -1) |
| 69 | wp = wl->window->active; |
| 70 | else { |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 71 | wp = window_pane_at_index(wl->window, data->pane); |
| 72 | if (wp == NULL) { |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 73 | ctx->error(ctx, "no pane: %d", data->pane); |
Nicholas Marriott | 93230a6 | 2009-01-19 18:23:40 +0000 | [diff] [blame] | 74 | return (-1); |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 75 | } |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 76 | } |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 77 | |
| 78 | if (data->arg == NULL) |
| 79 | adjust = 1; |
| 80 | else { |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 81 | adjust = strtonum(data->arg, 1, INT_MAX, &errstr); |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 82 | if (errstr != NULL) { |
| 83 | ctx->error(ctx, "adjustment %s: %s", errstr, data->arg); |
Nicholas Marriott | 93230a6 | 2009-01-19 18:23:40 +0000 | [diff] [blame] | 84 | return (-1); |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 85 | } |
| 86 | } |
| 87 | |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 88 | /* |
| 89 | * If this is not the last window, keep trying to increase size and |
| 90 | * remove it from the next windows. If it is the last, do so on the |
| 91 | * previous window. |
| 92 | */ |
| 93 | if (TAILQ_NEXT(wp, entry) == NULL) { |
| 94 | if (wp == TAILQ_FIRST(&wl->window->panes)) { |
| 95 | /* Only one pane. */ |
Nicholas Marriott | 93230a6 | 2009-01-19 18:23:40 +0000 | [diff] [blame] | 96 | return (0); |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 97 | } |
| 98 | wp = TAILQ_PREV(wp, window_panes, entry); |
| 99 | } |
| 100 | while (adjust-- > 0) { |
| 101 | wq = wp; |
| 102 | while ((wq = TAILQ_NEXT(wq, entry)) != NULL) { |
| 103 | if (wq->sy > PANE_MINIMUM) { |
| 104 | window_pane_resize(wq, wq->sx, wq->sy - 1); |
| 105 | break; |
| 106 | } |
| 107 | } |
| 108 | if (wq == NULL) |
| 109 | break; |
| 110 | window_pane_resize(wp, wp->sx, wp->sy + 1); |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 111 | |
Nicholas Marriott | b4ac8c1 | 2009-01-14 19:29:32 +0000 | [diff] [blame] | 112 | } |
| 113 | window_update_panes(wl->window); |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 114 | |
| 115 | server_redraw_window(wl->window); |
| 116 | |
Nicholas Marriott | 93230a6 | 2009-01-19 18:23:40 +0000 | [diff] [blame] | 117 | return (0); |
Nicholas Marriott | c35a50b | 2009-01-12 19:23:14 +0000 | [diff] [blame] | 118 | } |