}
}
+static GdkWindow *
+find_toplevel_under_pointer (GdkDisplay *display,
+ NSPoint screen_point,
+ gint *x,
+ gint *y)
+{
+ GdkWindow *toplevel;
+
+ toplevel = display->pointer_info.toplevel_under_pointer;
+ if (toplevel)
+ {
+ GdkWindowObject *private;
+ NSWindow *nswindow;
+ NSPoint point;
+
+ private = (GdkWindowObject *)toplevel;
+ nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel;
+
+ point = [nswindow convertScreenToBase:screen_point];
+
+ *x = point.x;
+ *y = private->height - point.y;
+ }
+
+ return toplevel;
+}
+
/* This function finds the correct window to send an event to, taking
* into account grabs, event propagation, and event masks.
*/
* reported with respect to the key window, which could be
* wrong.
*/
- if (display->pointer_info.toplevel_under_pointer)
- {
- GdkWindowObject *pointer_private;
- NSWindow *pointer_nswindow;
-
- toplevel = display->pointer_info.toplevel_under_pointer;
- pointer_private = (GdkWindowObject *)toplevel;
- pointer_nswindow = ((GdkWindowImplQuartz *)pointer_private->impl)->toplevel;
-
- point = [pointer_nswindow convertScreenToBase:screen_point];
+ GdkWindow *toplevel_under_pointer;
+ gint x_tmp, y_tmp;
- /* Note: x_root and y_root are already right. */
- *x = point.x;
- *y = pointer_private->height - point.y;
+ toplevel_under_pointer = find_toplevel_under_pointer (display,
+ screen_point,
+ &x_tmp, &y_tmp);
+ if (toplevel_under_pointer)
+ {
+ toplevel = toplevel_under_pointer;
+ *x = x_tmp;
+ *y = y_tmp;
}
return toplevel;
else
{
/* The non-grabbed case. */
+ GdkWindow *toplevel_under_pointer;
+ gint x_tmp, y_tmp;
/* Ignore all events but mouse moved that might be on the title
* bar (above the content view). The reason is that otherwise
/* FIXME: Also need to leave resize events to cocoa somehow? */
+ /* As for owner events, we need to use the toplevel under the
+ * pointer, not the window from the NSEvent.
+ */
+ toplevel_under_pointer = find_toplevel_under_pointer (display,
+ screen_point,
+ &x_tmp, &y_tmp);
+ if (toplevel_under_pointer)
+ {
+ toplevel = toplevel_under_pointer;
+ *x = x_tmp;
+ *y = y_tmp;
+ }
+
return toplevel;
}
}
}
}
- /* If the app is not active, or the window (when not grabbed) is not
- * active, leave the event to AppKit so the window gets focused correctly
- * and don't do click-through (so we behave like most native apps).
+ /* If the app is not active leave the event to AppKit so the window gets
+ * focused correctly and don't do click-through (so we behave like most
+ * native apps). If the app is active, we focus the window and then handle
+ * the event, also to match native apps.
*/
if ((event_type == NSRightMouseDown ||
event_type == NSOtherMouseDown ||
return FALSE;
}
else if (![impl->toplevel isKeyWindow])
- return FALSE;
+ {
+ GdkPointerGrabInfo *grab;
+
+ grab = _gdk_display_get_last_pointer_grab (_gdk_display);
+ if (!grab)
+ [impl->toplevel makeKeyWindow];
+ }
}
current_event_mask = get_event_mask_from_ns_event (nsevent);