makekeys: Handle XFree86 special action keys
authorDan Nicholson <dbn.lists@gmail.com>
Fri, 23 Jan 2009 03:59:24 +0000 (19:59 -0800)
committerDan Nicholson <dbn.lists@gmail.com>
Thu, 19 Mar 2009 18:51:10 +0000 (11:51 -0700)
For some reason, there are a set of keys that have an underscore after
the XF86 prefix when Xlib gets them from XKeysymDB.

src/makekeys/makekeys.c

index 3eb1027ef3e11754e5d318ae1d4ad1c14c0577bb..07ba3ce9a4e9f1d0f2066f69bbf7b520edd800a2 100644 (file)
@@ -55,6 +55,42 @@ static unsigned short indexes[KTNUM];
 static KeySym values[KTNUM];
 static char buf[1024];
 
+/*
+ * XFree86 special action keys - for some reason, these have an
+ * underscore after the XF86 prefix.
+ */
+static const char *xf86_special_keys[] = {
+    "Switch_VT_1",
+    "Switch_VT_2",
+    "Switch_VT_3",
+    "Switch_VT_4",
+    "Switch_VT_5",
+    "Switch_VT_6",
+    "Switch_VT_7",
+    "Switch_VT_8",
+    "Switch_VT_9",
+    "Switch_VT_10",
+    "Switch_VT_11",
+    "Switch_VT_12",
+    "Ungrab",
+    "ClearGrab",
+    "Next_VMode",
+    "Prev_VMode",
+    NULL
+};
+
+static int
+is_xf86_special(const char *key)
+{
+    char **s = (char **)xf86_special_keys;
+    while (*s) {
+        if (strcmp(key, *s) == 0)
+            return 1;
+        s++;
+    }
+    return 0;
+}
+
 static int
 get_keysym(const char *buf, char *key, int index)
 {
@@ -95,8 +131,8 @@ get_xf86_keysym(const char *buf, char *key, size_t len, int index)
     if (sscanf(buf, "#define XF86XK_%127s 0x%lx", tmp, &info[index].val) != 2)
         return 0;
 
-    /* Prepend XF86 to the key */
-    strncpy(key, "XF86", len - 1);
+    /* Prepend XF86 or XF86_ to the key */
+    snprintf(key, len, "XF86%s", is_xf86_special(tmp) ? "_" : "");
     strncat(key, tmp, len - strlen(key) - 1);
 
     return 1;
@@ -111,15 +147,16 @@ get_xf86_keysym_alias(const char *buf, char *key, size_t len, int index)
     /* Try to handle both XF86XK and XK aliases */
     if (sscanf(buf, "#define XF86XK_%127s XF86XK_%127s", ktmp, atmp) == 2) {
         /* Prepend XF86 to the key and alias */
-        strncpy(key, "XF86", len - 1);
+        snprintf(key, len, "XF86%s", is_xf86_special(ktmp) ? "_" : "");
         strncat(key, ktmp, len - strlen(key) - 1);
-        strncpy(alias, "XF86", sizeof(alias) - 1);
+        snprintf(alias, sizeof(alias), "XF86%s",
+                 is_xf86_special(atmp) ? "_" : "");
         strncat(alias, atmp, sizeof(alias) - strlen(alias) - 1);
     } else {
         if (sscanf(buf, "#define XF86XK_%127s XK_%127s", ktmp, alias) != 2)
             return 0;
         /* Prepend XF86 to the key */
-        strncpy(key, "XF86", len - 1);
+        snprintf(key, len, "XF86%s", is_xf86_special(ktmp) ? "_" : "");
         strncat(key, ktmp, len - strlen(key) - 1);
     }