From 09edf2377f3c534d930a604d9fe6a97265e372e2 Mon Sep 17 00:00:00 2001 From: Paul LeoNerd Evans Date: Sun, 9 Nov 2008 19:45:43 +0000 Subject: Driver getkey() can return TERMKEY_RES_NONE which attempts getkey_simple() afterwards --- termkey.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) (limited to 'termkey.c') diff --git a/termkey.c b/termkey.c index e36d174..bbcbba3 100644 --- a/termkey.c +++ b/termkey.c @@ -382,7 +382,11 @@ static termkey_result getkey_simple(termkey_t *tk, termkey_key *key, int force) tk->buffcount--; // Run the full driver - termkey_result metakey_result = (*tk->driver.getkey)(tk, tk->driver_info, key, force); + termkey_result metakey_result; + if(force) + metakey_result = termkey_getkey_force(tk, key); + else + metakey_result = termkey_getkey(tk, key); tk->buffstart--; tk->buffcount++; @@ -504,12 +508,36 @@ static termkey_result getkey_simple(termkey_t *tk, termkey_key *key, int force) termkey_result termkey_getkey(termkey_t *tk, termkey_key *key) { - return (*tk->driver.getkey)(tk, tk->driver_info, key, 0); + termkey_result ret = (*tk->driver.getkey)(tk, tk->driver_info, key, 0); + + switch(ret) { + case TERMKEY_RES_KEY: + case TERMKEY_RES_EOF: + case TERMKEY_RES_AGAIN: + return ret; + + case TERMKEY_RES_NONE: + break; + } + + return getkey_simple(tk, key, 0); } termkey_result termkey_getkey_force(termkey_t *tk, termkey_key *key) { - return (*tk->driver.getkey)(tk, tk->driver_info, key, 1); + termkey_result ret = (*tk->driver.getkey)(tk, tk->driver_info, key, 1); + + switch(ret) { + case TERMKEY_RES_KEY: + case TERMKEY_RES_EOF: + return ret; + + case TERMKEY_RES_AGAIN: + case TERMKEY_RES_NONE: + break; + } + + return getkey_simple(tk, key, 1); } termkey_result termkey_waitkey(termkey_t *tk, termkey_key *key) -- cgit v1.2.3