From e741a0bcd7775fab1db822ea6707cd32b0ea9799 Mon Sep 17 00:00:00 2001
From: nicm <nicm>
Date: Mon, 27 Feb 2017 13:07:57 +0000
Subject: [PATCH] If splitw -b is used, insert the new pane before the current
 one in the pane list. This means the numbering is in order (for example for
 display-panes) and fixes a problem with redrawing the active pane borders.

---
 cmd-split-window.c |  2 +-
 tmux.h             |  2 +-
 window.c           | 19 +++++++++++--------
 3 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/cmd-split-window.c b/cmd-split-window.c
index 3c49ef9e..f05dc249 100644
--- a/cmd-split-window.c
+++ b/cmd-split-window.c
@@ -139,7 +139,7 @@ cmd_split_window_exec(struct cmd *self, struct cmdq_item *item)
 		cause = xstrdup("pane too small");
 		goto error;
 	}
-	new_wp = window_add_pane(w, wp, hlimit);
+	new_wp = window_add_pane(w, wp, args_has(args, 'b'), hlimit);
 	layout_assign_pane(lc, new_wp);
 
 	path = NULL;
diff --git a/tmux.h b/tmux.h
index 89f1af35..40b62e0c 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2066,7 +2066,7 @@ int		 window_set_active_pane(struct window *, struct window_pane *);
 void		 window_redraw_active_switch(struct window *,
 		     struct window_pane *);
 struct window_pane *window_add_pane(struct window *, struct window_pane *,
-		     u_int);
+		     int, u_int);
 void		 window_resize(struct window *, u_int, u_int);
 int		 window_zoom(struct window_pane *);
 int		 window_unzoom(struct window *);
diff --git a/window.c b/window.c
index eddd90d6..e48826b2 100644
--- a/window.c
+++ b/window.c
@@ -339,7 +339,7 @@ window_create_spawn(const char *name, int argc, char **argv, const char *path,
 	struct window_pane	*wp;
 
 	w = window_create(sx, sy);
-	wp = window_add_pane(w, NULL, hlimit);
+	wp = window_add_pane(w, NULL, 0, hlimit);
 	layout_init(w, wp);
 
 	if (window_pane_spawn(wp, argc, argv, path, shell, cwd,
@@ -426,6 +426,7 @@ window_has_pane(struct window *w, struct window_pane *wp)
 int
 window_set_active_pane(struct window *w, struct window_pane *wp)
 {
+	log_debug("%s: pane %%%u (was %%%u)", __func__, wp->id, w->active->id);
 	if (wp == w->active)
 		return (0);
 	w->last = w->active;
@@ -578,19 +579,21 @@ window_unzoom(struct window *w)
 }
 
 struct window_pane *
-window_add_pane(struct window *w, struct window_pane *after, u_int hlimit)
+window_add_pane(struct window *w, struct window_pane *other, int before,
+    u_int hlimit)
 {
 	struct window_pane	*wp;
 
+	if (other == NULL)
+		other = w->active;
+
 	wp = window_pane_create(w, w->sx, w->sy, hlimit);
 	if (TAILQ_EMPTY(&w->panes))
 		TAILQ_INSERT_HEAD(&w->panes, wp, entry);
-	else {
-		if (after == NULL)
-			TAILQ_INSERT_AFTER(&w->panes, w->active, wp, entry);
-		else
-			TAILQ_INSERT_AFTER(&w->panes, after, wp, entry);
-	}
+	else if (before)
+		TAILQ_INSERT_BEFORE(other, wp, entry);
+	else
+		TAILQ_INSERT_AFTER(&w->panes, other, wp, entry);
 	return (wp);
 }