[gtk+] x11: Do dnd event handling via gdk_window_add_filter()
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] x11: Do dnd event handling via gdk_window_add_filter()
- Date: Tue, 1 Feb 2011 05:33:45 +0000 (UTC)
commit 8ecd420ede894b904a5c6598f075f0cf74bebc2e
Author: Benjamin Otte <otte redhat com>
Date: Tue Feb 1 06:12:51 2011 +0100
x11: Do dnd event handling via gdk_window_add_filter()
gdk/x11/gdkdisplay-x11.c | 1 -
gdk/x11/gdkdnd-x11.c | 26 ++++++++++++++++++++------
gdk/x11/gdkmain-x11.c | 3 +++
gdk/x11/gdkprivate-x11.h | 5 ++++-
4 files changed, 27 insertions(+), 8 deletions(-)
---
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index e7742bd..18be58f 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 2784060..ee557c6 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 469e019..e4cce5f 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 d4114c9..7a69805 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);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]