summaryrefslogtreecommitdiff
path: root/usr.bin/tmux/window.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr.bin/tmux/window.c')
-rw-r--r--usr.bin/tmux/window.c112
1 files changed, 111 insertions, 1 deletions
diff --git a/usr.bin/tmux/window.c b/usr.bin/tmux/window.c
index 10e99070e6a..cb4f89ccb1e 100644
--- a/usr.bin/tmux/window.c
+++ b/usr.bin/tmux/window.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: window.c,v 1.44 2010/03/22 19:02:54 nicm Exp $ */
+/* $OpenBSD: window.c,v 1.45 2010/03/22 19:07:52 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -827,3 +827,113 @@ window_pane_search(struct window_pane *wp, const char *searchstr, u_int *lineno)
xfree(newsearchstr);
return (msg);
}
+
+/* Find the pane directly above another. */
+struct window_pane *
+window_pane_find_up(struct window_pane *wp)
+{
+ struct window_pane *wp2;
+ u_int left, top;
+
+ if (wp == NULL || !window_pane_visible(wp))
+ return (NULL);
+
+ top = wp->yoff;
+ if (top == 0)
+ top = wp->window->sy + 1;
+ left = wp->xoff;
+
+ TAILQ_FOREACH(wp2, &wp->window->panes, entry) {
+ if (!window_pane_visible(wp2))
+ continue;
+ if (wp2->yoff + wp2->sy + 1 != top)
+ continue;
+ if (left >= wp2->xoff && left <= wp2->xoff + wp2->sx)
+ return (wp2);
+ }
+ return (NULL);
+}
+
+/* Find the pane directly below another. */
+struct window_pane *
+window_pane_find_down(struct window_pane *wp)
+{
+ struct window_pane *wp2;
+ u_int left, bottom;
+
+ if (wp == NULL || !window_pane_visible(wp))
+ return (NULL);
+
+ bottom = wp->yoff + wp->sy + 1;
+ if (bottom >= wp->window->sy)
+ bottom = 0;
+ left = wp->xoff;
+
+ TAILQ_FOREACH(wp2, &wp->window->panes, entry) {
+ if (!window_pane_visible(wp2))
+ continue;
+ if (wp2->yoff != bottom)
+ continue;
+ if (left >= wp2->xoff && left <= wp2->xoff + wp2->sx)
+ return (wp2);
+ }
+ return (NULL);
+}
+
+/*
+ * Find the pane directly to the left of another, adjacent to the left side and
+ * containing the top edge.
+ */
+struct window_pane *
+window_pane_find_left(struct window_pane *wp)
+{
+ struct window_pane *wp2;
+ u_int left, top;
+
+ if (wp == NULL || !window_pane_visible(wp))
+ return (NULL);
+
+ left = wp->xoff;
+ if (left == 0)
+ left = wp->window->sx + 1;
+ top = wp->yoff;
+
+ TAILQ_FOREACH(wp2, &wp->window->panes, entry) {
+ if (!window_pane_visible(wp2))
+ continue;
+ if (wp2->xoff + wp2->sx + 1 != left)
+ continue;
+ if (top >= wp2->yoff && top <= wp2->yoff + wp2->sy)
+ return (wp2);
+ }
+ return (NULL);
+}
+
+/*
+ * Find the pane directly to the right of another, that is adjacent to the
+ * right edge and including the top edge.
+ */
+struct window_pane *
+window_pane_find_right(struct window_pane *wp)
+{
+ struct window_pane *wp2;
+ u_int right, top;
+
+ if (wp == NULL || !window_pane_visible(wp))
+ return (NULL);
+
+ right = wp->xoff + wp->sx + 1;
+ if (right >= wp->window->sx)
+ right = 0;
+ top = wp->yoff;
+
+ TAILQ_FOREACH(wp2, &wp->window->panes, entry) {
+ if (!window_pane_visible(wp2))
+ continue;
+ if (wp2->xoff != right)
+ continue;
+ if (top >= wp2->yoff && top <= wp2->yoff + wp2->sy)
+ return (wp2);
+ }
+ return (NULL);
+}