version 1.133, 2022/03/08 18:31:46 |
version 1.134, 2023/09/01 13:48:54 |
|
|
|
|
#include "tmux.h" |
#include "tmux.h" |
|
|
static struct session *server_next_session(struct session *); |
static void server_destroy_session_group(struct session *); |
static void server_destroy_session_group(struct session *); |
|
|
|
void |
void |
server_redraw_client(struct client *c) |
server_redraw_client(struct client *c) |
|
|
if (session_detach(s, wl)) { |
if (session_detach(s, wl)) { |
server_destroy_session_group(s); |
server_destroy_session_group(s); |
break; |
break; |
} else |
} |
server_redraw_session_group(s); |
server_redraw_session_group(s); |
} |
} |
|
|
if (renumber) |
if (renumber) |
|
|
struct session_group *sg; |
struct session_group *sg; |
struct session *s1; |
struct session *s1; |
|
|
if ((sg = session_group_contains(s)) == NULL) |
if ((sg = session_group_contains(s)) == NULL) { |
server_destroy_session(s); |
server_destroy_session(s); |
else { |
session_destroy(s, 1, __func__); |
|
} else { |
TAILQ_FOREACH_SAFE(s, &sg->sessions, gentry, s1) { |
TAILQ_FOREACH_SAFE(s, &sg->sessions, gentry, s1) { |
server_destroy_session(s); |
server_destroy_session(s); |
session_destroy(s, 1, __func__); |
session_destroy(s, 1, __func__); |
|
|
} |
} |
|
|
static struct session * |
static struct session * |
server_next_session(struct session *s) |
server_find_session(struct session *s, |
|
int (*f)(struct session *, struct session *)) |
{ |
{ |
struct session *s_loop, *s_out = NULL; |
struct session *s_loop, *s_out = NULL; |
|
|
RB_FOREACH(s_loop, sessions, &sessions) { |
RB_FOREACH(s_loop, sessions, &sessions) { |
if (s_loop == s) |
if (s_loop != s && (s_out == NULL || f(s_loop, s_out))) |
continue; |
|
if (s_out == NULL || |
|
timercmp(&s_loop->activity_time, &s_out->activity_time, <)) |
|
s_out = s_loop; |
s_out = s_loop; |
} |
} |
return (s_out); |
return (s_out); |
} |
} |
|
|
static struct session * |
static int |
server_next_detached_session(struct session *s) |
server_newer_session(struct session *s_loop, struct session *s_out) |
{ |
{ |
struct session *s_loop, *s_out = NULL; |
return (timercmp(&s_loop->activity_time, &s_out->activity_time, <)); |
|
} |
|
|
RB_FOREACH(s_loop, sessions, &sessions) { |
static int |
if (s_loop == s || s_loop->attached) |
server_newer_detached_session(struct session *s_loop, struct session *s_out) |
continue; |
{ |
if (s_out == NULL || |
if (s_loop->attached) |
timercmp(&s_loop->activity_time, &s_out->activity_time, <)) |
return (0); |
s_out = s_loop; |
return (server_newer_session(s_loop, s_out)); |
} |
|
return (s_out); |
|
} |
} |
|
|
void |
void |
server_destroy_session(struct session *s) |
server_destroy_session(struct session *s) |
{ |
{ |
struct client *c; |
struct client *c; |
struct session *s_new; |
struct session *s_new = NULL; |
int detach_on_destroy; |
int detach_on_destroy; |
|
|
detach_on_destroy = options_get_number(s->options, "detach-on-destroy"); |
detach_on_destroy = options_get_number(s->options, "detach-on-destroy"); |
if (detach_on_destroy == 0) |
if (detach_on_destroy == 0) |
s_new = server_next_session(s); |
s_new = server_find_session(s, server_newer_session); |
else if (detach_on_destroy == 2) |
else if (detach_on_destroy == 2) |
s_new = server_next_detached_session(s); |
s_new = server_find_session(s, server_newer_detached_session); |
else |
else if (detach_on_destroy == 3) |
|
s_new = session_previous_session(s); |
|
else if (detach_on_destroy == 4) |
|
s_new = session_next_session(s); |
|
if (s_new == s) |
s_new = NULL; |
s_new = NULL; |
TAILQ_FOREACH(c, &clients, entry) { |
TAILQ_FOREACH(c, &clients, entry) { |
if (c->session != s) |
if (c->session != s) |
continue; |
continue; |
|
c->session = NULL; |
|
c->last_session = NULL; |
server_client_set_session(c, s_new); |
server_client_set_session(c, s_new); |
if (s_new == NULL) |
if (s_new == NULL) |
c->flags |= CLIENT_EXIT; |
c->flags |= CLIENT_EXIT; |