From eb3dcdf09421edb181803be7fcb28d095babb4cd Mon Sep 17 00:00:00 2001 From: Richard Hult Date: Tue, 3 Jul 2007 18:49:09 +0000 Subject: [PATCH] Include modifier state in key release events. Fixes bug #453413. 2007-07-03 Richard Hult * gdk/quartz/gdkevents-quartz.c (create_key_event): Include modifier state in key release events. Fixes bug #453413. svn path=/trunk/; revision=18367 --- ChangeLog | 5 +++++ gdk/quartz/gdkevents-quartz.c | 39 +++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/ChangeLog b/ChangeLog index 71305a38e1..f4f4008cca 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-07-03 Richard Hult + + * gdk/quartz/gdkevents-quartz.c (create_key_event): Include + modifier state in key release events. Fixes bug #453413. + 2007-07-03 Matthias Clasen * gtk/gtkcelllayout.c (attributes_text_element): Report diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c index 4b550380f1..7b1bbe300d 100644 --- a/gdk/quartz/gdkevents-quartz.c +++ b/gdk/quartz/gdkevents-quartz.c @@ -1461,6 +1461,45 @@ create_key_event (GdkWindow *window, event->key.is_modifier = _gdk_quartz_keys_is_modifier (event->key.hardware_keycode); + /* If the key press is a modifier, the state should include the mask + * for that modifier but only for releases, not presses. This + * matches the X11 backend behavior. + */ + if (event->key.is_modifier) + { + int mask = 0; + + switch (event->key.keyval) + { + case GDK_Meta_R: + case GDK_Meta_L: + mask = GDK_MOD1_MASK; + break; + case GDK_Shift_R: + case GDK_Shift_L: + mask = GDK_SHIFT_MASK; + break; + case GDK_Caps_Lock: + mask = GDK_LOCK_MASK; + break; + case GDK_Alt_R: + case GDK_Alt_L: + mask = GDK_MOD5_MASK; + break; + case GDK_Control_R: + case GDK_Control_L: + mask = GDK_CONTROL_MASK; + break; + default: + mask = 0; + } + + if (type == GDK_KEY_PRESS) + event->key.state &= ~mask; + else if (type == GDK_KEY_RELEASE) + event->key.state |= mask; + } + event->key.string = NULL; /* Fill in ->string since apps depend on it, taken from the x11 backend. */