mirror of
https://github.com/tmux/tmux.git
synced 2025-01-08 08:58:47 +00:00
Adjust latest client when a client detaches, GitHub issue 2657.
This commit is contained in:
parent
a11aa870b3
commit
a25af7d0f3
@ -43,6 +43,7 @@ static void server_client_check_modes(struct client *);
|
|||||||
static void server_client_set_title(struct client *);
|
static void server_client_set_title(struct client *);
|
||||||
static void server_client_reset_state(struct client *);
|
static void server_client_reset_state(struct client *);
|
||||||
static int server_client_assume_paste(struct session *);
|
static int server_client_assume_paste(struct session *);
|
||||||
|
static void server_client_update_latest(struct client *);
|
||||||
|
|
||||||
static void server_client_dispatch(struct imsg *, void *);
|
static void server_client_dispatch(struct imsg *, void *);
|
||||||
static void server_client_dispatch_command(struct client *, struct imsg *);
|
static void server_client_dispatch_command(struct client *, struct imsg *);
|
||||||
@ -271,6 +272,40 @@ server_client_open(struct client *c, char **cause)
|
|||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Lost an attached client. */
|
||||||
|
static void
|
||||||
|
server_client_attached_lost(struct client *c)
|
||||||
|
{
|
||||||
|
struct session *s = c->session;
|
||||||
|
struct window *w;
|
||||||
|
struct client *loop;
|
||||||
|
struct client *found;
|
||||||
|
|
||||||
|
log_debug("lost attached client %p", c);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* By this point the session in the client has been cleared so walk all
|
||||||
|
* windows to find any with this client as the latest.
|
||||||
|
*/
|
||||||
|
RB_FOREACH(w, windows, &windows) {
|
||||||
|
if (w->latest != c)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
found = NULL;
|
||||||
|
TAILQ_FOREACH(loop, &clients, entry) {
|
||||||
|
s = loop->session;
|
||||||
|
if (loop == c || s == NULL || s->curw->window != w)
|
||||||
|
continue;
|
||||||
|
if (found == NULL ||
|
||||||
|
timercmp(&loop->activity_time, &found->activity_time,
|
||||||
|
>))
|
||||||
|
found = loop;
|
||||||
|
}
|
||||||
|
if (found != NULL)
|
||||||
|
server_client_update_latest(found);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Lost a client. */
|
/* Lost a client. */
|
||||||
void
|
void
|
||||||
server_client_lost(struct client *c)
|
server_client_lost(struct client *c)
|
||||||
@ -296,8 +331,10 @@ server_client_lost(struct client *c)
|
|||||||
TAILQ_REMOVE(&clients, c, entry);
|
TAILQ_REMOVE(&clients, c, entry);
|
||||||
log_debug("lost client %p", c);
|
log_debug("lost client %p", c);
|
||||||
|
|
||||||
if (c->flags & CLIENT_ATTACHED)
|
if (c->flags & CLIENT_ATTACHED) {
|
||||||
|
server_client_attached_lost(c);
|
||||||
notify_client("client-detached", c);
|
notify_client("client-detached", c);
|
||||||
|
}
|
||||||
|
|
||||||
if (c->flags & CLIENT_CONTROL)
|
if (c->flags & CLIENT_CONTROL)
|
||||||
control_stop(c);
|
control_stop(c);
|
||||||
|
Loading…
Reference in New Issue
Block a user