mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	|PatchSet 882
|Date: 2011/04/05 20:37:01 |Author: nicm |Branch: HEAD |Tag: (none) |Log: |Add a flag to cmd_find_session so that attach-session can prefer |unattached sessions when choosing the most recently used (if -t is not |given). Suggested by claudio@.
This commit is contained in:
		
							
								
								
									
										34
									
								
								cmd.c
									
									
									
									
									
								
							
							
						
						
									
										34
									
								
								cmd.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: cmd.c,v 1.150 2011-04-06 22:16:33 nicm Exp $ */
 | 
			
		||||
/* $Id: cmd.c,v 1.151 2011-04-06 22:24:01 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -111,7 +111,7 @@ const struct cmd_entry *cmd_table[] = {
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct session	*cmd_choose_session_list(struct sessionslist *);
 | 
			
		||||
struct session	*cmd_choose_session(void);
 | 
			
		||||
struct session	*cmd_choose_session(int);
 | 
			
		||||
struct client	*cmd_choose_client(struct clients *);
 | 
			
		||||
struct client	*cmd_lookup_client(const char *);
 | 
			
		||||
struct session	*cmd_lookup_session(const char *, int *);
 | 
			
		||||
@@ -315,7 +315,7 @@ cmd_print(struct cmd *cmd, char *buf, size_t len)
 | 
			
		||||
 * session from all sessions.
 | 
			
		||||
 */
 | 
			
		||||
struct session *
 | 
			
		||||
cmd_current_session(struct cmd_ctx *ctx)
 | 
			
		||||
cmd_current_session(struct cmd_ctx *ctx, int prefer_unattached)
 | 
			
		||||
{
 | 
			
		||||
	struct msg_command_data	*data = ctx->msgdata;
 | 
			
		||||
	struct client		*c = ctx->cmdclient;
 | 
			
		||||
@@ -364,19 +364,25 @@ cmd_current_session(struct cmd_ctx *ctx)
 | 
			
		||||
			return (s);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return (cmd_choose_session());
 | 
			
		||||
	return (cmd_choose_session(prefer_unattached));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Find the most recently used session. */
 | 
			
		||||
/*
 | 
			
		||||
 * Find the most recently used session, preferring unattached if the flag is
 | 
			
		||||
 * set.
 | 
			
		||||
 */
 | 
			
		||||
struct session *
 | 
			
		||||
cmd_choose_session(void)
 | 
			
		||||
cmd_choose_session(int prefer_unattached)
 | 
			
		||||
{
 | 
			
		||||
	struct session	*s, *sbest;
 | 
			
		||||
	struct timeval	*tv = NULL;
 | 
			
		||||
 | 
			
		||||
	sbest = NULL;
 | 
			
		||||
	RB_FOREACH(s, sessions, &sessions) {
 | 
			
		||||
		if (tv == NULL || timercmp(&s->activity_time, tv, >)) {
 | 
			
		||||
		if (tv == NULL || timercmp(&s->activity_time, tv, >) ||
 | 
			
		||||
		    (prefer_unattached &&
 | 
			
		||||
		    !(sbest->flags & SESSION_UNATTACHED) &&
 | 
			
		||||
		    (s->flags & SESSION_UNATTACHED))) {
 | 
			
		||||
			sbest = s;
 | 
			
		||||
			tv = &s->activity_time;
 | 
			
		||||
		}
 | 
			
		||||
@@ -427,7 +433,7 @@ cmd_current_client(struct cmd_ctx *ctx)
 | 
			
		||||
	 * No current client set. Find the current session and return the
 | 
			
		||||
	 * newest of its clients.
 | 
			
		||||
	 */
 | 
			
		||||
	s = cmd_current_session(ctx);
 | 
			
		||||
	s = cmd_current_session(ctx, 0);
 | 
			
		||||
	if (s != NULL && !(s->flags & SESSION_UNATTACHED)) {
 | 
			
		||||
		ARRAY_INIT(&cc);
 | 
			
		||||
		for (i = 0; i < ARRAY_LENGTH(&clients); i++) {
 | 
			
		||||
@@ -670,7 +676,7 @@ cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
 | 
			
		||||
	struct winlink		*wl;
 | 
			
		||||
 | 
			
		||||
	/* If this pane is in the current session, return that winlink. */
 | 
			
		||||
	s = cmd_current_session(ctx);
 | 
			
		||||
	s = cmd_current_session(ctx, 0);
 | 
			
		||||
	if (s != NULL) {
 | 
			
		||||
		wl = winlink_find_by_window(&s->windows, wp->window);
 | 
			
		||||
		if (wl != NULL) {
 | 
			
		||||
@@ -695,7 +701,7 @@ cmd_pane_session(struct cmd_ctx *ctx, struct window_pane *wp,
 | 
			
		||||
 | 
			
		||||
/* Find the target session or report an error and return NULL. */
 | 
			
		||||
struct session *
 | 
			
		||||
cmd_find_session(struct cmd_ctx *ctx, const char *arg)
 | 
			
		||||
cmd_find_session(struct cmd_ctx *ctx, const char *arg, int prefer_unattached)
 | 
			
		||||
{
 | 
			
		||||
	struct session		*s;
 | 
			
		||||
	struct window_pane	*wp;
 | 
			
		||||
@@ -706,7 +712,7 @@ cmd_find_session(struct cmd_ctx *ctx, const char *arg)
 | 
			
		||||
 | 
			
		||||
	/* A NULL argument means the current session. */
 | 
			
		||||
	if (arg == NULL)
 | 
			
		||||
		return (cmd_current_session(ctx));
 | 
			
		||||
		return (cmd_current_session(ctx, prefer_unattached));
 | 
			
		||||
	tmparg = xstrdup(arg);
 | 
			
		||||
 | 
			
		||||
	/* Lookup as pane id. */
 | 
			
		||||
@@ -752,7 +758,7 @@ cmd_find_window(struct cmd_ctx *ctx, const char *arg, struct session **sp)
 | 
			
		||||
	 * Find the current session. There must always be a current session, if
 | 
			
		||||
	 * it can't be found, report an error.
 | 
			
		||||
	 */
 | 
			
		||||
	if ((s = cmd_current_session(ctx)) == NULL) {
 | 
			
		||||
	if ((s = cmd_current_session(ctx, 0)) == NULL) {
 | 
			
		||||
		ctx->error(ctx, "can't establish current session");
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	}
 | 
			
		||||
@@ -899,7 +905,7 @@ cmd_find_index(struct cmd_ctx *ctx, const char *arg, struct session **sp)
 | 
			
		||||
	 * Find the current session. There must always be a current session, if
 | 
			
		||||
	 * it can't be found, report an error.
 | 
			
		||||
	 */
 | 
			
		||||
	if ((s = cmd_current_session(ctx)) == NULL) {
 | 
			
		||||
	if ((s = cmd_current_session(ctx, 0)) == NULL) {
 | 
			
		||||
		ctx->error(ctx, "can't establish current session");
 | 
			
		||||
		return (-2);
 | 
			
		||||
	}
 | 
			
		||||
@@ -1053,7 +1059,7 @@ cmd_find_pane(struct cmd_ctx *ctx,
 | 
			
		||||
	u_int			 idx;
 | 
			
		||||
 | 
			
		||||
	/* Get the current session. */
 | 
			
		||||
	if ((s = cmd_current_session(ctx)) == NULL) {
 | 
			
		||||
	if ((s = cmd_current_session(ctx, 0)) == NULL) {
 | 
			
		||||
		ctx->error(ctx, "can't establish current session");
 | 
			
		||||
		return (NULL);
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user