From 5e159e2ca06f21b41a9be31ebaecfdac0ff01f67 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Wed, 6 Jun 2018 04:55:55 +0200 Subject: [PATCH] x11: Replace the hardcoded DND filter 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 | 37 ++++++++++++++++--------------------- gdk/x11/gdkeventsource.c | 6 ------ gdk/x11/gdkprivate-x11.h | 5 ----- 3 files changed, 16 insertions(+), 32 deletions(-) diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index 96993d74ec..0a66ce4e93 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -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); } } diff --git a/gdk/x11/gdkeventsource.c b/gdk/x11/gdkeventsource.c index 71c9b25f8c..f1c55bcbd5 100644 --- a/gdk/x11/gdkeventsource.c +++ b/gdk/x11/gdkeventsource.c @@ -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) diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index 67d38b71f6..e6bfd2bd82 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -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 * -- 2.30.2