diff options
author | Nicholas Marriott <nicm@cvs.openbsd.org> | 2011-06-05 10:53:06 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@cvs.openbsd.org> | 2011-06-05 10:53:06 +0000 |
commit | f7d0db52e5fff77b2e0bfe31a8b6ec3b6623e606 (patch) | |
tree | 6799e6e654bc875dffd21a09873bcc635c236fbc | |
parent | 46f09f74bc33db43b362a6fb6b4cf2c606eced10 (diff) |
Get rid of the layout string code which tries to walk through the layout
hierarchy and instead just look at what panes are actually in the window.
-rw-r--r-- | usr.bin/tmux/Makefile | 4 | ||||
-rw-r--r-- | usr.bin/tmux/cmd.c | 20 | ||||
-rw-r--r-- | usr.bin/tmux/layout-custom.c | 13 | ||||
-rw-r--r-- | usr.bin/tmux/layout-string.c | 168 | ||||
-rw-r--r-- | usr.bin/tmux/tmux.h | 8 | ||||
-rw-r--r-- | usr.bin/tmux/window.c | 60 |
6 files changed, 77 insertions, 196 deletions
diff --git a/usr.bin/tmux/Makefile b/usr.bin/tmux/Makefile index a37ec8d49b5..917d77efa34 100644 --- a/usr.bin/tmux/Makefile +++ b/usr.bin/tmux/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.51 2011/01/08 00:48:54 nicm Exp $ +# $OpenBSD: Makefile,v 1.52 2011/06/05 10:53:05 nicm Exp $ PROG= tmux SRCS= arguments.c attributes.c cfg.c client.c clock.c \ @@ -31,7 +31,7 @@ SRCS= arguments.c attributes.c cfg.c client.c clock.c \ cmd-pipe-pane.c cmd-capture-pane.c cmd.c \ colour.c environ.c grid-view.c grid-utf8.c grid.c input-keys.c \ input.c key-bindings.c key-string.c \ - layout-custom.c layout-set.c layout-string.c layout.c log.c job.c \ + layout-custom.c layout-set.c layout.c log.c job.c \ mode-key.c names.c options.c options-table.c paste.c procname.c \ resize.c screen-redraw.c screen-write.c screen.c session.c status.c \ signal.c server-fn.c server.c server-client.c server-window.c \ diff --git a/usr.bin/tmux/cmd.c b/usr.bin/tmux/cmd.c index e6e2deee701..ed113411e91 100644 --- a/usr.bin/tmux/cmd.c +++ b/usr.bin/tmux/cmd.c @@ -1,4 +1,4 @@ -/* $OpenBSD: cmd.c,v 1.54 2011/05/08 20:35:58 nicm Exp $ */ +/* $OpenBSD: cmd.c,v 1.55 2011/06/05 10:53:05 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -1058,12 +1058,11 @@ struct winlink * cmd_find_pane(struct cmd_ctx *ctx, const char *arg, struct session **sp, struct window_pane **wpp) { - struct session *s; - struct winlink *wl; - struct layout_cell *lc; - const char *period, *errstr; - char *winptr, *paneptr; - u_int idx; + struct session *s; + struct winlink *wl; + const char *period, *errstr; + char *winptr, *paneptr; + u_int idx; /* Get the current session. */ if ((s = cmd_current_session(ctx, 0)) == NULL) { @@ -1119,11 +1118,10 @@ cmd_find_pane(struct cmd_ctx *ctx, lookup_string: /* Try pane string description. */ - if ((lc = layout_find_string(wl->window, paneptr)) == NULL) { + if ((*wpp = window_find_string(wl->window, paneptr)) == NULL) { ctx->error(ctx, "can't find pane: %s", paneptr); goto error; } - *wpp = lc->wp; xfree(winptr); return (wl); @@ -1142,10 +1140,8 @@ no_period: lookup_window: /* Try pane string description. */ - if ((lc = layout_find_string(s->curw->window, arg)) != NULL) { - *wpp = lc->wp; + if ((*wpp = window_find_string(s->curw->window, arg)) != NULL) return (s->curw); - } /* Try as a window and use the active pane. */ if ((wl = cmd_find_window(ctx, arg, sp)) != NULL) diff --git a/usr.bin/tmux/layout-custom.c b/usr.bin/tmux/layout-custom.c index 44aaad67f6b..717250ca103 100644 --- a/usr.bin/tmux/layout-custom.c +++ b/usr.bin/tmux/layout-custom.c @@ -1,4 +1,4 @@ -/* $OpenBSD: layout-custom.c,v 1.1 2010/06/29 03:30:13 nicm Exp $ */ +/* $OpenBSD: layout-custom.c,v 1.2 2011/06/05 10:53:05 nicm Exp $ */ /* * Copyright (c) 2010 Nicholas Marriott <nicm@users.sourceforge.net> @@ -23,11 +23,22 @@ #include "tmux.h" +struct layout_cell *layout_find_bottomright(struct layout_cell *); u_short layout_checksum(const char *); int layout_append(struct layout_cell *, char *, size_t); struct layout_cell *layout_construct(struct layout_cell *, const char **); void layout_assign(struct window_pane **, struct layout_cell *); +/* Find the bottom-right cell. */ +struct layout_cell * +layout_find_bottomright(struct layout_cell *lc) +{ + if (lc->type == LAYOUT_WINDOWPANE) + return (lc); + lc = TAILQ_LAST(&lc->cells, layout_cells); + return (layout_find_bottomright(lc)); +} + /* Calculate layout checksum. */ u_short layout_checksum(const char *layout) diff --git a/usr.bin/tmux/layout-string.c b/usr.bin/tmux/layout-string.c deleted file mode 100644 index 78db1a87841..00000000000 --- a/usr.bin/tmux/layout-string.c +++ /dev/null @@ -1,168 +0,0 @@ -/* $OpenBSD: layout-string.c,v 1.5 2010/06/29 03:30:14 nicm Exp $ */ - -/* - * Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net> - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER - * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING - * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include <sys/types.h> - -#include <stdlib.h> -#include <string.h> - -#include "tmux.h" - -/* - * Figure out the pane position based on a description. Fairly simple right - * now, just understands a set of strings: left, right, top, bottom, top-left - * top-right, bottom-left, bottom-right. - */ - -struct layout_cell *layout_find_top(struct layout_cell *); -struct layout_cell *layout_find_bottom(struct layout_cell *); -struct layout_cell *layout_find_left(struct layout_cell *); -struct layout_cell *layout_find_right(struct layout_cell *); -struct layout_cell *layout_find_topleft(struct layout_cell *); -struct layout_cell *layout_find_topright(struct layout_cell *); -struct layout_cell *layout_find_bottomleft(struct layout_cell *); - -/* Find the cell; returns NULL if string not understood. */ -struct layout_cell * -layout_find_string(struct window *w, const char *s) -{ - struct layout_cell *lc; - - lc = NULL; - - if (strcasecmp(s, "top") == 0) - lc = layout_find_top(w->layout_root); - else if (strcasecmp(s, "bottom") == 0) - lc = layout_find_bottom(w->layout_root); - else if (strcasecmp(s, "left") == 0) - lc = layout_find_left(w->layout_root); - else if (strcasecmp(s, "right") == 0) - lc = layout_find_right(w->layout_root); - else if (strcasecmp(s, "top-left") == 0) - lc = layout_find_topleft(w->layout_root); - else if (strcasecmp(s, "top-right") == 0) - lc = layout_find_topright(w->layout_root); - else if (strcasecmp(s, "bottom-left") == 0) - lc = layout_find_bottomleft(w->layout_root); - else if (strcasecmp(s, "bottom-right") == 0) - lc = layout_find_bottomright(w->layout_root); - - if (lc == NULL || lc->type != LAYOUT_WINDOWPANE) - return (NULL); - return (lc); -} - -/* - * Find the top cell. Because splits in the same direction are stored as a - * list, this is just the first in the list. Return NULL if no topmost cell. - * For an unnested cell (not split), the top cell is always itself. - */ -struct layout_cell * -layout_find_top(struct layout_cell *lc) -{ - if (lc->type == LAYOUT_WINDOWPANE) - return (lc); - else if (lc->type == LAYOUT_TOPBOTTOM) - return (TAILQ_FIRST(&lc->cells)); - return (NULL); -} - -/* - * Find the bottom cell. Similarly to the top cell, this is just the last in - * the list. - */ -struct layout_cell * -layout_find_bottom(struct layout_cell *lc) -{ - if (lc->type == LAYOUT_WINDOWPANE) - return (lc); - else if (lc->type == LAYOUT_TOPBOTTOM) - return (TAILQ_LAST(&lc->cells, layout_cells)); - return (NULL); -} - -/* Find the left cell. */ -struct layout_cell * -layout_find_left(struct layout_cell *lc) -{ - if (lc->type == LAYOUT_WINDOWPANE) - return (lc); - else if (lc->type == LAYOUT_LEFTRIGHT) - return (TAILQ_FIRST(&lc->cells)); - return (NULL); -} - -/* Find the right cell. */ -struct layout_cell * -layout_find_right(struct layout_cell *lc) -{ - if (lc->type == LAYOUT_WINDOWPANE) - return (lc); - else if (lc->type == LAYOUT_LEFTRIGHT) - return (TAILQ_LAST(&lc->cells, layout_cells)); - return (NULL); -} - -/* - * Find the top-left cell. This means recursing until there are no more moves - * to be made. - */ -struct layout_cell * -layout_find_topleft(struct layout_cell *lc) -{ - if (lc->type == LAYOUT_WINDOWPANE) - return (lc); - lc = TAILQ_FIRST(&lc->cells); - return (layout_find_topleft(lc)); -} - -/* Find the top-right cell. */ -struct layout_cell * -layout_find_topright(struct layout_cell *lc) -{ - if (lc->type == LAYOUT_WINDOWPANE) - return (lc); - if (lc->type == LAYOUT_LEFTRIGHT) - lc = TAILQ_LAST(&lc->cells, layout_cells); - else - lc = TAILQ_FIRST(&lc->cells); - return (layout_find_topright(lc)); -} - -/* Find the bottom-left cell. */ -struct layout_cell * -layout_find_bottomleft(struct layout_cell *lc) -{ - if (lc->type == LAYOUT_WINDOWPANE) - return (lc); - if (lc->type == LAYOUT_LEFTRIGHT) - lc = TAILQ_FIRST(&lc->cells); - else - lc = TAILQ_LAST(&lc->cells, layout_cells); - return (layout_find_bottomleft(lc)); -} - -/* Find the bottom-right cell. */ -struct layout_cell * -layout_find_bottomright(struct layout_cell *lc) -{ - if (lc->type == LAYOUT_WINDOWPANE) - return (lc); - lc = TAILQ_LAST(&lc->cells, layout_cells); - return (layout_find_bottomright(lc)); -} diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 233c7f0f7c6..fe5967c1c56 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.288 2011/05/20 19:17:39 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.289 2011/06/05 10:53:05 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -1891,7 +1891,9 @@ struct window *window_create(const char *, const char *, const char *, const char *, struct environ *, struct termios *, u_int, u_int, u_int, char **); void window_destroy(struct window *); +struct window_pane *window_get_active_at(struct window *, u_int, u_int); void window_set_active_at(struct window *, u_int, u_int); +struct window_pane *window_find_string(struct window *, const char *); void window_set_active_pane(struct window *, struct window_pane *); struct window_pane *window_add_pane(struct window *, u_int); void window_resize(struct window *, u_int, u_int); @@ -1971,10 +1973,6 @@ u_int layout_set_next(struct window *); u_int layout_set_previous(struct window *); void layout_set_active_changed(struct window *); -/* layout-string.c */ -struct layout_cell *layout_find_string(struct window *, const char *); -struct layout_cell *layout_find_bottomright(struct layout_cell *); - /* window-clock.c */ extern const struct window_mode window_clock_mode; diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c index c448a50ffd6..37941497044 100644 --- a/usr.bin/tmux/window.c +++ b/usr.bin/tmux/window.c @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.65 2011/04/18 20:57:16 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.66 2011/06/05 10:53:05 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -356,21 +356,65 @@ window_set_active_pane(struct window *w, struct window_pane *wp) } } -void -window_set_active_at(struct window *w, u_int x, u_int y) +struct window_pane * +window_get_active_at(struct window *w, u_int x, u_int y) { struct window_pane *wp; TAILQ_FOREACH(wp, &w->panes, entry) { - if (wp == w->active || !window_pane_visible(wp)) + if (!window_pane_visible(wp)) continue; - if (x < wp->xoff || x >= wp->xoff + wp->sx) + if (x < wp->xoff || x > wp->xoff + wp->sx) continue; - if (y < wp->yoff || y >= wp->yoff + wp->sy) + if (y < wp->yoff || y > wp->yoff + wp->sy) continue; - window_set_active_pane(w, wp); - break; + return (wp); } + return (NULL); +} + +void +window_set_active_at(struct window *w, u_int x, u_int y) +{ + struct window_pane *wp; + + wp = window_get_active_at(w, x, y); + if (wp != NULL && wp != w->active) + window_set_active_pane(w, wp); +} + +struct window_pane * +window_find_string(struct window *w, const char *s) +{ + u_int x, y; + + x = w->sx / 2; + y = w->sy / 2; + + if (strcasecmp(s, "top") == 0) + y = 0; + else if (strcasecmp(s, "bottom") == 0) + y = w->sy - 1; + else if (strcasecmp(s, "left") == 0) + x = 0; + else if (strcasecmp(s, "right") == 0) + x = w->sx - 1; + else if (strcasecmp(s, "top-left") == 0) { + x = 0; + y = 0; + } else if (strcasecmp(s, "top-right") == 0) { + x = w->sx - 1; + y = 0; + } else if (strcasecmp(s, "bottom-left") == 0) { + x = 0; + y = w->sy - 1; + } else if (strcasecmp(s, "bottom-right") == 0) { + x = w->sx - 1; + y = w->sy - 1; + } else + return (NULL); + + return (window_get_active_at(w, x, y)); } struct window_pane * |