summaryrefslogtreecommitdiffstats
path: root/server-fn.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-09-20 17:27:18 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-09-20 17:27:18 +0000
commit9b5f5ed8e8f74a9a615dfb6f5975b2f054d6d1fd (patch)
tree9e7eb6387f389f1f26165b67f027d2bf347906e4 /server-fn.c
parent273f1b385cdbe472501092edabf78acb2ea70a47 (diff)
Move some common and untidy code for window link/unlink into generic functions
instead of duplicating it in move/link window..
Diffstat (limited to 'server-fn.c')
-rw-r--r--server-fn.c54
1 files changed, 53 insertions, 1 deletions
diff --git a/server-fn.c b/server-fn.c
index 4bb2ed92..e3cee410 100644
--- a/server-fn.c
+++ b/server-fn.c
@@ -286,7 +286,59 @@ server_kill_window(struct window *w)
else
server_redraw_session(s);
}
- recalculate_sizes();
+}
+
+int
+server_link_window(
+ struct winlink *srcwl, struct session *dst, int dstidx,
+ int killflag, int selectflag, char **cause)
+{
+ struct winlink *dstwl;
+
+ dstwl = NULL;
+ if (dstidx != -1)
+ dstwl = winlink_find_by_index(&dst->windows, dstidx);
+ if (dstwl != NULL) {
+ if (dstwl->window == srcwl->window)
+ return (0);
+ if (killflag) {
+ /*
+ * Can't use session_detach as it will destroy session
+ * if this makes it empty.
+ */
+ session_alert_cancel(dst, dstwl);
+ winlink_stack_remove(&dst->lastw, dstwl);
+ winlink_remove(&dst->windows, dstwl);
+
+ /* Force select/redraw if current. */
+ if (dstwl == dst->curw)
+ selectflag = 1;
+ }
+ }
+
+ if (dstidx == -1)
+ dstidx = -1 - options_get_number(&dst->options, "base-index");
+ dstwl = session_attach(dst, srcwl->window, dstidx, cause);
+ if (dstwl == NULL)
+ return (-1);
+
+ if (!selectflag)
+ server_status_session(dst);
+ else {
+ session_select(dst, dstwl->idx);
+ server_redraw_session(dst);
+ }
+
+ return (0);
+}
+
+void
+server_unlink_window(struct session *s, struct winlink *wl)
+{
+ if (session_detach(s, wl))
+ server_destroy_session(s);
+ else
+ server_redraw_session(s);
}
void