]> Pileus Git - ~andy/gtk/commitdiff
Make it possible to determine if a key event is for a modifier key:
authorMatthias Clasen <mclasen@redhat.com>
Fri, 9 Sep 2005 22:50:15 +0000 (22:50 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 9 Sep 2005 22:50:15 +0000 (22:50 +0000)
2005-09-09  Matthias Clasen  <mclasen@redhat.com>

Make it possible to determine if a key event is for a
modifier key:

  * gdk/x11/gdkprivate-x11.h:
* gdk/x11/gdkkeys-x11.c (_gdk_keymap_key_is_modifier):
New function to determine if a keycode is mapped to a modifier.
(get_xkb): Get the modmap.

* gdk/x11/gdkevents-x11.c (translate_key_event): Set the
is_modifier bit by calling _gdk_keymap_key_is_modifier().

* gdk/gdkevents.h (struct _GdkEventKey): Add an is_modifier
bit.

ChangeLog
ChangeLog.pre-2-10
docs/reference/ChangeLog
docs/reference/gdk/tmpl/event_structs.sgml
gdk/gdkevents.h
gdk/x11/gdkevents-x11.c
gdk/x11/gdkkeys-x11.c
gdk/x11/gdkprivate-x11.h

index f73df51ad65f1de4dae8b4edff3b1c3d4fcd2cd1..2bfeb75b25ea2f491d22d9b74dbc2299afd1dfc6 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2005-09-09  Matthias Clasen  <mclasen@redhat.com>
+
+       Make it possible to determine if a key event is for a
+       modifier key:
+       
+       * gdk/x11/gdkprivate-x11.h: 
+       * gdk/x11/gdkkeys-x11.c (_gdk_keymap_key_is_modifier): 
+       New function to determine if a keycode is mapped to a modifier.
+       (get_xkb): Get the modmap.
+
+       * gdk/x11/gdkevents-x11.c (translate_key_event): Set the 
+       is_modifier bit by calling _gdk_keymap_key_is_modifier().
+
+       * gdk/gdkevents.h (struct _GdkEventKey): Add an is_modifier
+       bit.
+
+2005-09-09  Matthias Clasen  <mclasen@redhat.com>
+
+       * gdk/gdkpixbuf-drawable.c (convert_real_slow): Remove an 
+       unused variable, noticed by Kjartan Maraas.
+
 2005-09-09  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_button_event): 
index f73df51ad65f1de4dae8b4edff3b1c3d4fcd2cd1..2bfeb75b25ea2f491d22d9b74dbc2299afd1dfc6 100644 (file)
@@ -1,3 +1,24 @@
+2005-09-09  Matthias Clasen  <mclasen@redhat.com>
+
+       Make it possible to determine if a key event is for a
+       modifier key:
+       
+       * gdk/x11/gdkprivate-x11.h: 
+       * gdk/x11/gdkkeys-x11.c (_gdk_keymap_key_is_modifier): 
+       New function to determine if a keycode is mapped to a modifier.
+       (get_xkb): Get the modmap.
+
+       * gdk/x11/gdkevents-x11.c (translate_key_event): Set the 
+       is_modifier bit by calling _gdk_keymap_key_is_modifier().
+
+       * gdk/gdkevents.h (struct _GdkEventKey): Add an is_modifier
+       bit.
+
+2005-09-09  Matthias Clasen  <mclasen@redhat.com>
+
+       * gdk/gdkpixbuf-drawable.c (convert_real_slow): Remove an 
+       unused variable, noticed by Kjartan Maraas.
+
 2005-09-09  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_button_event): 
index 1efbc6b606ec8450dd00adb04f5507f5de47224c..8fc51cd21b4a40bdf157c5b25786c5e383e3f7d1 100644 (file)
@@ -1,3 +1,7 @@
+2005-09-09  Matthias Clasen  <mclasen@redhat.com>
+
+       * gdk/tmpl/event_structs.sgml: Document GdkEventKey.is_modifier.
+
 2005-09-06  Matthias Clasen  <mclasen@redhat.com>
 
        * gdk/tmpl/windows.sgml: Document new modifier bits.
index 91f0c8f7eedbf7c1e939d7731e922cd5c77d1854..765a0fda7f22534b3fe2e096e14ac558192f1df3 100644 (file)
@@ -108,6 +108,8 @@ NUL byte, in which case looking at @length is necessary to distinguish
 it from the an empty translation.
 @hardware_keycode: the raw code of the key that was pressed or released.
 @group: the keyboard group.
