diff options
author | Nicholas Marriott <nicm@openbsd.org> | 2009-11-05 00:05:00 +0000 |
---|---|---|
committer | Nicholas Marriott <nicm@openbsd.org> | 2009-11-05 00:05:00 +0000 |
commit | 80444436f36724cc8ef306391b5b18be604109c8 (patch) | |
tree | e5f966268ebee00a455e410c7c34fd2860e2be68 /server-client.c | |
parent | 44d6a2c435ab68df25ed7b14473e6f69870e8a9a (diff) | |
download | rtmux-80444436f36724cc8ef306391b5b18be604109c8.tar.gz rtmux-80444436f36724cc8ef306391b5b18be604109c8.tar.bz2 rtmux-80444436f36724cc8ef306391b5b18be604109c8.zip |
Convert the key repeat timer to an event.
Diffstat (limited to 'server-client.c')
-rw-r--r-- | server-client.c | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/server-client.c b/server-client.c index f44dc02c..5c15d502 100644 --- a/server-client.c +++ b/server-client.c @@ -28,6 +28,7 @@ #include "tmux.h" void server_client_handle_data(struct client *); +void server_client_repeat_timer(int, short, void *); void server_client_check_redraw(struct client *); void server_client_set_title(struct client *); @@ -41,7 +42,6 @@ void printflike2 server_client_msg_error(struct cmd_ctx *, const char *, ...); void printflike2 server_client_msg_print(struct cmd_ctx *, const char *, ...); void printflike2 server_client_msg_info(struct cmd_ctx *, const char *, ...); - /* Create a new client. */ void server_client_create(int fd) @@ -84,6 +84,8 @@ server_client_create(int fd) c->prompt_buffer = NULL; c->prompt_index = 0; + evtimer_set(&c->repeat_timer, server_client_repeat_timer, c); + for (i = 0; i < ARRAY_LENGTH(&clients); i++) { if (ARRAY_ITEM(&clients, i) == NULL) { ARRAY_SET(&clients, i, c); @@ -119,6 +121,8 @@ server_client_lost(struct client *c) if (c->title != NULL) xfree(c->title); + evtimer_del(&c->repeat_timer); + evtimer_del(&c->identify_timer); if (c->message_string != NULL) @@ -264,21 +268,17 @@ server_client_handle_data(struct client *c) struct window_pane *wp; struct screen *s; struct options *oo; - struct timeval tv_add, tv_now; + struct timeval tv, 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. */ + /* Get the time for the activity timer. */ 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 (timercmp(&tv_now, &c->repeat_timer, >)) - c->flags &= ~(CLIENT_PREFIX|CLIENT_REPEAT); - } /* Process keys. */ keylist = options_get_data(&c->session->options, "prefix"); @@ -371,9 +371,10 @@ server_client_handle_data(struct client *c) if (xtimeout != 0 && bd->can_repeat) { c->flags |= CLIENT_PREFIX|CLIENT_REPEAT; - tv_add.tv_sec = xtimeout / 1000; - tv_add.tv_usec = (xtimeout % 1000) * 1000L; - timeradd(&tv_now, &tv_add, &c->repeat_timer); + tv.tv_sec = xtimeout / 1000; + tv.tv_usec = (xtimeout % 1000) * 1000L; + evtimer_del(&c->repeat_timer); + evtimer_add(&c->repeat_timer, &tv); } /* Dispatch the command. */ @@ -412,6 +413,16 @@ server_client_handle_data(struct client *c) tty_reset(&c->tty); } +/* Repeat time callback. */ +void +server_client_repeat_timer(unused int fd, unused short events, void *data) +{ + struct client *c = data; + + if (c->flags & CLIENT_REPEAT) + c->flags &= ~(CLIENT_PREFIX|CLIENT_REPEAT); +} + /* Check for client redraws. */ void server_client_check_redraw(struct client *c) |