From fa0f10d77aa9506285ced61f4ae93728b2f8cb0e Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Thu, 23 Jun 2011 19:21:26 +0000 Subject: [PATCH] PatchSet 923 Date: 2011/06/05 11:53:05 Author: nicm Branch: HEAD Tag: (none) Log: 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. --- cmd.c | 20 +++--- layout-custom.c | 13 +++- layout-string.c | 168 ------------------------------------------------ tmux.h | 8 +-- window.c | 64 +++++++++++++++--- 5 files changed, 77 insertions(+), 196 deletions(-) delete mode 100644 layout-string.c diff --git a/cmd.c b/cmd.c index 247910c1..fa645bfa 100644 --- a/cmd.c +++ b/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.153 2011-05-18 20:30:36 tcunha Exp $ */ +/* $Id$ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1057,12 +1057,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) { @@ -1118,11 +1117,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); @@ -1141,10 +1139,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 50c4627b..b4a6d833 100644 --- a/layout-custom.c +++ b/layout-custom.c @@ -1,4 +1,4 @@ -/* $Id: layout-custom.c,v 1.1 2010-07-02 02:54:52 tcunha Exp $ */ +/* $Id$ */ /* * Copyright (c) 2010 Nicholas Marriott @@ -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 6f8834b2..00000000 --- a/layout-string.c +++ /dev/null @@ -1,168 +0,0 @@ -/* $Id: layout-string.c,v 1.4 2010-07-02 02:54:52 tcunha Exp $ */ - -/* - * Copyright (c) 2009 Nicholas Marriott - * - * 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 - -#include -#include - -#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/tmux.h b/tmux.h index 5317a5e0..80fc4ee1 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.627 2011-05-22 16:26:09 tcunha Exp $ */ +/* $Id$ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1887,7 +1887,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); @@ -1967,10 +1969,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/window.c b/window.c index e1e30741..4b5f9016 100644 --- a/window.c +++ b/window.c @@ -1,4 +1,4 @@ -/* $Id: window.c,v 1.147 2011-04-18 22:03:55 nicm Exp $ */ +/* $Id$ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -353,21 +353,65 @@ window_set_active_pane(struct window *w, struct window_pane *wp) } } +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 (!window_pane_visible(wp)) + continue; + if (x < wp->xoff || x > wp->xoff + wp->sx) + continue; + if (y < wp->yoff || y > wp->yoff + wp->sy) + continue; + return (wp); + } + return (NULL); +} + void window_set_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)) - continue; - if (x < wp->xoff || x >= wp->xoff + wp->sx) - continue; - if (y < wp->yoff || y >= wp->yoff + wp->sy) - continue; + wp = window_get_active_at(w, x, y); + if (wp != NULL && wp != w->active) window_set_active_pane(w, wp); - break; - } +} + +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 *