+@is_modifier: a flag that indicates if @hardware_keycode is mapped to a
+  modifier. Since 2.10
 
 <!-- ##### STRUCT GdkEventButton ##### -->
 <para>
index 23231e54233b98e82c9ad5712da487a419c1e4f6..6c5ea277dc79273e9e043b1e2e5c5dcdcdecae2f 100644 (file)
@@ -342,6 +342,7 @@ struct _GdkEventKey
   gchar *string;
   guint16 hardware_keycode;
   guint8 group;
+  guint is_modifier : 1;
 };
 
 struct _GdkEventCrossing
index d1505b2ae1a89657c0a5ced6a526659d46fcde1a..ebf7478116fed8ce9735d93ab3a9f4c74c6c3f1b 100644 (file)
@@ -611,6 +611,7 @@ translate_key_event (GdkDisplay *display,
                                       NULL, NULL, NULL);
 
   _gdk_keymap_add_virtual_modifiers (keymap, &event->key.state);
+  event->key.is_modifier = _gdk_keymap_key_is_modifier (keymap, event->key.hardware_keycode);
 
   /* Fill in event->string crudely, since various programs
    * depend on it.
index a1e4b4c30101904013786202474f4d4fe0100071..48aa0383e9d324c66c5a0005310d5dd3b8a268cc 100644 (file)
@@ -219,7 +219,7 @@ get_xkb (GdkKeymapX11 *keymap_x11)
   
   if (keymap_x11->xkb_desc == NULL)
     {
-      keymap_x11->xkb_desc = XkbGetMap (xdisplay, XkbKeySymsMask | XkbKeyTypesMask | XkbVirtualModsMask, XkbUseCoreKbd);
+      keymap_x11->xkb_desc = XkbGetMap (xdisplay, XkbKeySymsMask | XkbKeyTypesMask | XkbModifierMapMask | XkbVirtualModsMask, XkbUseCoreKbd);
       if (keymap_x11->xkb_desc == NULL)
        g_error ("Failed to get keymap");
 
@@ -229,7 +229,7 @@ get_xkb (GdkKeymapX11 *keymap_x11)
     }
   else if (keymap_x11->current_serial != display_x11->keymap_serial)
     {
-      XkbGetUpdatedMap (xdisplay, XkbKeySymsMask | XkbKeyTypesMask | XkbVirtualModsMask,
+      XkbGetUpdatedMap (xdisplay, XkbKeySymsMask | XkbKeyTypesMask | XkbModifierMapMask | XkbVirtualModsMask,
                        keymap_x11->xkb_desc);
       XkbGetNames (xdisplay, XkbGroupNamesMask | XkbVirtualModNamesMask, keymap_x11->xkb_desc);
 
@@ -1537,6 +1537,41 @@ _gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
     }
 }
 
+gboolean
+_gdk_keymap_key_is_modifier (GdkKeymap *keymap,
+                            guint      keycode)
+{
+  GdkKeymapX11 *keymap_x11;
+  gint i;
+
+  keymap = GET_EFFECTIVE_KEYMAP (keymap);  
+  keymap_x11 = GDK_KEYMAP_X11 (keymap);
+
+  if (keycode < keymap_x11->min_keycode ||
+      keycode > keymap_x11->max_keycode)
+    return FALSE;
+
+#ifdef HAVE_XKB
+  if (KEYMAP_USE_XKB (keymap))
+    {
+      XkbDescRec *xkb = get_xkb (keymap_x11);
+      
+      if (xkb->map->modmap[keycode] != 0)
+       return TRUE;
+    }
+  else
+#endif
+    {
+      for (i = 0; i < 8 * keymap_x11->mod_keymap->max_keypermod; i++)
+       {
+         if (keycode == keymap_x11->mod_keymap->modifiermap[i])
+           return TRUE;
+       }
+    }
+
+  return FALSE;
+}
+
 
 #define __GDK_KEYS_X11_C__
 #include "gdkaliasdef.c"
index cc310cf82086c01d0982b67844fe15311e3234af..26f94fe349a6bcecec9e0c7b37859446e50d9a6a 100644 (file)
@@ -145,6 +145,8 @@ gint _gdk_x11_get_group_for_state (GdkDisplay      *display,
                                   GdkModifierType  state);
 void _gdk_keymap_add_virtual_modifiers (GdkKeymap       *keymap,
                                        GdkModifierType *modifiers);
+gboolean _gdk_keymap_key_is_modifier   (GdkKeymap       *keymap,
+                                       guint            keycode);
 
 GC _gdk_x11_gc_flush (GdkGC *gc);