From 55145f68bcab7fa0baba55fec5f1db41ad991a4c Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Mon, 30 Nov 2009 16:44:04 +0000 Subject: Handle partial xterm function key sequences. --- usr.bin/tmux/tmux.h | 4 ++-- usr.bin/tmux/tty-keys.c | 11 +++++++---- usr.bin/tmux/xterm-keys.c | 39 ++++++++++++++++++++++++++------------- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h index 24c6354b701..efa93868ba1 100644 --- a/usr.bin/tmux/tmux.h +++ b/usr.bin/tmux/tmux.h @@ -1,4 +1,4 @@ -/* $OpenBSD: tmux.h,v 1.188 2009/11/26 23:13:47 nicm Exp $ */ +/* $OpenBSD: tmux.h,v 1.189 2009/11/30 16:44:03 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1647,7 +1647,7 @@ void input_mouse(struct window_pane *, struct mouse_event *); /* xterm-keys.c */ char *xterm_keys_lookup(int); -int xterm_keys_find(const char *, size_t, size_t *); +int xterm_keys_find(const char *, size_t, size_t *, int *); /* colour.c */ void colour_set_fg(struct grid_cell *, int); diff --git a/usr.bin/tmux/tty-keys.c b/usr.bin/tmux/tty-keys.c index 5aef83ea7bc..ec6d05c7062 100644 --- a/usr.bin/tmux/tty-keys.c +++ b/usr.bin/tmux/tty-keys.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tty-keys.c,v 1.24 2009/11/26 22:26:51 nicm Exp $ */ +/* $OpenBSD: tty-keys.c,v 1.25 2009/11/30 16:44:03 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -472,12 +472,15 @@ tty_keys_next(struct tty *tty) goto partial_key; } - /* Not found. Try to parse a key with an xterm-style modifier. */ - key = xterm_keys_find(buf, len, &size); - if (key != KEYC_NONE) { + switch (xterm_keys_find(buf, len, &size, &key)) { + case 0: /* found */ evbuffer_drain(tty->event->input, size); goto handle_key; + case -1: /* not found */ + break; + case 1: + goto partial_key; } /* Skip the escape. */ diff --git a/usr.bin/tmux/xterm-keys.c b/usr.bin/tmux/xterm-keys.c index 3ff2131bf77..bf0abc4294d 100644 --- a/usr.bin/tmux/xterm-keys.c +++ b/usr.bin/tmux/xterm-keys.c @@ -1,4 +1,4 @@ -/* $OpenBSD: xterm-keys.c,v 1.3 2009/11/05 19:35:16 nicm Exp $ */ +/* $OpenBSD: xterm-keys.c,v 1.4 2009/11/30 16:44:03 nicm Exp $ */ /* * Copyright (c) 2009 Nicholas Marriott @@ -85,22 +85,28 @@ struct xterm_keys_entry xterm_keys_table[] = { { KEYC_DC, "\033[3;_~" }, }; -/* Match key against buffer, treating _ as a wildcard. */ +/* + * Match key against buffer, treating _ as a wildcard. Return -1 for no match, + * 0 for match, 1 if the end of the buffer is reached (need more data). + */ int xterm_keys_match(const char *template, const char *buf, size_t len) { size_t pos; - if (len == 0 || len < strlen(template)) + if (len == 0) return (0); pos = 0; do { if (*template != '_' && buf[pos] != *template) - return (0); + return (-1); } while (pos++ != len && *++template != '\0'); - return (1); + if (*template != '\0') /* partial */ + return (1); + + return (0); } /* Find modifiers based on template. */ @@ -131,22 +137,29 @@ xterm_keys_modifiers(const char *template, const char *buf, size_t len) return (0); } -/* Lookup key from buffer against table. */ +/* + * Lookup key from a buffer against the table. Returns 0 for found (and the + * key), -1 for not found, 1 for partial match. + */ int -xterm_keys_find(const char *buf, size_t len, size_t *size) +xterm_keys_find(const char *buf, size_t len, size_t *size, int *key) { struct xterm_keys_entry *entry; u_int i; for (i = 0; i < nitems(xterm_keys_table); i++) { entry = &xterm_keys_table[i]; - if (xterm_keys_match(entry->template, buf, len)) - break; + switch (xterm_keys_match(entry->template, buf, len)) { + case 0: + *size = strlen(entry->template); + *key = entry->key; + *key |= xterm_keys_modifiers(entry->template, buf, len); + return (0); + case 1: + return (1); + } } - if (i == nitems(xterm_keys_table)) - return (KEYC_NONE); - *size = strlen(entry->template); - return (entry->key | xterm_keys_modifiers(entry->template, buf, len)); + return (-1); } /* Lookup a key number from the table. */ -- cgit v1.2.3