summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2009-11-30 16:44:04 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2009-11-30 16:44:04 +0000
commit55145f68bcab7fa0baba55fec5f1db41ad991a4c (patch)
tree3ab5491999545b2664d825213d6c20fe00539fb2
parent6b494bcf257dd9690a5391e871e37be636ded5ca (diff)
Handle partial xterm function key sequences.
-rw-r--r--usr.bin/tmux/tmux.h4
-rw-r--r--usr.bin/tmux/tty-keys.c11
-rw-r--r--usr.bin/tmux/xterm-keys.c39
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 <nicm@users.sourceforge.net>
@@ -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 <nicm@users.sourceforge.net>
@@ -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 <nicm@users.sourceforge.net>
@@ -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. */