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);
}
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)

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 (*tk->method.getkey_simple)(tk, key, force);
return TERMKEY_RES_NONE;
}
static struct {

View File

@ -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)