mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	-a flags to next/previous window.
This commit is contained in:
		
							
								
								
									
										54
									
								
								session.c
									
									
									
									
									
								
							
							
						
						
									
										54
									
								
								session.c
									
									
									
									
									
								
							@@ -1,4 +1,4 @@
 | 
			
		||||
/* $Id: session.c,v 1.50 2009-01-12 18:22:47 nicm Exp $ */
 | 
			
		||||
/* $Id: session.c,v 1.51 2009-01-18 18:31:45 nicm Exp $ */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
 | 
			
		||||
@@ -28,6 +28,9 @@
 | 
			
		||||
/* Global session list. */
 | 
			
		||||
struct sessions	sessions;
 | 
			
		||||
 | 
			
		||||
struct winlink *session_next_activity(struct session *, struct winlink *);
 | 
			
		||||
struct winlink *session_previous_activity(struct session *, struct winlink *);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
session_alert_cancel(struct session *s, struct winlink *wl)
 | 
			
		||||
{
 | 
			
		||||
@@ -225,8 +228,9 @@ session_attach(struct session *s, struct window *w, int idx)
 | 
			
		||||
int
 | 
			
		||||
session_detach(struct session *s, struct winlink *wl)
 | 
			
		||||
{
 | 
			
		||||
	if (s->curw == wl && session_last(s) != 0 && session_previous(s) != 0)
 | 
			
		||||
		session_next(s);
 | 
			
		||||
	if (s->curw == wl &&
 | 
			
		||||
	    session_last(s) != 0 && session_previous(s, 0) != 0)
 | 
			
		||||
		session_next(s, 0);
 | 
			
		||||
 | 
			
		||||
	session_alert_cancel(s, wl);
 | 
			
		||||
	winlink_stack_remove(&s->lastw, wl);
 | 
			
		||||
@@ -251,9 +255,22 @@ session_has(struct session *s, struct window *w)
 | 
			
		||||
	return (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct winlink *
 | 
			
		||||
session_next_activity(struct session *s, struct winlink *wl)
 | 
			
		||||
{
 | 
			
		||||
	while (wl != NULL) {
 | 
			
		||||
		if (session_alert_has(s, wl, WINDOW_BELL))
 | 
			
		||||
			break;
 | 
			
		||||
		if (session_alert_has(s, wl, WINDOW_ACTIVITY))
 | 
			
		||||
			break;
 | 
			
		||||
		wl = winlink_next(&s->windows, wl);
 | 
			
		||||
	}
 | 
			
		||||
	return (wl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Move session to next window. */
 | 
			
		||||
int
 | 
			
		||||
session_next(struct session *s)
 | 
			
		||||
session_next(struct session *s, int activity)
 | 
			
		||||
{
 | 
			
		||||
	struct winlink	*wl;
 | 
			
		||||
 | 
			
		||||
@@ -261,8 +278,13 @@ session_next(struct session *s)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	wl = winlink_next(&s->windows, s->curw);
 | 
			
		||||
	if (wl == NULL)
 | 
			
		||||
	if (activity)
 | 
			
		||||
		wl = session_next_activity(s, wl);
 | 
			
		||||
	if (wl == NULL) {
 | 
			
		||||
		wl = RB_MIN(winlinks, &s->windows);
 | 
			
		||||
		if (activity && ((wl = session_next_activity(s, wl)) == NULL))
 | 
			
		||||
			return (-1);
 | 
			
		||||
	}
 | 
			
		||||
	if (wl == s->curw)
 | 
			
		||||
		return (1);
 | 
			
		||||
	winlink_stack_remove(&s->lastw, wl);
 | 
			
		||||
@@ -272,9 +294,22 @@ session_next(struct session *s)
 | 
			
		||||
	return (0);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct winlink *
 | 
			
		||||
session_previous_activity(struct session *s, struct winlink *wl)
 | 
			
		||||
{
 | 
			
		||||
	while (wl != NULL) {
 | 
			
		||||
		if (session_alert_has(s, wl, WINDOW_BELL))
 | 
			
		||||
			break;
 | 
			
		||||
		if (session_alert_has(s, wl, WINDOW_ACTIVITY))
 | 
			
		||||
			break;
 | 
			
		||||
		wl = winlink_previous(&s->windows, wl);
 | 
			
		||||
	}
 | 
			
		||||
	return (wl);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* Move session to previous window. */
 | 
			
		||||
int
 | 
			
		||||
session_previous(struct session *s)
 | 
			
		||||
session_previous(struct session *s, int activity)
 | 
			
		||||
{
 | 
			
		||||
	struct winlink	*wl;
 | 
			
		||||
 | 
			
		||||
@@ -282,8 +317,13 @@ session_previous(struct session *s)
 | 
			
		||||
		return (-1);
 | 
			
		||||
 | 
			
		||||
	wl = winlink_previous(&s->windows, s->curw);
 | 
			
		||||
	if (wl == NULL)
 | 
			
		||||
	if (activity)
 | 
			
		||||
		wl = session_previous_activity(s, wl);
 | 
			
		||||
	if (wl == NULL) {
 | 
			
		||||
		wl = RB_MAX(winlinks, &s->windows);
 | 
			
		||||
		if (activity && (wl = session_previous_activity(s, wl)) == NULL)
 | 
			
		||||
			return (-1);
 | 
			
		||||
	}
 | 
			
		||||
	if (wl == s->curw)
 | 
			
		||||
		return (1);
 | 
			
		||||
	winlink_stack_remove(&s->lastw, wl);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user