Home | History | Annotate | Line # | Download | only in dist
cmd-resize-pane.c revision 1.1.1.2.18.1
      1  1.1.1.2.18.1   tls /* Id */
      2           1.1  jmmv 
      3           1.1  jmmv /*
      4           1.1  jmmv  * Copyright (c) 2009 Nicholas Marriott <nicm (at) users.sourceforge.net>
      5           1.1  jmmv  *
      6           1.1  jmmv  * Permission to use, copy, modify, and distribute this software for any
      7           1.1  jmmv  * purpose with or without fee is hereby granted, provided that the above
      8           1.1  jmmv  * copyright notice and this permission notice appear in all copies.
      9           1.1  jmmv  *
     10           1.1  jmmv  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     11           1.1  jmmv  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     12           1.1  jmmv  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     13           1.1  jmmv  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     14           1.1  jmmv  * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
     15           1.1  jmmv  * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
     16           1.1  jmmv  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     17           1.1  jmmv  */
     18           1.1  jmmv 
     19           1.1  jmmv #include <sys/types.h>
     20           1.1  jmmv 
     21           1.1  jmmv #include <stdlib.h>
     22           1.1  jmmv 
     23           1.1  jmmv #include "tmux.h"
     24           1.1  jmmv 
     25           1.1  jmmv /*
     26           1.1  jmmv  * Increase or decrease pane size.
     27           1.1  jmmv  */
     28           1.1  jmmv 
     29  1.1.1.2.18.1   tls void		 cmd_resize_pane_key_binding(struct cmd *, int);
     30  1.1.1.2.18.1   tls enum cmd_retval	 cmd_resize_pane_exec(struct cmd *, struct cmd_q *);
     31           1.1  jmmv 
     32           1.1  jmmv const struct cmd_entry cmd_resize_pane_entry = {
     33           1.1  jmmv 	"resize-pane", "resizep",
     34  1.1.1.2.18.1   tls 	"DLRt:Ux:y:Z", 0, 1,
     35  1.1.1.2.18.1   tls 	"[-DLRUZ] [-x width] [-y height] " CMD_TARGET_PANE_USAGE " [adjustment]",
     36       1.1.1.2  jmmv 	0,
     37       1.1.1.2  jmmv 	cmd_resize_pane_key_binding,
     38       1.1.1.2  jmmv 	cmd_resize_pane_exec
     39           1.1  jmmv };
     40           1.1  jmmv 
     41           1.1  jmmv void
     42       1.1.1.2  jmmv cmd_resize_pane_key_binding(struct cmd *self, int key)
     43           1.1  jmmv {
     44       1.1.1.2  jmmv 	switch (key) {
     45       1.1.1.2  jmmv 	case KEYC_UP | KEYC_CTRL:
     46       1.1.1.2  jmmv 		self->args = args_create(0);
     47       1.1.1.2  jmmv 		args_set(self->args, 'U', NULL);
     48       1.1.1.2  jmmv 		break;
     49       1.1.1.2  jmmv 	case KEYC_DOWN | KEYC_CTRL:
     50       1.1.1.2  jmmv 		self->args = args_create(0);
     51       1.1.1.2  jmmv 		args_set(self->args, 'D', NULL);
     52       1.1.1.2  jmmv 		break;
     53       1.1.1.2  jmmv 	case KEYC_LEFT | KEYC_CTRL:
     54       1.1.1.2  jmmv 		self->args = args_create(0);
     55       1.1.1.2  jmmv 		args_set(self->args, 'L', NULL);
     56       1.1.1.2  jmmv 		break;
     57       1.1.1.2  jmmv 	case KEYC_RIGHT | KEYC_CTRL:
     58       1.1.1.2  jmmv 		self->args = args_create(0);
     59       1.1.1.2  jmmv 		args_set(self->args, 'R', NULL);
     60       1.1.1.2  jmmv 		break;
     61       1.1.1.2  jmmv 	case KEYC_UP | KEYC_ESCAPE:
     62       1.1.1.2  jmmv 		self->args = args_create(1, "5");
     63       1.1.1.2  jmmv 		args_set(self->args, 'U', NULL);
     64       1.1.1.2  jmmv 		break;
     65       1.1.1.2  jmmv 	case KEYC_DOWN | KEYC_ESCAPE:
     66       1.1.1.2  jmmv 		self->args = args_create(1, "5");
     67       1.1.1.2  jmmv 		args_set(self->args, 'D', NULL);
     68       1.1.1.2  jmmv 		break;
     69       1.1.1.2  jmmv 	case KEYC_LEFT | KEYC_ESCAPE:
     70       1.1.1.2  jmmv 		self->args = args_create(1, "5");
     71       1.1.1.2  jmmv 		args_set(self->args, 'L', NULL);
     72       1.1.1.2  jmmv 		break;
     73       1.1.1.2  jmmv 	case KEYC_RIGHT | KEYC_ESCAPE:
     74       1.1.1.2  jmmv 		self->args = args_create(1, "5");
     75       1.1.1.2  jmmv 		args_set(self->args, 'R', NULL);
     76       1.1.1.2  jmmv 		break;
     77  1.1.1.2.18.1   tls 	case 'z':
     78  1.1.1.2.18.1   tls 		self->args = args_create(0);
     79  1.1.1.2.18.1   tls 		args_set(self->args, 'Z', NULL);
     80  1.1.1.2.18.1   tls 		break;
     81       1.1.1.2  jmmv 	default:
     82       1.1.1.2  jmmv 		self->args = args_create(0);
     83       1.1.1.2  jmmv 		break;
     84           1.1  jmmv 	}
     85           1.1  jmmv }
     86           1.1  jmmv 
     87  1.1.1.2.18.1   tls enum cmd_retval
     88  1.1.1.2.18.1   tls cmd_resize_pane_exec(struct cmd *self, struct cmd_q *cmdq)
     89           1.1  jmmv {
     90       1.1.1.2  jmmv 	struct args		*args = self->args;
     91           1.1  jmmv 	struct winlink		*wl;
     92  1.1.1.2.18.1   tls 	struct window		*w;
     93           1.1  jmmv 	const char	       	*errstr;
     94  1.1.1.2.18.1   tls 	char			*cause;
     95           1.1  jmmv 	struct window_pane	*wp;
     96           1.1  jmmv 	u_int			 adjust;
     97  1.1.1.2.18.1   tls 	int			 x, y;
     98           1.1  jmmv 
     99  1.1.1.2.18.1   tls 	if ((wl = cmd_find_pane(cmdq, args_get(args, 't'), NULL, &wp)) == NULL)
    100  1.1.1.2.18.1   tls 		return (CMD_RETURN_ERROR);
    101  1.1.1.2.18.1   tls 	w = wl->window;
    102  1.1.1.2.18.1   tls 
    103  1.1.1.2.18.1   tls 	if (args_has(args, 'Z')) {
    104  1.1.1.2.18.1   tls 		if (w->flags & WINDOW_ZOOMED)
    105  1.1.1.2.18.1   tls 			window_unzoom(w);
    106  1.1.1.2.18.1   tls 		else
    107  1.1.1.2.18.1   tls 			window_zoom(wp);
    108  1.1.1.2.18.1   tls 		server_redraw_window(w);
    109  1.1.1.2.18.1   tls 		server_status_window(w);
    110  1.1.1.2.18.1   tls 		return (CMD_RETURN_NORMAL);
    111  1.1.1.2.18.1   tls 	}
    112  1.1.1.2.18.1   tls 	server_unzoom_window(w);
    113           1.1  jmmv 
    114       1.1.1.2  jmmv 	if (args->argc == 0)
    115           1.1  jmmv 		adjust = 1;
    116           1.1  jmmv 	else {
    117       1.1.1.2  jmmv 		adjust = strtonum(args->argv[0], 1, INT_MAX, &errstr);
    118           1.1  jmmv 		if (errstr != NULL) {
    119  1.1.1.2.18.1   tls 			cmdq_error(cmdq, "adjustment %s", errstr);
    120  1.1.1.2.18.1   tls 			return (CMD_RETURN_ERROR);
    121  1.1.1.2.18.1   tls 		}
    122  1.1.1.2.18.1   tls 	}
    123  1.1.1.2.18.1   tls 
    124  1.1.1.2.18.1   tls 	if (args_has(self->args, 'x')) {
    125  1.1.1.2.18.1   tls 		x = args_strtonum(self->args, 'x', PANE_MINIMUM, INT_MAX,
    126  1.1.1.2.18.1   tls 		    &cause);
    127  1.1.1.2.18.1   tls 		if (cause != NULL) {
    128  1.1.1.2.18.1   tls 			cmdq_error(cmdq, "width %s", cause);
    129  1.1.1.2.18.1   tls 			free(cause);
    130  1.1.1.2.18.1   tls 			return (CMD_RETURN_ERROR);
    131  1.1.1.2.18.1   tls 		}
    132  1.1.1.2.18.1   tls 		layout_resize_pane_to(wp, LAYOUT_LEFTRIGHT, x);
    133  1.1.1.2.18.1   tls 	}
    134  1.1.1.2.18.1   tls 	if (args_has(self->args, 'y')) {
    135  1.1.1.2.18.1   tls 		y = args_strtonum(self->args, 'y', PANE_MINIMUM, INT_MAX,
    136  1.1.1.2.18.1   tls 		    &cause);
    137  1.1.1.2.18.1   tls 		if (cause != NULL) {
    138  1.1.1.2.18.1   tls 			cmdq_error(cmdq, "height %s", cause);
    139  1.1.1.2.18.1   tls 			free(cause);
    140  1.1.1.2.18.1   tls 			return (CMD_RETURN_ERROR);
    141           1.1  jmmv 		}
    142  1.1.1.2.18.1   tls 		layout_resize_pane_to(wp, LAYOUT_TOPBOTTOM, y);
    143           1.1  jmmv 	}
    144           1.1  jmmv 
    145       1.1.1.2  jmmv 	if (args_has(self->args, 'L'))
    146           1.1  jmmv 		layout_resize_pane(wp, LAYOUT_LEFTRIGHT, -adjust);
    147       1.1.1.2  jmmv 	else if (args_has(self->args, 'R'))
    148           1.1  jmmv 		layout_resize_pane(wp, LAYOUT_LEFTRIGHT, adjust);
    149       1.1.1.2  jmmv 	else if (args_has(self->args, 'U'))
    150           1.1  jmmv 		layout_resize_pane(wp, LAYOUT_TOPBOTTOM, -adjust);
    151       1.1.1.2  jmmv 	else if (args_has(self->args, 'D'))
    152           1.1  jmmv 		layout_resize_pane(wp, LAYOUT_TOPBOTTOM, adjust);
    153           1.1  jmmv 	server_redraw_window(wl->window);
    154           1.1  jmmv 
    155  1.1.1.2.18.1   tls 	return (CMD_RETURN_NORMAL);
    156           1.1  jmmv }
    157