diff --git a/ChangeLog b/ChangeLog index f73df51ad6..2bfeb75b25 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2005-09-09 Matthias Clasen + + 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 + + * gdk/gdkpixbuf-drawable.c (convert_real_slow): Remove an + unused variable, noticed by Kjartan Maraas. + 2005-09-09 Matthias Clasen * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_button_event): diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index f73df51ad6..2bfeb75b25 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,3 +1,24 @@ +2005-09-09 Matthias Clasen + + 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 + + * gdk/gdkpixbuf-drawable.c (convert_real_slow): Remove an + unused variable, noticed by Kjartan Maraas. + 2005-09-09 Matthias Clasen * gtk/gtktreeviewcolumn.c (gtk_tree_view_column_button_event): diff --git a/docs/reference/ChangeLog b/docs/reference/ChangeLog index 1efbc6b606..8fc51cd21b 100644 --- a/docs/reference/ChangeLog +++ b/docs/reference/ChangeLog @@ -1,3 +1,7 @@ +2005-09-09 Matthias Clasen + + * gdk/tmpl/event_structs.sgml: Document GdkEventKey.is_modifier. + 2005-09-06 Matthias Clasen * gdk/tmpl/windows.sgml: Document new modifier bits. diff --git a/docs/reference/gdk/tmpl/event_structs.sgml b/docs/reference/gdk/tmpl/event_structs.sgml index 91f0c8f7ee..765a0fda7f 100644 --- a/docs/reference/gdk/tmpl/event_structs.sgml +++ b/docs/reference/gdk/tmpl/event_structs.sgml @@ -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 diff --git a/gdk/gdkevents.h b/gdk/gdkevents.h index 23231e5423..6c5ea277dc 100644 --- a/gdk/gdkevents.h +++ b/gdk/gdkevents.h @@ -342,6 +342,7 @@ struct _GdkEventKey gchar *string; guint16 hardware_keycode; guint8 group; + guint is_modifier : 1; }; struct _GdkEventCrossing diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index d1505b2ae1..ebf7478116 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -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. diff --git a/gdk/x11/gdkkeys-x11.c b/gdk/x11/gdkkeys-x11.c index a1e4b4c301..48aa0383e9 100644 --- a/gdk/x11/gdkkeys-x11.c +++ b/gdk/x11/gdkkeys-x11.c @@ -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" diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index cc310cf820..26f94fe349 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -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);