aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cmd.c53
1 files changed, 46 insertions, 7 deletions
diff --git a/cmd.c b/cmd.c
index 9fda3dcc..820521d0 100644
--- a/cmd.c
+++ b/cmd.c
@@ -103,7 +103,7 @@ const struct cmd_entry *cmd_table[] = {
NULL
};
-struct session *cmd_newest_session(void);
+struct session *cmd_newest_session(struct sessions *);
struct client *cmd_lookup_client(const char *);
struct session *cmd_lookup_session(const char *, int *);
struct winlink *cmd_lookup_window(struct session *, const char *, int *);
@@ -281,18 +281,57 @@ cmd_print(struct cmd *cmd, char *buf, size_t len)
/*
* Figure out the current session. Use: 1) the current session, if the command
- * context has one; 2) the session specified in the TMUX variable from the
- * environment (as passed from the client); 3) the newest session.
+ * context has one; 2) the session containing the pty of the calling client, if
+ * any 3) the session specified in the TMUX variable from the environment (as
+ * passed from the client); 3) the newest session.
*/
struct session *
cmd_current_session(struct cmd_ctx *ctx)
{
struct msg_command_data *data = ctx->msgdata;
+ struct client *c = ctx->cmdclient;
struct session *s;
+ struct sessions ss;
+ struct winlink *wl;
+ struct window_pane *wp;
+ u_int i;
+ int found;
if (ctx->cursession != NULL)
return (ctx->cursession);
+ /*
+ * If the name of the calling client's pty is know, build a list of the
+ * sessions that contain it and if any choose either the first or the
+ * newest.
+ */
+ if (c != NULL && c->tty.path != NULL) {
+ ARRAY_INIT(&ss);
+ for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
+ if ((s = ARRAY_ITEM(&sessions, i)) == NULL)
+ continue;
+ found = 0;
+ RB_FOREACH(wl, winlinks, &s->windows) {
+ TAILQ_FOREACH(wp, &wl->window->panes, entry) {
+ if (strcmp(wp->tty, c->tty.path) == 0) {
+ found = 1;
+ break;
+ }
+ }
+ if (found)
+ break;
+ }
+ if (found)
+ ARRAY_ADD(&ss, s);
+ }
+
+ s = cmd_newest_session(&ss);
+ ARRAY_FREE(&ss);
+ if (s != NULL)
+ return (s);
+ }
+
+ /* Use the session from the TMUX environment variable. */
if (data != NULL && data->pid != -1) {
if (data->pid != getpid())
return (NULL);
@@ -303,20 +342,20 @@ cmd_current_session(struct cmd_ctx *ctx)
return (s);
}
- return (cmd_newest_session());
+ return (cmd_newest_session(&sessions));
}
/* Find the newest session. */
struct session *
-cmd_newest_session(void)
+cmd_newest_session(struct sessions *ss)
{
struct session *s, *snewest;
struct timeval *tv = NULL;
u_int i;
snewest = NULL;
- for (i = 0; i < ARRAY_LENGTH(&sessions); i++) {
- if ((s = ARRAY_ITEM(&sessions, i)) == NULL)
+ for (i = 0; i < ARRAY_LENGTH(ss); i++) {
+ if ((s = ARRAY_ITEM(ss, i)) == NULL)
continue;
if (tv == NULL || timercmp(&s->tv, tv, >)) {