commit 39be364f31f527b59f6280d37eaa88e70fe79712
parent 4509683dafe3ff6f26d5dd19e4a2ad892e63d5d0
Author: Hiltjo Posthuma <hiltjo@codemadness.org>
Date: Fri, 10 Oct 2014 20:36:33 +0000
improve handleinput for reads containing multiple keys
Diffstat:
M | sob.c | | | 43 | ++++++++++++++++++++++++++++--------------- |
1 file changed, 28 insertions(+), 15 deletions(-)
diff --git a/sob.c b/sob.c
@@ -748,26 +748,39 @@ cleanup(void)
}
static void
-handleinput(const unsigned char *key, size_t len)
+handleinput(const unsigned char *input, size_t len)
{
- size_t i;
+ size_t p = 0, keylen, i;
int ismatch = 0;
+ char buf[BUFSIZ];
- for(i = 0; i < LEN(keybinds); i++) {
- if(len == strlen((char*)keybinds[i].key) &&
- memcmp(key, keybinds[i].key, len) == 0) {
- keybinds[i].func();
- ismatch = 1;
- break;
+ while(p < len) {
+ if(input[p] <= 0x1b) {
+ ismatch = 0;
+ for(i = 0; i < LEN(keybinds); i++) {
+ keylen = strlen((char*)keybinds[i].key);
+ if(strncmp((const char*)&input[p], (const char *)keybinds[i].key, keylen) == 0) {
+ keybinds[i].func();
+ p += keylen;
+ ismatch = 1;
+ break;
+ }
+ }
+ if(!ismatch)
+ p++;
+ } else {
+ for(i = p; input[i] && input[i] > 0x1b; i++)
+ ;
+ buf[0] = '\0';
+ if(i - p < sizeof(buf)) {
+ memcpy(buf, &input[p], i - p);
+ buf[i - p] = '\0';
+ p = i;
+ line_inserttext((char*)buf);
+ line_draw();
+ }
}
}
- if(!ismatch) {
- /* ignore unhandled escape sequence */
- if(key[0] == '\x1b' || iscntrl(key[0]))
- return;
- line_inserttext((char*)key);
- line_draw();
- }
}
static int