gtk/main: Fix handling of !owner_events grabs
authorCarlos Garnacho <carlosg@gnome.org>
Tue, 15 Mar 2022 13:32:10 +0000 (14:32 +0100)
committerCarlos Garnacho <carlosg@gnome.org>
Tue, 15 Mar 2022 13:40:49 +0000 (14:40 +0100)
These are meant to always redirect events to the grabbing surface,
even for other surfaces of the same client. We weren't doing that
(instead letting the event go through unmodified), fix this handling
so GTK sees the events consistenty.

gtk/gtkmain.c

index 470dc543158ab9296cad3fa7aa1049e49eed438f..ab6ddba96e99d4470d014b6015751dfb328a3eaf 100644 (file)
@@ -1013,8 +1013,7 @@ rewrite_event_for_grabs (GdkEvent *event)
       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:
@@ -1024,11 +1023,24 @@ rewrite_event_for_grabs (GdkEvent *event)
   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 *