x11: Replace the hardcoded DND filter
authorBenjamin Otte <otte@redhat.com>
Wed, 6 Jun 2018 02:55:55 +0000 (04:55 +0200)
committerBenjamin Otte <otte@redhat.com>
Mon, 18 Jun 2018 21:49:52 +0000 (23:49 +0200)
Use the new method of connecting to the xevent signal instead.

Also, don't consume the xevent, there might be other code listening for
it. And we don't use PropertyNotify in the generic code path anymore, so
it'll just be ignored there.

gdk/x11/gdkdnd-x11.c
gdk/x11/gdkeventsource.c
gdk/x11/gdkprivate-x11.h

index 96993d74ec04b84cde5e9409cfb011a200bf108d..0a66ce4e93d643dd3406669799e12af31dd3ab34 100644 (file)
@@ -1583,29 +1583,23 @@ xdnd_read_actions (GdkX11DragContext *context_x11)
  * to continually send actions. So we select on PropertyChangeMask
  * and add this filter.
  */
-GdkFilterReturn
-xdnd_source_surface_filter (const XEvent *xevent,
-                           GdkEvent     *event,
-                           gpointer      data)
+static gboolean
+xdnd_source_surface_filter (GdkDisplay   *display,
+                            const XEvent *xevent,
+                            gpointer      data)
 {
-  GdkX11DragContext *context_x11;
-  GdkDisplay *display;
-
-  if (!data)
-    return GDK_FILTER_CONTINUE;
+  GdkX11DragContext *context_x11 = data;
 
   context_x11 = data;
-  display = gdk_drag_context_get_display (GDK_DRAG_CONTEXT (context_x11));
 
   if ((xevent->xany.type == PropertyNotify) &&
+      (xevent->xany.window == GDK_SURFACE_XID (GDK_DRAG_CONTEXT (context_x11)->source_surface)) &&
       (xevent->xproperty.atom == gdk_x11_get_xatom_by_name_for_display (display, "XdndActionList")))
     {
       xdnd_read_actions (context_x11);
-
-      return GDK_FILTER_REMOVE;
     }
 
-  return GDK_FILTER_CONTINUE;
+  return FALSE;
 }
 
 static void
@@ -1618,25 +1612,26 @@ xdnd_manage_source_filter (GdkDragContext *context,
     {
       GdkDisplay *display = gdk_drag_context_get_display (context);
 
-      gdk_x11_display_error_trap_push (display);
-
       if (add_filter)
         {
+          gdk_x11_display_error_trap_push (display);
           gdk_surface_set_events (surface,
-                                 gdk_surface_get_events (surface) |
-                                 GDK_PROPERTY_CHANGE_MASK);
-          g_object_set_data (G_OBJECT (surface), "xdnd-source-context", context);
+                                  gdk_surface_get_events (surface) |
+                                  GDK_PROPERTY_CHANGE_MASK);
+          gdk_x11_display_error_trap_pop_ignored (display);
+
+          g_signal_connect (display, "xevent", G_CALLBACK (xdnd_source_surface_filter), context);
         }
       else
         {
-          g_object_set_data (G_OBJECT (surface), "xdnd-source-context", NULL);
+          g_signal_handlers_disconnect_by_func (display,
+                                                xdnd_source_surface_filter,
+                                                context);
           /* Should we remove the GDK_PROPERTY_NOTIFY mask?
            * but we might want it for other reasons. (Like
            * INCR selection transactions).
            */
         }
-
-      gdk_x11_display_error_trap_pop_ignored (display);
     }
 }
 
index 71c9b25f8c9e1300af8a62b2cd574c0050ad1b33..f1c55bcbd580beb6e7964e41d3c5e98131323e2a 100644 (file)
@@ -268,12 +268,6 @@ gdk_event_source_translate_event (GdkX11Display  *x11_display,
   if (result == GDK_FILTER_CONTINUE)
     result = _gdk_x11_dnd_filter (xevent, event, NULL);
 
-  if (result == GDK_FILTER_CONTINUE && filter_surface)
-    {
-      gpointer context = g_object_get_data (G_OBJECT (filter_surface), "xdnd-source-context");
-      result = xdnd_source_surface_filter (xevent, event, context);
-    }
-
   if (result != GDK_FILTER_CONTINUE)
     {
       if (result == GDK_FILTER_REMOVE)
index 67d38b71f6bc8fc1544032039933c39baf00ab1b..e6bfd2bd82da9fa6f50571bf6519148abccf79ac 100644 (file)
@@ -202,11 +202,6 @@ _gdk_x11_dnd_filter (const XEvent *xevent,
                      GdkEvent     *event,
                      gpointer      data);
 
-GdkFilterReturn
-xdnd_source_surface_filter (const XEvent *xevent,
-                            GdkEvent     *event,
-                            gpointer      data);
-
 typedef struct _GdkSurfaceCache GdkSurfaceCache;
 
 GdkSurfaceCache *