diff --git a/cmd-list-sessions.c b/cmd-list-sessions.c index e6be3bbc..95db9b8e 100644 --- a/cmd-list-sessions.c +++ b/cmd-list-sessions.c @@ -1,4 +1,4 @@ -/* $Id: cmd-list-sessions.c,v 1.22 2009-10-11 23:38:16 tcunha Exp $ */ +/* $Id: cmd-list-sessions.c,v 1.23 2009-11-04 22:42:31 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -61,7 +61,7 @@ cmd_list_sessions_exec(unused struct cmd *self, struct cmd_ctx *ctx) xsnprintf(tmp, sizeof tmp, " (group %u)", idx); } - t = s->tv.tv_sec; + t = s->creation_time.tv_sec; tim = ctime(&t); *strchr(tim, '\n') = '\0'; diff --git a/cmd-server-info.c b/cmd-server-info.c index 90c3bf60..3f4bac13 100644 --- a/cmd-server-info.c +++ b/cmd-server-info.c @@ -1,4 +1,4 @@ -/* $Id: cmd-server-info.c,v 1.32 2009-11-02 21:38:26 tcunha Exp $ */ +/* $Id: cmd-server-info.c,v 1.33 2009-11-04 22:42:31 tcunha Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -105,7 +105,7 @@ cmd_server_info_exec(unused struct cmd *self, struct cmd_ctx *ctx) if (s == NULL) continue; - t = s->tv.tv_sec; + t = s->creation_time.tv_sec; tim = ctime(&t); *strchr(tim, '\n') = '\0'; diff --git a/cmd.c b/cmd.c index 0b8e46d6..fd76db3b 100644 --- a/cmd.c +++ b/cmd.c @@ -1,4 +1,4 @@ -/* $Id: cmd.c,v 1.127 2009-11-02 21:42:27 tcunha Exp $ */ +/* $Id: cmd.c,v 1.128 2009-11-04 22:42:31 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -361,9 +361,9 @@ cmd_newest_session(struct sessions *ss) if ((s = ARRAY_ITEM(ss, i)) == NULL) continue; - if (tv == NULL || timercmp(&s->tv, tv, >)) { + if (tv == NULL || timercmp(&s->creation_time, tv, >)) { snewest = s; - tv = &s->tv; + tv = &s->creation_time; } } @@ -385,9 +385,9 @@ cmd_newest_client(void) if (c->session == NULL) continue; - if (tv == NULL || timercmp(&c->tv, tv, >)) { + if (tv == NULL || timercmp(&c->creation_time, tv, >)) { cnewest = c; - tv = &c->tv; + tv = &c->creation_time; } } diff --git a/server-client.c b/server-client.c index 9acfa4c9..5a4aff18 100644 --- a/server-client.c +++ b/server-client.c @@ -1,4 +1,4 @@ -/* $Id: server-client.c,v 1.10 2009-10-28 23:14:15 tcunha Exp $ */ +/* $Id: server-client.c,v 1.11 2009-11-04 22:42:31 tcunha Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -60,7 +60,7 @@ server_client_create(int fd) c->references = 0; imsg_init(&c->ibuf, fd); - if (gettimeofday(&c->tv, NULL) != 0) + if (gettimeofday(&c->creation_time, NULL) != 0) fatal("gettimeofday failed"); ARRAY_INIT(&c->prompt_hdata); @@ -260,18 +260,19 @@ server_client_handle_data(struct client *c) struct window_pane *wp; struct screen *s; struct options *oo; - struct timeval tv; + struct timeval tv_add, tv_now; struct key_binding *bd; struct keylist *keylist; struct mouse_event mouse; int key, status, xtimeout, mode, isprefix; u_int i; + /* Check and update repeat flag. */ + if (gettimeofday(&tv_now, NULL) != 0) + fatal("gettimeofday failed"); xtimeout = options_get_number(&c->session->options, "repeat-time"); if (xtimeout != 0 && c->flags & CLIENT_REPEAT) { - if (gettimeofday(&tv, NULL) != 0) - fatal("gettimeofday failed"); - if (timercmp(&tv, &c->repeat_timer, >)) + if (timercmp(&tv_now, &c->repeat_timer, >)) c->flags &= ~(CLIENT_PREFIX|CLIENT_REPEAT); } @@ -280,12 +281,14 @@ server_client_handle_data(struct client *c) while (tty_keys_next(&c->tty, &key, &mouse) == 0) { if (c->session == NULL) return; - - c->session->activity = time(NULL); w = c->session->curw->window; wp = w->active; /* could die */ oo = &c->session->options; + /* Update activity timer. */ + memcpy(&c->session->activity_time, + &tv_now, sizeof c->session->activity_time); + /* Special case: number keys jump to pane in identify mode. */ if (c->flags & CLIENT_IDENTIFY && key >= '0' && key <= '9') { wp = window_pane_at_index(w, key - '0'); @@ -363,11 +366,9 @@ server_client_handle_data(struct client *c) if (xtimeout != 0 && bd->can_repeat) { c->flags |= CLIENT_PREFIX|CLIENT_REPEAT; - tv.tv_sec = xtimeout / 1000; - tv.tv_usec = (xtimeout % 1000) * 1000L; - if (gettimeofday(&c->repeat_timer, NULL) != 0) - fatal("gettimeofday failed"); - timeradd(&c->repeat_timer, &tv, &c->repeat_timer); + tv_add.tv_sec = xtimeout / 1000; + tv_add.tv_usec = (xtimeout % 1000) * 1000L; + timeradd(&tv_now, &tv_add, &c->repeat_timer); } /* Dispatch the command. */ @@ -580,11 +581,14 @@ server_client_msg_dispatch(struct client *c) if (!(c->flags & CLIENT_SUSPENDED)) break; c->flags &= ~CLIENT_SUSPENDED; + + if (c->session != NULL && + gettimeofday(&c->session->activity_time, NULL) != 0) + fatal("gettimeofday failed"); + tty_start_tty(&c->tty); server_redraw_client(c); recalculate_sizes(); - if (c->session != NULL) - c->session->activity = time(NULL); break; case MSG_ENVIRON: if (datalen != sizeof environdata) @@ -664,9 +668,6 @@ server_client_msg_command(struct client *c, struct msg_command_data *data) int argc; char **argv, *cause; - if (c->session != NULL) - c->session->activity = time(NULL); - ctx.error = server_client_msg_error; ctx.print = server_client_msg_print; ctx.info = server_client_msg_info; diff --git a/server.c b/server.c index bea6f5d7..8df12e56 100644 --- a/server.c +++ b/server.c @@ -1,4 +1,4 @@ -/* $Id: server.c,v 1.215 2009-11-02 21:39:34 tcunha Exp $ */ +/* $Id: server.c,v 1.216 2009-11-04 22:42:31 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -568,12 +568,13 @@ server_lock_server(void) continue; if (s->flags & SESSION_UNATTACHED) { - s->activity = time(NULL); + if (gettimeofday(&s->activity_time, NULL) != 0) + fatal("gettimeofday failed"); continue; } timeout = options_get_number(&s->options, "lock-after-time"); - if (timeout <= 0 || t <= s->activity + timeout) + if (timeout <= 0 || t <= s->activity_time.tv_sec + timeout) return; /* not timed out */ } @@ -596,12 +597,13 @@ server_lock_sessions(void) continue; if (s->flags & SESSION_UNATTACHED) { - s->activity = time(NULL); + if (gettimeofday(&s->activity_time, NULL) != 0) + fatal("gettimeofday failed"); continue; } timeout = options_get_number(&s->options, "lock-after-time"); - if (timeout > 0 && t > s->activity + timeout) { + if (timeout > 0 && t > s->activity_time.tv_sec + timeout) { server_lock_session(s); recalculate_sizes(); } diff --git a/session.c b/session.c index e4f5055c..6d78f891 100644 --- a/session.c +++ b/session.c @@ -1,4 +1,4 @@ -/* $Id: session.c,v 1.69 2009-10-11 23:38:16 tcunha Exp $ */ +/* $Id: session.c,v 1.70 2009-11-04 22:42:31 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -125,10 +125,10 @@ session_create(const char *name, const char *cmd, const char *cwd, s = xmalloc(sizeof *s); s->references = 0; s->flags = 0; - s->activity = time(NULL); - if (gettimeofday(&s->tv, NULL) != 0) + if (gettimeofday(&s->creation_time, NULL) != 0) fatal("gettimeofday failed"); + memcpy(&s->activity_time, &s->creation_time, sizeof s->activity_time); s->curw = NULL; TAILQ_INIT(&s->lastw); diff --git a/tmux.h b/tmux.h index 52fd2a65..dcda730b 100644 --- a/tmux.h +++ b/tmux.h @@ -1,4 +1,4 @@ -/* $Id: tmux.h,v 1.493 2009-11-04 22:39:20 tcunha Exp $ */ +/* $Id: tmux.h,v 1.494 2009-11-04 22:42:31 tcunha Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -920,8 +920,9 @@ TAILQ_HEAD(session_groups, session_group); struct session { char *name; - struct timeval tv; - time_t activity; + + struct timeval creation_time; + struct timeval activity_time; u_int sx; u_int sy; @@ -1059,7 +1060,8 @@ struct mouse_event { /* Client connection. */ struct client { struct imsgbuf ibuf; - struct timeval tv; + + struct timeval creation_time; struct environ environ;