Keep track of button state and include it in key events. Needed for gimp's

2007-07-03  Richard Hult  <richard@imendio.com>

	* gdk/quartz/gdkevents-quartz.c: Keep track of button state and
	include it in key events. Needed for gimp's selection tools and
	fixes bug #453411.

svn path=/trunk/; revision=18369
This commit is contained in:
Richard Hult 2007-07-03 20:31:59 +00:00 committed by Richard Hult
parent e66ef22b50
commit a07742849e
2 changed files with 54 additions and 13 deletions

View File

@ -1,3 +1,9 @@
2007-07-03 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkevents-quartz.c: Keep track of button state and
include it in key events. Needed for gimp's selection tools and
fixes bug #453411.
2007-07-03 Matthias Clasen <mclasen@redhat.com> 2007-07-03 Matthias Clasen <mclasen@redhat.com>
* gtk/gtkbuilder.c: Fix some typos in docs. (#452278, * gtk/gtkbuilder.c: Fix some typos in docs. (#452278,

View File

@ -49,6 +49,10 @@ static gboolean pointer_grab_implicit;
GdkWindow * _gdk_quartz_keyboard_grab_window; GdkWindow * _gdk_quartz_keyboard_grab_window;
static gboolean keyboard_grab_owner_events; static gboolean keyboard_grab_owner_events;
/* This is the event mask and button state from the last event */
static GdkEventMask current_event_mask;
static int current_button_state;
static void get_child_coordinates_from_ancestor (GdkWindow *ancestor_window, static void get_child_coordinates_from_ancestor (GdkWindow *ancestor_window,
gint ancestor_x, gint ancestor_x,
gint ancestor_y, gint ancestor_y,
@ -447,6 +451,20 @@ get_mouse_button_from_ns_event (NSEvent *event)
} }
} }
static GdkModifierType
get_mouse_button_modifiers_from_ns_event (NSEvent *event)
{
int button;
GdkModifierType state = 0;
/* This maps buttons 1 to 5 to GDK_BUTTON[1-5]_MASK */
button = get_mouse_button_from_ns_event (event);
if (button >= 1 && button <= 5)
state = (1 << (button + 7));
return state;
}
static GdkModifierType static GdkModifierType
get_keyboard_modifiers_from_ns_event (NSEvent *nsevent) get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
{ {
@ -464,8 +482,6 @@ get_keyboard_modifiers_from_ns_event (NSEvent *nsevent)
if (nsflags & NSCommandKeyMask) if (nsflags & NSCommandKeyMask)
modifiers |= GDK_MOD1_MASK; modifiers |= GDK_MOD1_MASK;
/* FIXME: Support GDK_BUTTON_MASK */
return modifiers; return modifiers;
} }
@ -1327,7 +1343,10 @@ create_button_event (GdkWindow *window,
{ {
GdkEvent *event; GdkEvent *event;
GdkEventType type; GdkEventType type;
guint button; gint state;
gint button;
state = get_keyboard_modifiers_from_ns_event (nsevent);
switch ([nsevent type]) switch ([nsevent type])
{ {
@ -1340,6 +1359,7 @@ create_button_event (GdkWindow *window,
case NSRightMouseUp: case NSRightMouseUp:
case NSOtherMouseUp: case NSOtherMouseUp:
type = GDK_BUTTON_RELEASE; type = GDK_BUTTON_RELEASE;
state |= get_mouse_button_modifiers_from_ns_event (nsevent);
break; break;
default: default:
g_assert_not_reached (); g_assert_not_reached ();
@ -1353,7 +1373,7 @@ create_button_event (GdkWindow *window,
event->button.x = x; event->button.x = x;
event->button.y = y; event->button.y = y;
/* FIXME event->axes */ /* FIXME event->axes */
event->button.state = get_keyboard_modifiers_from_ns_event (nsevent); event->button.state = state;
event->button.button = button; event->button.button = button;
event->button.device = _gdk_display->core_pointer; event->button.device = _gdk_display->core_pointer;
convert_window_coordinates_to_root (window, x, y, convert_window_coordinates_to_root (window, x, y,
@ -1372,14 +1392,13 @@ create_motion_event (GdkWindow *window,
GdkEvent *event; GdkEvent *event;
GdkEventType type; GdkEventType type;
GdkModifierType state = 0; GdkModifierType state = 0;
int button = 0;
switch ([nsevent type]) switch ([nsevent type])
{ {
case NSLeftMouseDragged: case NSLeftMouseDragged:
case NSRightMouseDragged: case NSRightMouseDragged:
case NSOtherMouseDragged: case NSOtherMouseDragged:
button = get_mouse_button_from_ns_event (nsevent); state = get_mouse_button_modifiers_from_ns_event (nsevent);
/* Fall through */ /* Fall through */
case NSMouseMoved: case NSMouseMoved:
type = GDK_MOTION_NOTIFY; type = GDK_MOTION_NOTIFY;
@ -1388,10 +1407,6 @@ create_motion_event (GdkWindow *window,
g_assert_not_reached (); g_assert_not_reached ();
} }
/* This maps buttons 1 to 5 to GDK_BUTTON[1-5]_MASK */
if (button >= 1 && button <= 5)
state = (1 << (button + 7));
state |= get_keyboard_modifiers_from_ns_event (nsevent); state |= get_keyboard_modifiers_from_ns_event (nsevent);
event = gdk_event_new (type); event = gdk_event_new (type);
@ -1500,6 +1515,8 @@ create_key_event (GdkWindow *window,
event->key.state |= mask; event->key.state |= mask;
} }
event->key.state |= current_button_state;
event->key.string = NULL; event->key.string = NULL;
/* Fill in ->string since apps depend on it, taken from the x11 backend. */ /* Fill in ->string since apps depend on it, taken from the x11 backend. */
@ -1547,11 +1564,10 @@ create_key_event (GdkWindow *window,
return event; return event;
} }
static GdkEventMask current_mask = 0;
GdkEventMask GdkEventMask
_gdk_quartz_events_get_current_event_mask (void) _gdk_quartz_events_get_current_event_mask (void)
{ {
return current_mask; return current_event_mask;
} }
static gboolean static gboolean
@ -1617,6 +1633,25 @@ gdk_event_translate (NSEvent *nsevent)
} }
} }
/* Keep track of button state, since we don't get that information
* for key events.
*/
switch ([nsevent type])
{
case NSLeftMouseDown:
case NSRightMouseDown:
case NSOtherMouseDown:
current_button_state |= get_mouse_button_modifiers_from_ns_event (nsevent);
break;
case NSLeftMouseUp:
case NSRightMouseUp:
case NSOtherMouseUp:
current_button_state &= ~get_mouse_button_modifiers_from_ns_event (nsevent);
break;
default:
break;
}
nswindow = [nsevent window]; nswindow = [nsevent window];
/* Ignore events for no window or ones not created by GDK. */ /* Ignore events for no window or ones not created by GDK. */
@ -1674,7 +1709,7 @@ gdk_event_translate (NSEvent *nsevent)
[NSApp activateIgnoringOtherApps:YES]; [NSApp activateIgnoringOtherApps:YES];
} }
current_mask = get_event_mask_from_ns_event (nsevent); current_event_mask = get_event_mask_from_ns_event (nsevent);
switch ([nsevent type]) switch ([nsevent type])
{ {