]> Pileus Git - ~andy/gtk/commitdiff
x11: Register wm_protocols function with gdk_window_add_filter()
authorBenjamin Otte <otte@redhat.com>
Tue, 1 Feb 2011 04:31:41 +0000 (05:31 +0100)
committerBenjamin Otte <otte@redhat.com>
Tue, 1 Feb 2011 05:33:01 +0000 (06:33 +0100)
The client message code is about to go away, so we need to use a
different way to get at ClientMessage output.

gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkdisplay-x11.h
gdk/x11/gdkmain-x11.c

index 23dd5677f11841fee38332626677e3180aa18aef..e7742bd21bc4c42b19bafb052bed44c7789f73d1 100644 (file)
@@ -1016,21 +1016,28 @@ gdk_x11_display_translate_event (GdkEventTranslator *translator,
   return return_val;
 }
 
-static GdkFilterReturn
-gdk_wm_protocols_filter (GdkXEvent *xev,
-                        GdkEvent  *event,
-                        gpointer data)
+GdkFilterReturn
+_gdk_wm_protocols_filter (GdkXEvent *xev,
+                         GdkEvent  *event,
+                         gpointer   data)
 {
   XEvent *xevent = (XEvent *)xev;
   GdkWindow *win = event->any.window;
   GdkDisplay *display;
   Atom atom;
 
-  if (!win)
-      return GDK_FILTER_REMOVE;
+  if (!GDK_IS_X11_WINDOW (win))
+    return GDK_FILTER_CONTINUE;
+
+  if (xevent->type != ClientMessage)
+    return GDK_FILTER_CONTINUE;
 
   display = GDK_WINDOW_DISPLAY (win);
-  atom = (Atom)xevent->xclient.data.l[0];
+
+  if (xevent->xclient.message_type != gdk_x11_get_xatom_by_name_for_display (display, "WM_PROTOCOLS"))
+    return GDK_FILTER_CONTINUE;
+
+  atom = (Atom) xevent->xclient.data.l[0];
 
   if (atom == gdk_x11_get_xatom_by_name_for_display (display, "WM_DELETE_WINDOW"))
     {
@@ -1113,11 +1120,6 @@ gdk_event_init (GdkDisplay *display)
   device_manager = gdk_display_get_device_manager (display);
   gdk_x11_event_source_add_translator ((GdkEventSource *) display_x11->event_source,
                                         GDK_EVENT_TRANSLATOR (device_manager));
-
-  gdk_display_add_client_message_filter (display,
-                                         gdk_atom_intern_static_string ("WM_PROTOCOLS"),
-                                         gdk_wm_protocols_filter,
-                                         NULL);
 }
 
 static void
index cd72cfae625e2a164f482e09e7ad66d0e4d3e4b0..a18d647fb07d70bd97dcbdcdb1685c032e294711 100644 (file)
@@ -146,6 +146,10 @@ GdkScreen *_gdk_x11_display_screen_for_xrootwin (GdkDisplay  *display,
 void       _gdk_x11_display_error_event         (GdkDisplay  *display,
                                                  XErrorEvent *error);
 
+GdkFilterReturn _gdk_wm_protocols_filter        (GdkXEvent   *xev,
+                                                 GdkEvent    *event,
+                                                 gpointer     data);
+
 G_END_DECLS
 
 #endif  /* __GDK_X11_DISPLAY__ */
index 9cf087898f5d4a144d15d00f681a1cfce9f1830b..469e019d5fe0d53c1d7da1b1128c7b9a733d11f5 100644 (file)
@@ -116,6 +116,10 @@ _gdk_x11_windowing_init (void)
 {
   XSetErrorHandler (gdk_x_error);
   XSetIOErrorHandler (gdk_x_io_error);
+
+  gdk_window_add_filter (NULL,
+                         _gdk_wm_protocols_filter,
+                         NULL);
 }
 
 GdkGrabStatus