Try to handle position reports -and- F3 concurrently.. somehow.. argh

This commit is contained in:
Paul LeoNerd Evans 2012-11-30 15:36:06 +00:00
parent 8152f9e018
commit efc5b7e088
2 changed files with 24 additions and 6 deletions

View File

@ -258,19 +258,27 @@ TermKeyResult termkey_interpret_mouse(TermKey *tk, const TermKeyKey *key, TermKe
/* /*
* Handler for CSI R position reports * Handler for CSI R position reports
* A plain CSI R with no arguments is probably actually <F3>
*/ */
static TermKeyResult handle_csi_R(TermKey *tk, TermKeyKey *key, int cmd, long *arg, int args) static TermKeyResult handle_csi_R(TermKey *tk, TermKeyKey *key, int cmd, long *arg, int args)
{ {
switch(cmd) { switch(cmd) {
case 'R': case 'R':
if(args < 2) switch(args) {
return TERMKEY_RES_NONE; case 0:
key->type = TERMKEY_TYPE_FUNCTION;
key->code.number = 3;
return TERMKEY_RES_KEY;
case 2:
key->type = TERMKEY_TYPE_POSITION; key->type = TERMKEY_TYPE_POSITION;
termkey_key_set_linecol(key, arg[1], arg[0]); termkey_key_set_linecol(key, arg[1], arg[0]);
return TERMKEY_RES_KEY; return TERMKEY_RES_KEY;
default:
return TERMKEY_RES_NONE;
}
default: default:
return TERMKEY_RES_NONE; return TERMKEY_RES_NONE;
} }

View File

@ -7,7 +7,7 @@ int main(int argc, char *argv[])
TermKeyKey key; TermKeyKey key;
int line, col; int line, col;
plan_tests(5); plan_tests(8);
tk = termkey_new_abstract("vt100", 0); tk = termkey_new_abstract("vt100", 0);
@ -22,6 +22,16 @@ int main(int argc, char *argv[])
is_int(line, 15, "line for position report"); is_int(line, 15, "line for position report");
is_int(col, 7, "column for position report"); is_int(col, 7, "column for position report");
/* A plain CSI R is likely to be <F3> though.
* This is tricky :/
*/
termkey_push_bytes(tk, "\e[R", 3);
is_int(termkey_getkey(tk, &key), TERMKEY_RES_KEY, "getkey yields RES_KEY for <F3>");
is_int(key.type, TERMKEY_TYPE_FUNCTION, "key.type for <F3>");
is_int(key.code.number, 3, "key.code.number for <F3>");
termkey_destroy(tk); termkey_destroy(tk);
return exit_status(); return exit_status();