Slightly more generic custom CSI handling - name functions just after the letter they parse, so we can multiplex on 'cmd' or other things

This commit is contained in:
Paul LeoNerd Evans 2012-11-30 15:23:41 +00:00
parent fdb44d9796
commit d08c0844a4
1 changed files with 40 additions and 21 deletions

View File

@ -134,19 +134,25 @@ static void register_csifunc(TermKeyType type, TermKeySym sym, int number)
* Handler for CSI u extended Unicode keys * Handler for CSI u extended Unicode keys
*/ */
static TermKeyResult handle_csi_unicode(TermKey *tk, TermKeyKey *key, int cmd, long *arg, int args) static TermKeyResult handle_csi_u(TermKey *tk, TermKeyKey *key, int cmd, long *arg, int args)
{ {
if(args > 1 && arg[1] != -1) switch(cmd) {
key->modifiers = arg[1] - 1; case 'u': {
else if(args > 1 && arg[1] != -1)
key->modifiers = 0; key->modifiers = arg[1] - 1;
else
key->modifiers = 0;
int mod = key->modifiers; int mod = key->modifiers;
key->type = TERMKEY_TYPE_KEYSYM; key->type = TERMKEY_TYPE_KEYSYM;
(*tk->method.emit_codepoint)(tk, arg[0], key); (*tk->method.emit_codepoint)(tk, arg[0], key);
key->modifiers |= mod; key->modifiers |= mod;
return TERMKEY_RES_KEY; return TERMKEY_RES_KEY;
}
default:
return TERMKEY_RES_NONE;
}
} }
/* /*
@ -154,11 +160,19 @@ static TermKeyResult handle_csi_unicode(TermKey *tk, TermKeyKey *key, int cmd, l
* Note: This does not handle X10 encoding * Note: This does not handle X10 encoding
*/ */
static TermKeyResult handle_csi_mouse(TermKey *tk, TermKeyKey *key, int cmd, long *arg, int args) static TermKeyResult handle_csi_m(TermKey *tk, TermKeyKey *key, int cmd, long *arg, int args)
{ {
int initial = cmd >> 8; int initial = cmd >> 8;
cmd &= 0xff; cmd &= 0xff;
switch(cmd) {
case 'M':
case 'm':
break;
default:
return TERMKEY_RES_NONE;
}
if(!initial && args >= 3) { // rxvt protocol if(!initial && args >= 3) { // rxvt protocol
key->type = TERMKEY_TYPE_MOUSE; key->type = TERMKEY_TYPE_MOUSE;
key->code.mouse[0] = arg[0]; key->code.mouse[0] = arg[0];
@ -246,15 +260,20 @@ TermKeyResult termkey_interpret_mouse(TermKey *tk, const TermKeyKey *key, TermKe
* Handler for CSI R position reports * Handler for CSI R position reports
*/ */
static TermKeyResult handle_csi_position(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)
{ {
if(args < 2) switch(cmd) {
return TERMKEY_RES_NONE; case 'R':
if(args < 2)
return TERMKEY_RES_NONE;
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;
}
} }
TermKeyResult termkey_interpret_position(TermKey *tk, const TermKeyKey *key, int *line, int *col) TermKeyResult termkey_interpret_position(TermKey *tk, const TermKeyKey *key, int *line, int *col)
@ -425,12 +444,12 @@ static int register_keys(void)
register_csifunc(TERMKEY_TYPE_FUNCTION, 19, 33); register_csifunc(TERMKEY_TYPE_FUNCTION, 19, 33);
register_csifunc(TERMKEY_TYPE_FUNCTION, 20, 34); register_csifunc(TERMKEY_TYPE_FUNCTION, 20, 34);
csi_handlers['u' - 0x40] = &handle_csi_unicode; csi_handlers['u' - 0x40] = &handle_csi_u;
csi_handlers['M' - 0x40] = &handle_csi_mouse; csi_handlers['M' - 0x40] = &handle_csi_m;
csi_handlers['m' - 0x40] = &handle_csi_mouse; csi_handlers['m' - 0x40] = &handle_csi_m;
csi_handlers['R' - 0x40] = &handle_csi_position; csi_handlers['R' - 0x40] = &handle_csi_R;
keyinfo_initialised = 1; keyinfo_initialised = 1;
return 1; return 1;