diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2011-06-05 10:53:05 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2011-06-05 10:53:05 +0000 |
commit | 2b60c648c4e0202ca2743fe958e0eabfc0479f55 (patch) | |
tree | d100a1acc4a275a6290eb01a50268eef7bf0b4a4 | |
parent | f537870909c024ff5aaa7b9d15f3af469811ab3c (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-- | Makefile | 2 | ||||
-rw-r--r-- | cmd.c | 18 | ||||
-rw-r--r-- | layout-custom.c | 11 | ||||
-rw-r--r-- | layout-string.c | 168 | ||||
-rw-r--r-- | tmux.h | 6 | ||||
-rw-r--r-- | window.c | 58 |
6 files changed, 72 insertions, 191 deletions
@@ -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 \ @@ -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/layout-custom.c b/layout-custom.c index 617e3170..9fb9cebd 100644 --- a/layout-custom.c +++ b/layout-custom.c @@ -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/layout-string.c b/layout-string.c deleted file mode 100644 index 4b63f19a..00000000 --- a/layout-string.c +++ /dev/null @@ -1,168 +0,0 @@ -/* $OpenBSD$ */ - -/* - * 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)); -} @@ -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; @@ -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 * |