[gtk+] wayland: Implement more keymap functions



commit cdcc8047301cdd4c661a183576c02b2e56814c29
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Apr 5 07:21:40 2013 -0400

    wayland: Implement more keymap functions
    
    This commit implements gdk_keymap_get_entries_for_keyval
    and gdk_keymap_lookup_key.

 gdk/wayland/gdkkeys-wayland.c |   69 +++++++++++++++++++++++++++++++---------
 1 files changed, 53 insertions(+), 16 deletions(-)
---
diff --git a/gdk/wayland/gdkkeys-wayland.c b/gdk/wayland/gdkkeys-wayland.c
index cc69236..6cb0a96 100644
--- a/gdk/wayland/gdkkeys-wayland.c
+++ b/gdk/wayland/gdkkeys-wayland.c
@@ -121,14 +121,45 @@ gdk_wayland_keymap_get_entries_for_keyval (GdkKeymap     *keymap,
                                           GdkKeymapKey **keys,
                                           gint          *n_keys)
 {
-  if (n_keys)
-    *n_keys = 1;
-  if (keys)
+  struct xkb_keymap *xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap;
+  GArray *retval;
+  guint keycode;
+
+  retval = g_array_new (FALSE, FALSE, sizeof (GdkKeymapKey));
+
+  for (keycode = 8; keycode < 255; keycode++) /* FIXME: min/max keycode */
     {
-      *keys = g_new0 (GdkKeymapKey, 1);
-      (*keys)->keycode = keyval;
+      gint num_layouts, layout;
+      num_layouts = xkb_keymap_num_layouts_for_key (xkb_keymap, keycode);
+      for (layout = 0; layout < num_layouts; layout++)
+        {
+          gint num_levels, level;
+          num_levels = xkb_keymap_num_levels_for_key (xkb_keymap, keycode, layout);
+          for (level = 0; level < num_levels; level++)
+            {
+              const xkb_keysym_t *syms;
+              gint num_syms, sym;
+              num_syms = xkb_keymap_key_get_syms_by_level (xkb_keymap, keycode, layout, level, &syms);
+              for (sym = 0; sym < num_syms; sym++)
+                {
+                  if (syms[sym] == keyval)
+                    {
+                      GdkKeymapKey key;
+
+                      key.keycode = keycode;
+                      key.group = layout;
+                      key.level = level;
+
+                      g_array_append_val (retval, key);
+                    }
+                }
+            }
+        }
     }
 
+  *n_keys = retval->len;
+  *keys = (GdkKeymapKey*) g_array_free (retval, FALSE);
+
   return TRUE;
 }
 
@@ -153,15 +184,9 @@ gdk_wayland_keymap_get_entries_for_keycode (GdkKeymap     *keymap,
  if (n_entries)
     *n_entries = num_entries;
   if (keys)
-    {
-      *keys = g_new0 (GdkKeymapKey, num_entries);
-      (*keys)->keycode = hardware_keycode;
-    }
+    *keys = g_new0 (GdkKeymapKey, num_entries);
   if (keyvals)
-    {
-      *keyvals = g_new0 (guint, num_entries);
-      (*keyvals)[0] = hardware_keycode;
-    }
+    *keyvals = g_new0 (guint, num_entries);
 
   i = 0;
   for (layout = 0; layout < num_layouts; layout++)
@@ -186,14 +211,26 @@ gdk_wayland_keymap_get_entries_for_keycode (GdkKeymap     *keymap,
         }
     }
 
-  return TRUE;
+  return num_entries > 0;
 }
 
 static guint
 gdk_wayland_keymap_lookup_key (GdkKeymap          *keymap,
                               const GdkKeymapKey *key)
 {
-  return key->keycode;
+  struct xkb_keymap *xkb_keymap = GDK_WAYLAND_KEYMAP (keymap)->xkb_keymap;
+  const xkb_keysym_t *syms;
+  int num_syms;
+
+  num_syms = xkb_keymap_key_get_syms_by_level (xkb_keymap,
+                                               key->keycode,
+                                               key->group,
+                                               key->level,
+                                               &syms);
+  if (num_syms > 0)
+    return syms[0];
+  else
+    return XKB_KEY_NoSymbol;
 }
 
 static gboolean
@@ -265,7 +302,7 @@ update_direction (GdkWaylandKeymap *keymap)
 {
   gint num_layouts;
   gint *rtl;
-  gint key;
+  guint key;
   gboolean have_rtl, have_ltr;
   gint i;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]