#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include "Xlibint.h"
#include <X11/Xresource.h>
#include <X11/keysymdef.h>
#include <stdio.h>
typedef unsigned long Signature;
#define NEEDVTABLE
#include "ks_tables.h"
#include "Key.h"
typedef struct _GRNData {
char *name;
XrmRepresentation type;
XrmValuePtr value;
} GRNData;
static Bool
SameValue(
XrmDatabase* db,
XrmBindingList bindings,
XrmQuarkList quarks,
XrmRepresentation* type,
XrmValuePtr value,
XPointer data
)
{
GRNData *gd = (GRNData *)data;
if ((*type == gd->type) && (value->size == gd->value->size) &&
!strncmp((char *)value->addr, (char *)gd->value->addr, value->size))
{
gd->name = XrmQuarkToString(*quarks);
return True;
}
return False;
}
char *XKeysymToString(KeySym ks)
{
register int i, n;
int h;
register int idx;
const unsigned char *entry;
unsigned char val1, val2, val3, val4;
XrmDatabase keysymdb;
if (!ks || (ks & ((unsigned long) ~0x1fffffff)) != 0)
return ((char *)NULL);
if (ks == XK_VoidSymbol)
ks = 0;
if (ks <= 0x1fffffff)
{
val1 = ks >> 24;
val2 = (ks >> 16) & 0xff;
val3 = (ks >> 8) & 0xff;
val4 = ks & 0xff;
i = ks % VTABLESIZE;
h = i + 1;
n = VMAXHASH;
while ((idx = hashKeysym[i]))
{
entry = &_XkeyTable[idx];
if ((entry[0] == val1) && (entry[1] == val2) &&
(entry[2] == val3) && (entry[3] == val4))
return ((char *)entry + 4);
if (!--n)
break;
i += h;
if (i >= VTABLESIZE)
i -= VTABLESIZE;
}
}
if ((keysymdb = _XInitKeysymDB()))
{
char buf[9];
XrmValue resval;
XrmQuark empty = NULLQUARK;
GRNData data;
sprintf(buf, "%lX", ks);
resval.addr = (XPointer)buf;
resval.size = strlen(buf) + 1;
data.name = (char *)NULL;
data.type = XrmPermStringToQuark("String");
data.value = &resval;
(void)XrmEnumerateDatabase(keysymdb, &empty, &empty, XrmEnumAllLevels,
SameValue, (XPointer)&data);
if (data.name)
return data.name;
}
if (ks >= 0x01000100 && ks <= 0x0110ffff) {
KeySym val = ks & 0xffffff;
char *s;
int i;
if (val & 0xff0000)
i = 10;
else
i = 6;
s = Xmalloc(i);
if (s == NULL)
return s;
i--;
s[i--] = '\0';
for (; i; i--){
val1 = val & 0xf;
val >>= 4;
if (val1 < 10)
s[i] = '0'+ val1;
else
s[i] = 'A'+ val1 - 10;
}
s[i] = 'U';
return s;
}
return ((char *) NULL);
}