Simplify xterm modifier detection by treating as a bitmask + 1. Spotted

by and diff from Emanuele Giaquinta.
pull/1/head
Nicholas Marriott 2010-09-01 21:11:14 +00:00
parent 5309252053
commit de68c2a7da
1 changed files with 19 additions and 36 deletions

View File

@ -114,27 +114,21 @@ int
xterm_keys_modifiers(const char *template, const char *buf, size_t len)
{
size_t idx;
int param, modifiers;
idx = strcspn(template, "_");
if (idx >= len)
return (0);
switch (buf[idx]) {
case '2':
return (KEYC_SHIFT);
case '3':
return (KEYC_ESCAPE);
case '4':
return (KEYC_SHIFT|KEYC_ESCAPE);
case '5':
return (KEYC_CTRL);
case '6':
return (KEYC_SHIFT|KEYC_CTRL);
case '7':
return (KEYC_ESCAPE|KEYC_CTRL);
case '8':
return (KEYC_SHIFT|KEYC_ESCAPE|KEYC_CTRL);
}
return (0);
param = buf[idx] - '1';
modifiers = 0;
if (param & 1)
modifiers |= KEYC_SHIFT;
if (param & 2)
modifiers |= KEYC_ESCAPE;
if (param & 4)
modifiers |= KEYC_CTRL;
return (modifiers);
}
/*
@ -171,30 +165,19 @@ xterm_keys_lookup(int key)
int modifiers;
char *out;
#define KEY_MODIFIERS(key, modifiers) \
(((key) & (KEYC_SHIFT|KEYC_ESCAPE|KEYC_CTRL)) == (modifiers))
modifiers = 0;
if (KEY_MODIFIERS(key, KEYC_SHIFT))
modifiers = 2;
else if (KEY_MODIFIERS(key, KEYC_ESCAPE))
modifiers = 3;
else if (KEY_MODIFIERS(key, KEYC_SHIFT|KEYC_ESCAPE))
modifiers = 4;
else if (KEY_MODIFIERS(key, KEYC_CTRL))
modifiers = 5;
else if (KEY_MODIFIERS(key, KEYC_SHIFT|KEYC_CTRL))
modifiers = 6;
else if (KEY_MODIFIERS(key, KEYC_ESCAPE|KEYC_CTRL))
modifiers = 7;
else if (KEY_MODIFIERS(key, KEYC_SHIFT|KEYC_ESCAPE|KEYC_CTRL))
modifiers = 8;
#undef KEY_MODIFIERS
modifiers = 1;
if (key & KEYC_SHIFT)
modifiers += 1;
if (key & KEYC_ESCAPE)
modifiers += 2;
if (key & KEYC_CTRL)
modifiers += 4;
/*
* If the key has no modifiers, return NULL and let it fall through to
* the normal lookup.
*/
if (modifiers == 0)
if (modifiers == 1)
return (NULL);
/* Otherwise, find the key in the table. */