diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index e7742bd21b..18be58fcec 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -1446,7 +1446,6 @@ _gdk_x11_display_open (const gchar *display_name) #endif gdk_x11_display_init_input (display); - _gdk_x11_display_init_dnd (display); for (i = 0; i < ScreenCount (display_x11->xdisplay); i++) _gdk_x11_screen_setup (display_x11->screens[i]); diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index 2784060c59..ee557c677f 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -3125,18 +3125,32 @@ xdnd_drop_filter (GdkXEvent *xev, return GDK_FILTER_REMOVE; } -void -_gdk_x11_display_init_dnd (GdkDisplay *display) +GdkFilterReturn +_gdk_x11_dnd_filter (GdkXEvent *xev, + GdkEvent *event, + gpointer data) { + XEvent *xevent = (XEvent *) xev; + GdkDisplay *display; int i; + if (!GDK_IS_X11_WINDOW (event->any.window)) + return GDK_FILTER_CONTINUE; + + if (xevent->type != ClientMessage) + return GDK_FILTER_CONTINUE; + + display = GDK_WINDOW_DISPLAY (event->any.window); + for (i = 0; i < G_N_ELEMENTS (xdnd_filters); i++) { - gdk_display_add_client_message_filter ( - display, - gdk_atom_intern_static_string (xdnd_filters[i].atom_name), - xdnd_filters[i].func, NULL); + if (xevent->xclient.message_type != gdk_x11_get_xatom_by_name_for_display (display, xdnd_filters[i].atom_name)) + continue; + + return xdnd_filters[i].func (xev, event, data); } + + return GDK_FILTER_CONTINUE; } /* Source side */ diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index 469e019d5f..e4cce5f9c6 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -120,6 +120,9 @@ _gdk_x11_windowing_init (void) gdk_window_add_filter (NULL, _gdk_wm_protocols_filter, NULL); + gdk_window_add_filter (NULL, + _gdk_x11_dnd_filter, + NULL); } GdkGrabStatus diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index d4114c9108..7a69805bbf 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -286,7 +286,10 @@ void _gdk_x11_precache_atoms (GdkDisplay *display, const gchar * const *atom_names, gint n_atoms); -void _gdk_x11_display_init_dnd (GdkDisplay *display); +GdkFilterReturn +_gdk_x11_dnd_filter (GdkXEvent *xev, + GdkEvent *event, + gpointer data); void _gdk_x11_screen_init_root_window (GdkScreen *screen); void _gdk_x11_screen_init_visuals (GdkScreen *screen);