aboutsummaryrefslogtreecommitdiff
path: root/server-client.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2009-11-08 23:24:59 +0000
committerTiago Cunha <tcunha@gmx.com>2009-11-08 23:24:59 +0000
commitac6092c27fa622671b7a83ec557ba09b5ff83e59 (patch)
tree97ec77d3305d88f2b8b815aaf6934e52fb6b0b49 /server-client.c
parent81336d6bb0684b3bce25f4f9de937c8959753ed8 (diff)
downloadrtmux-ac6092c27fa622671b7a83ec557ba09b5ff83e59.tar.gz
rtmux-ac6092c27fa622671b7a83ec557ba09b5ff83e59.tar.bz2
rtmux-ac6092c27fa622671b7a83ec557ba09b5ff83e59.zip
Sync OpenBSD patchset 507:
Convert the key repeat timer to an event.
Diffstat (limited to 'server-client.c')
-rw-r--r--server-client.c33
1 files changed, 22 insertions, 11 deletions
diff --git a/server-client.c b/server-client.c
index 862cd26f..8b4e37c4 100644
--- a/server-client.c
+++ b/server-client.c
@@ -1,4 +1,4 @@
-/* $Id: server-client.c,v 1.17 2009-11-08 23:12:35 tcunha Exp $ */
+/* $Id: server-client.c,v 1.18 2009-11-08 23:24:59 tcunha Exp $ */
/*
* Copyright (c) 2009 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -27,6 +27,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 *);
@@ -40,7 +41,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)
@@ -83,6 +83,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);
@@ -118,6 +120,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)
@@ -263,21 +267,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");
@@ -370,9 +370,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. */
@@ -411,6 +412,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)