aboutsummaryrefslogtreecommitdiff
path: root/window.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2010-03-22 19:07:52 +0000
committerNicholas Marriott <nicm@openbsd.org>2010-03-22 19:07:52 +0000
commit6f04866044e7482c20bd28abd876d173093fa6ac (patch)
tree3cb0a65d0ea702094fe9e4e3d717987d09e5cb58 /window.c
parent021037c419b2044f5ba6f9596cc86923ab130309 (diff)
downloadrtmux-6f04866044e7482c20bd28abd876d173093fa6ac.tar.gz
rtmux-6f04866044e7482c20bd28abd876d173093fa6ac.tar.bz2
rtmux-6f04866044e7482c20bd28abd876d173093fa6ac.zip
Support up, down, left, right movement through panes with -UDLR flags to
select-pane. Also REMOVE the up- and down-pane commands: equivalent behaviour is now available using -t :.+ and -t :.-.
Diffstat (limited to 'window.c')
-rw-r--r--window.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/window.c b/window.c
index 1a41c11a..7f2eac8d 100644
--- a/window.c
+++ b/window.c
@@ -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);
+}