mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	Track the last session for a client and add a flag to switch-client and
a key binding (L) to move a client back to its last session.
This commit is contained in:
		@@ -36,13 +36,14 @@ size_t	cmd_switch_client_print(struct cmd *, char *, size_t);
 | 
			
		||||
struct cmd_switch_client_data {
 | 
			
		||||
	char	*name;
 | 
			
		||||
	char	*target;
 | 
			
		||||
	int      flag_last;
 | 
			
		||||
	int	 flag_next;
 | 
			
		||||
	int	 flag_previous;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
const struct cmd_entry cmd_switch_client_entry = {
 | 
			
		||||
	"switch-client", "switchc",
 | 
			
		||||
	"[-np] [-c target-client] [-t target-session]",
 | 
			
		||||
	"[-lnp] [-c target-client] [-t target-session]",
 | 
			
		||||
	0, "",
 | 
			
		||||
	cmd_switch_client_init,
 | 
			
		||||
	cmd_switch_client_parse,
 | 
			
		||||
@@ -59,6 +60,7 @@ cmd_switch_client_init(struct cmd *self, int key)
 | 
			
		||||
	self->data = data = xmalloc(sizeof *data);
 | 
			
		||||
	data->name = NULL;
 | 
			
		||||
	data->target = NULL;
 | 
			
		||||
	data->flag_last = 0;
 | 
			
		||||
	data->flag_next = 0;
 | 
			
		||||
	data->flag_previous = 0;
 | 
			
		||||
 | 
			
		||||
@@ -69,6 +71,9 @@ cmd_switch_client_init(struct cmd *self, int key)
 | 
			
		||||
	case ')':
 | 
			
		||||
		data->flag_next = 1;
 | 
			
		||||
		break;
 | 
			
		||||
	case 'L':
 | 
			
		||||
		data->flag_last = 1;
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -81,28 +86,36 @@ cmd_switch_client_parse(struct cmd *self, int argc, char **argv, char **cause)
 | 
			
		||||
	self->entry->init(self, KEYC_NONE);
 | 
			
		||||
	data = self->data;
 | 
			
		||||
 | 
			
		||||
	while ((opt = getopt(argc, argv, "c:t:")) != -1) {
 | 
			
		||||
	while ((opt = getopt(argc, argv, "c:lnpt:")) != -1) {
 | 
			
		||||
		switch (opt) {
 | 
			
		||||
		case 'c':
 | 
			
		||||
			if (data->name == NULL)
 | 
			
		||||
				data->name = xstrdup(optarg);
 | 
			
		||||
			break;
 | 
			
		||||
		case 'l':
 | 
			
		||||
			if (data->flag_next || data->flag_previous ||
 | 
			
		||||
			    data->target != NULL)
 | 
			
		||||
				goto usage;
 | 
			
		||||
			data->flag_last = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'n':
 | 
			
		||||
			if (data->flag_previous || data->flag_last ||
 | 
			
		||||
			    data->target != NULL)
 | 
			
		||||
				goto usage;
 | 
			
		||||
			data->flag_next = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'p':
 | 
			
		||||
			if (data->flag_next || data->flag_last ||
 | 
			
		||||
			    data->target != NULL)
 | 
			
		||||
				goto usage;
 | 
			
		||||
			data->flag_next = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		case 't':
 | 
			
		||||
			if (data->flag_next || data->flag_previous)
 | 
			
		||||
				goto usage;
 | 
			
		||||
			if (data->target == NULL)
 | 
			
		||||
				data->target = xstrdup(optarg);
 | 
			
		||||
			break;
 | 
			
		||||
		case 'n':
 | 
			
		||||
			if (data->flag_previous || data->target != NULL)
 | 
			
		||||
				goto usage;
 | 
			
		||||
			data->flag_next = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		case 'p':
 | 
			
		||||
			if (data->flag_next || data->target != NULL)
 | 
			
		||||
				goto usage;
 | 
			
		||||
			data->flag_next = 1;
 | 
			
		||||
			break;
 | 
			
		||||
		default:
 | 
			
		||||
			goto usage;
 | 
			
		||||
		}
 | 
			
		||||
@@ -134,6 +147,7 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
	if ((c = cmd_find_client(ctx, data->name)) == NULL)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	s = NULL;
 | 
			
		||||
	if (data->flag_next) {
 | 
			
		||||
		if ((s = session_next_session(c->session)) == NULL) {
 | 
			
		||||
			ctx->error(ctx, "can't find next session");
 | 
			
		||||
@@ -144,11 +158,21 @@ cmd_switch_client_exec(struct cmd *self, struct cmd_ctx *ctx)
 | 
			
		||||
			ctx->error(ctx, "can't find previous session");
 | 
			
		||||
			return (-1);
 | 
			
		||||
		}
 | 
			
		||||
	} else if (data->flag_last) {
 | 
			
		||||
		if (c->last_session != UINT_MAX &&
 | 
			
		||||
		    c->last_session < ARRAY_LENGTH(&sessions))
 | 
			
		||||
			s = ARRAY_ITEM(&sessions, c->last_session);
 | 
			
		||||
		if (s == NULL) {
 | 
			
		||||
			ctx->error(ctx, "can't find last session");
 | 
			
		||||
			return (-1);
 | 
			
		||||
		}
 | 
			
		||||
	} else
 | 
			
		||||
		s = cmd_find_session(ctx, data->target);
 | 
			
		||||
 | 
			
		||||
	if (s == NULL)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	if (c->session != NULL)
 | 
			
		||||
		session_index(c->session, &c->last_session);
 | 
			
		||||
	c->session = s;
 | 
			
		||||
 | 
			
		||||
	recalculate_sizes();
 | 
			
		||||
@@ -179,6 +203,8 @@ cmd_switch_client_print(struct cmd *self, char *buf, size_t len)
 | 
			
		||||
	off += xsnprintf(buf, len, "%s", self->entry->name);
 | 
			
		||||
	if (data == NULL)
 | 
			
		||||
		return (off);
 | 
			
		||||
	if (off < len && data->flag_last)
 | 
			
		||||
		off += xsnprintf(buf + off, len - off, "%s", " -l");
 | 
			
		||||
	if (off < len && data->flag_next)
 | 
			
		||||
		off += xsnprintf(buf + off, len - off, "%s", " -n");
 | 
			
		||||
	if (off < len && data->flag_previous)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user