From 270ab11b7022afe2906516e083a44790cdb9bccd Mon Sep 17 00:00:00 2001
From: Olivier Fourdan <fourdan.olivier@wanadoo.fr>
Date: Tue, 13 Feb 2007 20:25:24 +0000
Subject: [PATCH] Add support for keycode when no keysym is available (bug
 #2503)

(Old svn revision: 24971)
---
 mcs-plugin/xfwm4_shortcuteditor.c |  6 ++++++
 src/keyboard.c                    | 27 +++++++++++++++++++++++++--
 2 files changed, 31 insertions(+), 2 deletions(-)

diff --git a/mcs-plugin/xfwm4_shortcuteditor.c b/mcs-plugin/xfwm4_shortcuteditor.c
index 45f8102b9..ed9cf6894 100644
--- a/mcs-plugin/xfwm4_shortcuteditor.c
+++ b/mcs-plugin/xfwm4_shortcuteditor.c
@@ -757,6 +757,12 @@ cb_compose_shortcut (GtkWidget * widget, GdkEventKey * event, gpointer data)
     g_free (accelerator);
     g_strfreev (shortcuts);
 
+    /* Use keycode if unknown keysym */
+    if (!strlen (shortcut_string))
+    {
+        g_snprintf (shortcut_string, sizeof (shortcut_string), "0x%X", (guint) event->hardware_keycode);
+    }
+
     selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (itf->treeview3));
 
     /* Apply change */
diff --git a/src/keyboard.c b/src/keyboard.c
index 7eb9cf237..aa97f7d83 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -38,6 +38,29 @@ unsigned int ScrollLockMask;
 unsigned int SuperMask;
 unsigned int HyperMask;
 
+static gboolean
+getKeycode (Display *dpy, const char *str, KeyCode *keycode)
+{
+    unsigned int value;
+    KeySym keysym;
+
+    keysym = XStringToKeysym (str);
+    if (keysym == NoSymbol)
+    {
+        if (sscanf (str, "0x%X", (unsigned int *) &value) != 1)
+        {
+            *keycode = 0;
+            return FALSE;
+        }
+        *keycode = (KeyCode) value;
+    }
+    else
+    {
+        *keycode = XKeysymToKeycode (dpy, keysym);
+    }
+    return TRUE;
+}
+
 int
 getModifierMap (char *str)
 {
@@ -120,12 +143,12 @@ parseKeyString (Display * dpy, MyKey * key, char *str)
     if (k)
     {
         /* There is a modifier */
-        key->keycode = XKeysymToKeycode (dpy, XStringToKeysym (++k));
+        getKeycode (dpy, ++k, &key->keycode);
         key->modifier = getModifierMap (str);
     }
     else
     {
-        key->keycode = XKeysymToKeycode (dpy, XStringToKeysym (str));
+        getKeycode (dpy, str, &key->keycode);
         key->modifier = 0;
     }
 }
-- 
GitLab