+ KeySym key = XK_VoidSymbol;
+ char *name_ptr = *x11name;
+
+ if (strncmp(name_ptr, "XK_", 3) == 0 && strlen(name_ptr) == 4)
+ {
+ char c = name_ptr[3];
+
+ if (c >= 'A' && c <= 'Z')
+ key = XK_A + (KeySym)(c - 'A');
+ else if (c >= 'a' && c <= 'z')
+ key = XK_a + (KeySym)(c - 'a');
+ else if (c >= '0' && c <= '9')
+ key = XK_0 + (KeySym)(c - '0');
+ }
+ else if (strncmp(name_ptr, "XK_KP_", 6) == 0 && strlen(name_ptr) == 7)
+ {
+ char c = name_ptr[6];
+
+ if (c >= '0' && c <= '9')
+ key = XK_0 + (KeySym)(c - '0');
+ }
+ else if (strncmp(name_ptr, "XK_F", 4) == 0 && strlen(name_ptr) <= 6)
+ {
+ char c1 = name_ptr[4];
+ char c2 = name_ptr[5];
+ int d = 0;
+
+ if ((c1 >= '0' && c1 <= '9') &&
+ ((c2 >= '0' && c1 <= '9') || c2 == '\0'))
+ d = atoi(&name_ptr[4]);
+
+ if (d >=1 && d <= 24)
+ key = XK_F1 + (KeySym)(d - 1);
+ }
+ else if (strncmp(name_ptr, "XK_", 3) == 0)
+ {
+ i = 0;
+
+ do
+ {
+ if (strcmp(name_ptr, translate_key[i].x11name) == 0)
+ {
+ key = translate_key[i].keysym;
+ break;
+ }
+ }
+ while (translate_key[++i].x11name);
+ }
+ else if (strncmp(name_ptr, "0x", 2) == 0)
+ {
+ unsigned long value = 0;
+
+ name_ptr += 2;
+
+ while (name_ptr)
+ {
+ char c = *name_ptr++;
+ int d = -1;
+
+ if (c >= '0' && c <= '9')
+ d = (int)(c - '0');
+ else if (c >= 'a' && c <= 'f')
+ d = (int)(c - 'a' + 10);
+ else if (c >= 'A' && c <= 'F')
+ d = (int)(c - 'A' + 10);
+
+ if (d == -1)
+ {
+ value = -1;
+ break;
+ }
+
+ value = value * 16 + d;
+ }
+
+ if (value != -1)
+ key = (KeySym)value;
+ }
+
+ *keysym = key;