diff options
author | Marco Gerards <metgerards@student.han.nl> | 2011-03-06 17:45:44 -0300 |
---|---|---|
committer | Diego Nieto Cid <dnietoc@gmail.com> | 2011-03-17 18:34:16 -0300 |
commit | 345f8d5ff5fe7e909e8e9aae6a7d02981263ff91 (patch) | |
tree | 273103afc843d043239e30172176be82e2105dc3 /console-client/xkb/symname.c | |
parent | bebc64a9a0f064a0e5f8a3549aa01aa9ac79a2e9 (diff) |
Add XKB parser and implementation.
* console-client/xkb/Compose: New file.
* console-client/xkb/MISSING-FEATURES: Likewise.
* console-client/xkb/README: Likewise.
* console-client/xkb/TODO: Likewise.
* console-client/xkb/compose.c: Likewise.
* console-client/xkb/default.xkb: Likewise.
* console-client/xkb/keysymdef.h: Likewise.
* console-client/xkb/ks_tables.h: Likewise.
* console-client/xkb/kstoucs.c: Likewise.
* console-client/xkb/lex.l: Likewise.
* console-client/xkb/makeconf.sh: Likewise.
* console-client/xkb/parser.y: Likewise.
* console-client/xkb/symname.c: Likewise.
* console-client/xkb/xkb-data/keymap/hurd: Likewise.
* console-client/xkb/xkb-data/symbols/hurd: Likewise.
* console-client/xkb/xkb-data/types/hurd: Likewise.
* console-client/xkb/xkb.c: Likewise.
* console-client/xkb/xkb.h: Likewise.
* console-client/xkb/xkbdata.c: Likewise.
* console-client/xkb/xkbdefaults.c: Likewise.
* console-client/xkb/xkbtimer.c: Likewise.
Diffstat (limited to 'console-client/xkb/symname.c')
-rw-r--r-- | console-client/xkb/symname.c | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/console-client/xkb/symname.c b/console-client/xkb/symname.c new file mode 100644 index 00000000..9f219513 --- /dev/null +++ b/console-client/xkb/symname.c @@ -0,0 +1,96 @@ +#include <string.h> +#define NEEDKTABLE +#include "ks_tables.h" +#include "keysymdef.h" + +#define NoSymbol 0 + +typedef unsigned long Signature; +typedef unsigned long KeySym; + +KeySym XStringToKeysym(char *s) +{ + register int i, n; + int h; + register Signature sig = 0; + register const char *p = s; + register int c; + register int idx; + const unsigned char *entry; + unsigned char sig1, sig2; + KeySym val; + + while ((c = *p++)) + sig = (sig << 1) + c; + i = sig % KTABLESIZE; + h = i + 1; + sig1 = (sig >> 8) & 0xff; + sig2 = sig & 0xff; + n = KMAXHASH; + while ((idx = hashString[i])) + { + entry = &_XkeyTable[idx]; + if ((entry[0] == sig1) && (entry[1] == sig2) && + !strcmp(s, (char *)entry + 4)) + { + val = (entry[2] << 8) | entry[3]; + if (!val) + val = XK_VoidSymbol; + return val; + } + if (!--n) + break; + i += h; + if (i >= KTABLESIZE) + + i -= KTABLESIZE; + } + + /* + + The KeysymDB is not yet supported. + + if (!initialized) + (void)_XInitKeysymDB(); + if (keysymdb) + { + XrmValue result; + XrmRepresentation from_type; + char c; + XrmQuark names[2]; + + names[0] = _XrmInternalStringToQuark(s, p - s - 1, sig, False); + names[1] = NULLQUARK; + (void)XrmQGetResource(keysymdb, names, Qkeysym, &from_type, &result); + if (result.addr && (result.size > 1)) + { + val = 0; + for (i = 0; i < result.size - 1; i++) + { + c = ((char *)result.addr)[i]; + if ('0' <= c && c <= '9') val = (val<<4)+c-'0'; + else if ('a' <= c && c <= 'f') val = (val<<4)+c-'a'+10; + else if ('A' <= c && c <= 'F') val = (val<<4)+c-'A'+10; + else return NoSymbol; + } + return val; + } + } + */ + + if (*s == 'U') { + val = 0; + for (p = &s[1]; *p; p++) { + c = *p; + if ('0' <= c && c <= '9') val = (val<<4)+c-'0'; + else if ('a' <= c && c <= 'f') val = (val<<4)+c-'a'+10; + else if ('A' <= c && c <= 'F') val = (val<<4)+c-'A'+10; + else return NoSymbol; + + } + if (val >= 0x01000000) + return NoSymbol; + return val | 0x01000000; + } + return (NoSymbol); +} |