display = gdk_event_get_display (event);
device = gdk_event_get_device (event);
- if (!gdk_device_grab_info (display, device, &grab_surface, &owner_events) ||
- !owner_events)
+ if (!gdk_device_grab_info (display, device, &grab_surface, &owner_events))
return NULL;
break;
default:
event_widget = gtk_get_event_widget (event);
grab_widget = GTK_WIDGET (gtk_native_get_for_surface (grab_surface));
- if (grab_widget &&
- gtk_main_get_window_group (grab_widget) != gtk_main_get_window_group (event_widget))
- return rewrite_event_for_surface (event, grab_surface);
- else
+ if (!grab_widget)
+ return NULL;
+
+ /* If owner_events was set, events in client surfaces get forwarded
+ * as normal, but we consider other window groups foreign surfaces.
+ */
+ if (owner_events &&
+ gtk_main_get_window_group (grab_widget) == gtk_main_get_window_group (event_widget))
return NULL;
+
+ /* If owner_events was not set, events only get sent to the grabbing
+ * surface.
+ */
+ if (!owner_events &&
+ grab_surface == gtk_native_get_surface (gtk_widget_get_native (event_widget)))
+ return NULL;
+
+ return rewrite_event_for_surface (event, grab_surface);
}
static GdkEvent *