If $TMUX is set, and we are unsure about the session, use it.
authornicm <nicm@openbsd.org>
Fri, 23 Oct 2015 16:29:07 +0000 (16:29 +0000)
committernicm <nicm@openbsd.org>
Fri, 23 Oct 2015 16:29:07 +0000 (16:29 +0000)
usr.bin/tmux/cmd-find.c

index d6c2399..1a7be8a 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd-find.c,v 1.14 2015/10/22 11:23:00 nicm Exp $ */
+/* $OpenBSD: cmd-find.c,v 1.15 2015/10/23 16:29:07 nicm Exp $ */
 
 /*
  * Copyright (c) 2015 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <paths.h>
+#include <unistd.h>
 
 #include "tmux.h"
 
@@ -51,6 +52,7 @@ struct cmd_find_state {
        int                      idx;
 };
 
+struct session *cmd_find_try_TMUX(struct client *, struct window *);
 int             cmd_find_client_better(struct client *, struct client *);
 struct client  *cmd_find_best_client(struct client **, u_int);
 int             cmd_find_session_better(struct session *, struct session *,
@@ -109,6 +111,33 @@ const char *cmd_find_pane_table[][2] = {
        { NULL, NULL }
 };
 
+/* Get session from TMUX if present. */
+struct session *
+cmd_find_try_TMUX(struct client *c, struct window *w)
+{
+       struct environ_entry    *envent;
+       char                     tmp[256];
+       long long                pid;
+       u_int                    session;
+       struct session          *s;
+
+       envent = environ_find(&c->environ, "TMUX");
+       if (envent == NULL)
+               return (NULL);
+
+       if (sscanf(envent->value, "%255[^,],%lld,%d", tmp, &pid, &session) != 3)
+               return (NULL);
+       if (pid != getpid())
+               return (NULL);
+       log_debug("client %d TMUX is %s (session @%u)", c->ibuf.fd,
+           envent->value, session);
+
+       s = session_find_by_id(session);
+       if (s == NULL || (w != NULL && !session_has(s, w)))
+               return (NULL);
+       return (s);
+}
+
 /* Is this client better? */
 int
 cmd_find_client_better(struct client *c, struct client *than)
@@ -192,6 +221,12 @@ cmd_find_best_session_with_window(struct cmd_find_state *fs)
        u_int             ssize;
        struct session   *s;
 
+       if (fs->cmdq->client != NULL) {
+               fs->s = cmd_find_try_TMUX(fs->cmdq->client, fs->w);
+               if (fs->s != NULL)
+                       return (cmd_find_best_winlink_with_window(fs));
+       }
+
        ssize = 0;
        RB_FOREACH(s, sessions, &sessions) {
                if (!session_has(s, fs->w))
@@ -277,7 +312,9 @@ cmd_find_current_session_with_client(struct cmd_find_state *fs)
        return (0);
 
 unknown_pane:
-       fs->s = cmd_find_best_session(NULL, 0, fs->flags);
+       fs->s = cmd_find_try_TMUX(fs->cmdq->client, NULL);
+       if (fs->s == NULL)
+               fs->s = cmd_find_best_session(NULL, 0, fs->flags);
        if (fs->s == NULL)
                return (-1);
        fs->wl = fs->s->curw;