Driver getkey() can return TERMKEY_RES_NONE which attempts getkey_simple() afterwards

This commit is contained in:
Paul LeoNerd Evans 2008-11-09 19:45:43 +00:00
parent de74ffa67f
commit 09edf2377f
3 changed files with 33 additions and 6 deletions

View File

@ -309,7 +309,7 @@ static termkey_result getkey(termkey_t *tk, void *info, termkey_key *key, int fo
return getkey_csi(tk, csi, 1, key, force); return getkey_csi(tk, csi, 1, key, force);
} }
else else
return (*tk->method.getkey_simple)(tk, key, force); return TERMKEY_RES_NONE;
} }
static termkey_keysym register_csi_ss3(termkey_csi *csi, termkey_type type, termkey_keysym sym, unsigned char cmd, const char *name) static termkey_keysym register_csi_ss3(termkey_csi *csi, termkey_type type, termkey_keysym sym, unsigned char cmd, const char *name)

View File

@ -135,8 +135,7 @@ static termkey_result getkey(termkey_t *tk, void *info, termkey_key *key, int fo
} }
} }
// No special seq. Must be a simple key then return TERMKEY_RES_NONE;
return (*tk->method.getkey_simple)(tk, key, force);
} }
static struct { static struct {

View File

@ -382,7 +382,11 @@ static termkey_result getkey_simple(termkey_t *tk, termkey_key *key, int force)
tk->buffcount--; tk->buffcount--;
// Run the full driver // 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->buffstart--;
tk->buffcount++; 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) 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) 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) termkey_result termkey_waitkey(termkey_t *tk, termkey_key *key)