aboutsummaryrefslogtreecommitdiff
path: root/session.c
diff options
context:
space:
mode:
Diffstat (limited to 'session.c')
-rw-r--r--session.c189
1 files changed, 189 insertions, 0 deletions
diff --git a/session.c b/session.c
new file mode 100644
index 00000000..31b80154
--- /dev/null
+++ b/session.c
@@ -0,0 +1,189 @@
+/* $Id: session.c,v 1.1.1.1 2007-07-09 19:04:12 nicm Exp $ */
+
+/*
+ * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER
+ * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING
+ * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+
+#include <string.h>
+
+#include "tmux.h"
+
+/* Global session list. */
+struct sessions sessions;
+
+/* Find session by name. */
+struct session *
+session_find(const char *name)
+{
+ struct session *s;
+ u_int i;
+
+ for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
+ s = ARRAY_ITEM(&sessions, i);
+ if (s != NULL && strcmp(s->name, name) == 0)
+ return (s);
+ }
+
+ return (NULL);
+}
+
+/* Create a new session. */
+struct session *
+session_create(const char *name, const char *cmd, u_int sx, u_int sy)
+{
+ struct session *s;
+ u_int i;
+
+ s = xmalloc(sizeof *s);
+ s->tim = time(NULL);
+ strlcpy(s->name, name, sizeof s->name);
+ ARRAY_INIT(&s->windows);
+
+ if (session_new(s, cmd, sx, sy) != 0) {
+ xfree(s);
+ return (NULL);
+ }
+
+ for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
+ s = ARRAY_ITEM(&sessions, i);
+ if (s == NULL) {
+ ARRAY_SET(&sessions, i, s);
+ return (s);
+ }
+ }
+ ARRAY_ADD(&sessions, s);
+ return (s);
+}
+
+/* Destroy a session. */
+void
+session_destroy(struct session *s)
+{
+ u_int i;
+
+ if (session_index(s, &i) != 0)
+ log_fatalx("session not found");
+ ARRAY_REMOVE(&sessions, i);
+
+ while (!ARRAY_EMPTY(&s->windows))
+ window_remove(&s->windows, ARRAY_FIRST(&s->windows));
+
+ xfree(s);
+}
+
+/* Find session index. */
+int
+session_index(struct session *s, u_int *i)
+{
+ for (*i = 0; *i < ARRAY_LENGTH(&sessions); (*i)++) {
+ if (s == ARRAY_ITEM(&sessions, *i))
+ return (0);
+ }
+ return (-1);
+}
+
+/* Create a new window on a session. */
+int
+session_new(struct session *s, const char *cmd, u_int sx, u_int sy)
+{
+ struct window *w;
+
+ if ((w = window_create(cmd, sx, sy)) == NULL)
+ return (-1);
+ session_attach(s, w);
+
+ s->window = w;
+ return (0);
+}
+
+/* Attach a window to a session. */
+void
+session_attach(struct session *s, struct window *w)
+{
+ window_add(&s->windows, w);
+}
+
+/* Detach a window from a session. */
+int
+session_detach(struct session *s, struct window *w)
+{
+ if (s->window == w) {
+ if (session_next(s) != 0)
+ session_previous(s);
+ }
+
+ window_remove(&s->windows, w);
+ if (ARRAY_EMPTY(&s->windows)) {
+ session_destroy(s);
+ return (1);
+ }
+ return (0);
+}
+
+/* Return if session has window. */
+int
+session_has(struct session *s, struct window *w)
+{
+ u_int i;
+
+ return (window_index(&s->windows, w, &i) == 0);
+}
+
+/* Move session to next window. */
+int
+session_next(struct session *s)
+{
+ struct window *w;
+
+ if (s->window == NULL)
+ return (-1);
+
+ w = window_next(&s->windows, s->window);
+ if (w == NULL)
+ return (-1);
+ s->window = w;
+ return (0);
+}
+
+/* Move session to previous window. */
+int
+session_previous(struct session *s)
+{
+ struct window *w;
+
+ if (s->window == NULL)
+ return (-1);
+
+ w = window_previous(&s->windows, s->window);
+ if (w == NULL)
+ return (-1);
+ s->window = w;
+ return (0);
+}
+
+/* Move session to specific window. */
+int
+session_select(struct session *s, u_int i)
+{
+ struct window *w;
+
+ w = window_at(&s->windows, i);
+ if (w == NULL)
+ return (-1);
+ s->window = w;
+ return (0);
+}