summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/window.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2011-06-05 10:53:06 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2011-06-05 10:53:06 +0000
commitf7d0db52e5fff77b2e0bfe31a8b6ec3b6623e606 (patch)
tree6799e6e654bc875dffd21a09873bcc635c236fbc /usr.bin/tmux/window.c
parent46f09f74bc33db43b362a6fb6b4cf2c606eced10 (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.
Diffstat (limited to 'usr.bin/tmux/window.c')
-rw-r--r--usr.bin/tmux/window.c60
1 files changed, 52 insertions, 8 deletions
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 *