Make owner_events grabs work again, use the pointer window, not the event window

This commit is contained in:
Richard Hult 2009-02-03 21:52:21 +01:00 committed by Alexander Larsson
parent 6d1a8853c4
commit f51a3f5e33

View File

@ -431,7 +431,6 @@ find_window_for_ns_event (NSEvent *nsevent,
GdkQuartzView *view; GdkQuartzView *view;
GdkWindow *toplevel; GdkWindow *toplevel;
GdkWindowObject *private; GdkWindowObject *private;
GdkWindowImplQuartz *impl;
NSPoint point; NSPoint point;
NSPoint screen_point; NSPoint screen_point;
NSEventType event_type; NSEventType event_type;
@ -440,7 +439,6 @@ find_window_for_ns_event (NSEvent *nsevent,
toplevel = [view gdkWindow]; toplevel = [view gdkWindow];
private = GDK_WINDOW_OBJECT (toplevel); private = GDK_WINDOW_OBJECT (toplevel);
impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
point = [nsevent locationInWindow]; point = [nsevent locationInWindow];
screen_point = [[nsevent window] convertBaseToScreen:point]; screen_point = [[nsevent window] convertBaseToScreen:point];
@ -480,19 +478,41 @@ find_window_for_ns_event (NSEvent *nsevent,
* the grab_window and is reported only if selected by * the grab_window and is reported only if selected by
* event_mask. For either value of owner_events, unreported * event_mask. For either value of owner_events, unreported
* events are discarded. * events are discarded.
*
* This means we first try the owner, then the grab window,
* then give up.
*/ */
grab = _gdk_display_get_last_pointer_grab (display); grab = _gdk_display_get_last_pointer_grab (display);
if (grab && grab->window) if (grab)
{ {
if (grab->owner_events) if ((grab->event_mask & get_event_mask_from_ns_event (nsevent)) == 0)
return toplevel; return NULL;
/* Finally check the grab window. */ if (grab->owner_events)
if (grab->event_mask & get_event_mask_from_ns_event (nsevent)) {
{ /* For owner events, we need to use the toplevel under the
* pointer, not the window from the NSEvent, since that is
* 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];
/* Note: x_root and y_root are already right. */
*x = point.x;
*y = pointer_private->height - point.y;
}
return toplevel;
}
else
{
/* Finally check the grab window. */
GdkWindow *grab_toplevel; GdkWindow *grab_toplevel;
GdkWindowObject *grab_private; GdkWindowObject *grab_private;
NSWindow *grab_nswindow; NSWindow *grab_nswindow;
@ -500,15 +520,12 @@ find_window_for_ns_event (NSEvent *nsevent,
grab_toplevel = gdk_window_get_toplevel (grab->window); grab_toplevel = gdk_window_get_toplevel (grab->window);
grab_private = (GdkWindowObject *)grab_toplevel; grab_private = (GdkWindowObject *)grab_toplevel;
point = [[nsevent window] convertBaseToScreen:[nsevent locationInWindow]]; grab_nswindow = ((GdkWindowImplQuartz *)grab_private->impl)->toplevel;
point = [grab_nswindow convertScreenToBase:screen_point];
grab_nswindow = ((GdkWindowImplQuartz *)private->impl)->toplevel;
point = [grab_nswindow convertScreenToBase:point];
*x = point.x;
*y = grab_private->height - point.y;
/* Note: x_root and y_root are already right. */ /* Note: x_root and y_root are already right. */
*x = point.x;
*y = grab_private->height - point.y;
return grab_toplevel; return grab_toplevel;
} }