First cut at getting events working

This commit is contained in:
Richard Hult
2009-01-21 19:09:34 +01:00
committed by Alexander Larsson
parent 08bc1864cc
commit 89f1cb5178

View File

@ -919,8 +919,21 @@ find_window_for_ns_event (NSEvent *nsevent,
gint *x, gint *x,
gint *y) gint *y)
{ {
GdkWindow *toplevel;
GdkWindowObject *private;
GdkWindowImplQuartz *impl;
NSPoint point;
NSEventType event_type; NSEventType event_type;
toplevel = [(GdkQuartzView *)[[nsevent window] contentView] gdkWindow];
private = GDK_WINDOW_OBJECT (toplevel);
impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
point = [nsevent locationInWindow];
*x = point.x;
*y = private->height - point.y;
event_type = [nsevent type]; event_type = [nsevent type];
switch (event_type) switch (event_type)
@ -953,7 +966,7 @@ find_window_for_ns_event (NSEvent *nsevent,
* This means we first try the owner, then the grab window, * This means we first try the owner, then the grab window,
* then give up. * then give up.
*/ */
if (_gdk_quartz_pointer_grab_window) if (0 && _gdk_quartz_pointer_grab_window) /* FIXME: Implement grabs? */
{ {
if (pointer_grab_owner_events) if (pointer_grab_owner_events)
{ {
@ -1003,40 +1016,32 @@ find_window_for_ns_event (NSEvent *nsevent,
else else
{ {
/* The non-grabbed case. */ /* The non-grabbed case. */
mouse_window = find_mouse_window_for_ns_event (nsevent, x, y);
event_mask = get_event_mask_from_ns_event (nsevent);
real_window = find_window_interested_in_event_mask (mouse_window, event_mask, TRUE);
/* We have to translate the coordinates if the actual
* window is different from the mouse window.
*/
if (mouse_window && real_window && mouse_window != real_window)
get_ancestor_coordinates_from_child (mouse_window,
*x, *y,
real_window,
x, y);
return real_window; /* Leave events above the window (e.g. possibly on the titlebar)
* to cocoa.
*/
if (*y < 0)
return NULL;
/* FIXME: Also need to leave resize events to cocoa somehow? */
return toplevel;
} }
} }
break; break;
case NSMouseEntered: case NSMouseEntered:
case NSMouseExited: case NSMouseExited:
/* Already handled in synthesize_crossing_events_for_ns_event. */ return toplevel;
break;
case NSKeyDown: case NSKeyDown:
case NSKeyUp: case NSKeyUp:
case NSFlagsChanged: case NSFlagsChanged:
{ {
GdkEventMask event_mask;
if (_gdk_quartz_keyboard_grab_window && !keyboard_grab_owner_events) if (_gdk_quartz_keyboard_grab_window && !keyboard_grab_owner_events)
return _gdk_quartz_keyboard_grab_window; return _gdk_quartz_keyboard_grab_window;
event_mask = get_event_mask_from_ns_event (nsevent); return toplevel;
return find_window_interested_in_event_mask (current_keyboard_window, event_mask, TRUE);
} }
break; break;
@ -1332,7 +1337,11 @@ synthesize_crossing_event (GdkWindow *window,
private = GDK_WINDOW_OBJECT (window); private = GDK_WINDOW_OBJECT (window);
/* FIXME: Do we need to handle grabs here? */ /* FIXME: had this before csw:
_gdk_quartz_events_update_mouse_window (window);
if (window && !_gdk_quartz_pointer_grab_window)
_gdk_quartz_events_update_cursor (window);
*/
switch ([nsevent type]) switch ([nsevent type])
{ {
@ -1414,11 +1423,12 @@ gdk_event_translate (GdkEvent *event,
} }
/* Handle our generated "fake" crossing events. */ /* Handle our generated "fake" crossing events. */
if ([nsevent type] == NSApplicationDefined && if ([nsevent type] == NSApplicationDefined &&
[nsevent subtype] == GDK_QUARTZ_EVENT_SUBTYPE_FAKE_CROSSING) [nsevent subtype] == GDK_QUARTZ_EVENT_SUBTYPE_FAKE_CROSSING)
{ {
/* FIXME: This needs to actually fill in the event we have... */
_gdk_quartz_events_trigger_crossing_events (FALSE); _gdk_quartz_events_trigger_crossing_events (FALSE);
return TRUE; return FALSE; /* ...and return TRUE instead. */
} }
/* Keep track of button state, since we don't get that information /* Keep track of button state, since we don't get that information
@ -1440,8 +1450,6 @@ gdk_event_translate (GdkEvent *event,
break; break;
} }
nswindow = [nsevent window];
if (_gdk_default_filters) if (_gdk_default_filters)
{ {
/* Apply global filters */ /* Apply global filters */
@ -1455,6 +1463,8 @@ gdk_event_translate (GdkEvent *event,
} }
} }
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. */
if (!nswindow || ![[nswindow contentView] isKindOfClass:[GdkQuartzView class]]) if (!nswindow || ![[nswindow contentView] isKindOfClass:[GdkQuartzView class]])
return FALSE; return FALSE;
@ -1498,15 +1508,16 @@ gdk_event_translate (GdkEvent *event,
} }
} }
/* We need the appliction to be activated on clicks so that popups /* We only activate the application on click if it's not already active,
* like context menus get events routed properly. This is handled * this matches most use cases of native apps (no click-through).
* automatically for left mouse button presses but not other
* buttons, so we do it here.
*/ */
if ([nsevent type] == NSRightMouseDown || [nsevent type] == NSOtherMouseDown) if (([nsevent type] == NSRightMouseDown ||
[nsevent type] == NSOtherMouseDown ||
[nsevent type] == NSLeftMouseDown) && ![NSApp isActive])
{ {
if (![NSApp isActive]) [NSApp activateIgnoringOtherApps:YES];
[NSApp activateIgnoringOtherApps:YES]; return_val = FALSE;
goto done;
} }
current_event_mask = get_event_mask_from_ns_event (nsevent); current_event_mask = get_event_mask_from_ns_event (nsevent);
@ -1525,7 +1536,7 @@ gdk_event_translate (GdkEvent *event,
* in its mask, like X. * in its mask, like X.
*/ */
event_mask = (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); event_mask = (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK);
if (!_gdk_quartz_pointer_grab_window && if (0 && !_gdk_quartz_pointer_grab_window && /* FIXME: add back for grabs? */
(GDK_WINDOW_OBJECT (window)->event_mask & event_mask) == event_mask) (GDK_WINDOW_OBJECT (window)->event_mask & event_mask) == event_mask)
{ {
pointer_grab_internal (window, FALSE, pointer_grab_internal (window, FALSE,
@ -1543,7 +1554,7 @@ gdk_event_translate (GdkEvent *event,
fill_button_event (window, event, nsevent, x, y); fill_button_event (window, event, nsevent, x, y);
/* Ungrab implicit grab */ /* Ungrab implicit grab */
if (_gdk_quartz_pointer_grab_window && pointer_grab_implicit) if (0 && _gdk_quartz_pointer_grab_window && pointer_grab_implicit) /* FIXME: add back? */
pointer_ungrab_internal (TRUE); pointer_ungrab_internal (TRUE);
break; break;
@ -1603,6 +1614,7 @@ gdk_event_translate (GdkEvent *event,
default: default:
/* Ignore everything elsee. */ /* Ignore everything elsee. */
return_val = FALSE;
break; break;
} }