]> Pileus Git - ~andy/gtk/commitdiff
x11: Do dnd event handling via gdk_window_add_filter()
authorBenjamin Otte <otte@redhat.com>
Tue, 1 Feb 2011 05:12:51 +0000 (06:12 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 1 Feb 2011 05:33:02 +0000 (06:33 +0100)
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkdnd-x11.c
gdk/x11/gdkmain-x11.c
gdk/x11/gdkprivate-x11.h

index e7742bd21bc4c42b19bafb052bed44c7789f73d1..18be58fceca30165ed2f9a9f44384a19b75327bf 100644 (file)
@@ -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]);
index 2784060c59b16556dffed8881433ebd713442427..ee557c677f839faa2553b0b3155fcb78eac6180a 100644 (file)
@@ -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 */
index 469e019d5fe0d53c1d7da1b1128c7b9a733d11f5..e4cce5f9c65d4da1738a1e53d9a349dbc5ea2a02 100644 (file)
@@ -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
index d4114c9108358a71f7dcb30bb0726a1eb30ae355..7a69805bbf1471d78e5b5479c69431eb4995cb8e 100644 (file)
@@ -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);