[gtk+/events-refactor: 749/1085] GdkEventSource: Enable window filters.



commit 5899f40aea09ad4d8bc8ed159ecbfa7c97c64bf5
Author: Carlos Garnacho <carlos lanedo com>
Date:   Tue Aug 18 02:09:40 2009 +0200

    GdkEventSource: Enable window filters.
    
    commented out code has been removed in the event translators.

 gdk/x11/gdkdevicemanager-core.c |   46 +--------------------
 gdk/x11/gdkdisplay-x11.c        |   29 +-------------
 gdk/x11/gdkeventsource.c        |   85 +++++++++++++++++++++++++++++++++++---
 gdk/x11/gdkeventtranslator.c    |   21 ----------
 gdk/x11/gdkeventtranslator.h    |    3 -
 5 files changed, 81 insertions(+), 103 deletions(-)
---
diff --git a/gdk/x11/gdkdevicemanager-core.c b/gdk/x11/gdkdevicemanager-core.c
index 4775a83..b70f75a 100644
--- a/gdk/x11/gdkdevicemanager-core.c
+++ b/gdk/x11/gdkdevicemanager-core.c
@@ -311,7 +311,7 @@ gdk_device_manager_core_translate_event (GdkEventTranslator *translator,
                                          XEvent             *xevent)
 {
   GdkDeviceManagerCore *device_manager;
-  GdkWindow *window, *filter_window;
+  GdkWindow *window;
   GdkWindowObject *window_private;
   GdkWindowImplX11 *window_impl = NULL;
   gboolean return_val;
@@ -326,29 +326,11 @@ gdk_device_manager_core_translate_event (GdkEventTranslator *translator,
   window_private = NULL;
   event->any.window = NULL;
 
-  /* Run default filters */
-#if 0
-  if (_gdk_default_filters)
-    {
-      /* Apply global filters */
-      GdkFilterReturn result;
-      result = gdk_event_apply_filters (xevent, event,
-                                        _gdk_default_filters);
-
-      if (result != GDK_FILTER_CONTINUE)
-        {
-          return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
-          goto done;
-        }
-    }
-#endif
-
   /* Find the GdkWindow that this event relates to.
    * Basically this means substructure events
    * are reported same as structure events
    */
   window = gdk_event_translator_get_event_window (translator, display, xevent);
-  filter_window = gdk_event_translator_get_filter_window (translator, display, xevent);
   window_private = (GdkWindowObject *) window;
 
   if (window)
@@ -368,7 +350,7 @@ gdk_device_manager_core_translate_event (GdkEventTranslator *translator,
 	    case KeyPress:
 	    case KeyRelease:
 	      xwindow = GDK_WINDOW_XID (window);
-	      xevent->xany.window = xwindow;
+	      xevent->xany.window = xwindow
 	      break;
 	    default:
 	      return FALSE;
@@ -390,30 +372,6 @@ gdk_device_manager_core_translate_event (GdkEventTranslator *translator,
 	  goto done;
 	}
     }
-#if 0
-  else if (filter_window)
-    {
-      /* Apply per-window filters */
-      GdkWindowObject *filter_private = (GdkWindowObject *) filter_window;
-      GdkFilterReturn result;
-
-      if (filter_private->filters)
-	{
-	  g_object_ref (filter_window);
-
-	  result = gdk_event_apply_filters (xevent, event,
-					    filter_private->filters);
-
-	  g_object_unref (filter_window);
-
-	  if (result != GDK_FILTER_CONTINUE)
-	    {
-	      return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
-	      goto done;
-	    }
-	}
-    }
-#endif
 
   if (window &&
       (xevent->type == MotionNotify ||
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index d59209e..fbfae73 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -323,7 +323,7 @@ gdk_display_x11_translate_event (GdkEventTranslator *translator,
                                  GdkEvent           *event,
                                  XEvent             *xevent)
 {
-  GdkWindow *window, *filter_window;
+  GdkWindow *window;
   GdkWindowObject *window_private;
   GdkWindowImplX11 *window_impl = NULL;
   GdkScreen *screen = NULL;
@@ -333,14 +333,11 @@ gdk_display_x11_translate_event (GdkEventTranslator *translator,
   gboolean return_val;
   Window xwindow = None;
 
-  /* FIXME: default filters */
-
   /* Find the GdkWindow that this event relates to.
    * Basically this means substructure events
    * are reported same as structure events
    */
   window = gdk_event_translator_get_event_window (translator, display, xevent);
-  filter_window = gdk_event_translator_get_filter_window (translator, display, xevent);
   window_private = (GdkWindowObject *) window;
 
   if (window)
@@ -365,30 +362,6 @@ gdk_display_x11_translate_event (GdkEventTranslator *translator,
 	  goto done;
 	}
     }
-#if 0
-  else if (filter_window)
-    {
-      /* Apply per-window filters */
-      GdkWindowObject *filter_private = (GdkWindowObject *) filter_window;
-      GdkFilterReturn result;
-
-      if (filter_private->filters)
-	{
-	  g_object_ref (filter_window);
-
-	  result = gdk_event_apply_filters (xevent, event,
-					    filter_private->filters);
-
-	  g_object_unref (filter_window);
-
-	  if (result != GDK_FILTER_CONTINUE)
-	    {
-	      return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
-	      goto done;
-	    }
-	}
-    }
-#endif
 
   /* FIXME: if window is NULL, xwindow should still have something meaningful here? */
   if (xwindow != None &&
diff --git a/gdk/x11/gdkeventsource.c b/gdk/x11/gdkeventsource.c
index eac2f4b..b7adf4c 100644
--- a/gdk/x11/gdkeventsource.c
+++ b/gdk/x11/gdkeventsource.c
@@ -47,6 +47,44 @@ static GSourceFuncs event_funcs = {
 
 static GList *event_sources = NULL;
 
+static gint
+gdk_event_apply_filters (XEvent *xevent,
+			 GdkEvent *event,
+			 GList *filters)
+{
+  GList *tmp_list;
+  GdkFilterReturn result;
+
+  tmp_list = filters;
+
+  while (tmp_list)
+    {
+      GdkEventFilter *filter = (GdkEventFilter*) tmp_list->data;
+
+      tmp_list = tmp_list->next;
+      result = filter->function (xevent, event, filter->data);
+
+      if (result !=  GDK_FILTER_CONTINUE)
+	return result;
+    }
+
+  return GDK_FILTER_CONTINUE;
+}
+
+static GdkWindow *
+gdk_event_source_get_filter_window (GdkEventSource *event_source,
+                                    XEvent         *xevent)
+{
+  GdkWindow *window;
+
+  window = gdk_window_lookup_for_display (event_source->display,
+                                          xevent->xany.window);
+
+  if (window && !GDK_IS_WINDOW (window))
+    window = NULL;
+
+  return window;
+}
 
 static GdkEvent *
 gdk_event_source_translate_event (GdkEventSource *event_source,
@@ -54,6 +92,46 @@ gdk_event_source_translate_event (GdkEventSource *event_source,
 {
   GdkEvent *event = NULL;
   GList *list = event_source->translators;
+  GdkFilterReturn result;
+  GdkWindow *filter_window;
+
+  /* Run default filters */
+  if (_gdk_default_filters)
+    {
+      /* Apply global filters */
+
+      result = gdk_event_apply_filters (xevent, event,
+                                        _gdk_default_filters);
+
+      if (result == GDK_FILTER_REMOVE)
+        return NULL;
+      else if (result == GDK_FILTER_TRANSLATE)
+        return event;
+    }
+
+  filter_window = gdk_event_source_get_filter_window (event_source, xevent);
+
+  if (filter_window)
+    {
+      /* Apply per-window filters */
+      GdkWindowObject *filter_private = (GdkWindowObject *) filter_window;
+      GdkFilterReturn result;
+
+      if (filter_private->filters)
+	{
+	  g_object_ref (filter_window);
+
+	  result = gdk_event_apply_filters (xevent, event,
+					    filter_private->filters);
+
+	  g_object_unref (filter_window);
+
+          if (result == GDK_FILTER_REMOVE)
+            return NULL;
+          else if (result == GDK_FILTER_TRANSLATE)
+            return event;
+	}
+    }
 
   while (list && !event)
     {
@@ -205,13 +283,6 @@ gdk_event_source_new (GdkDisplay *display)
 
   event_sources = g_list_prepend (event_sources, source);
 
-#if 0
-  gdk_display_add_client_message_filter (display,
-					 gdk_atom_intern_static_string ("WM_PROTOCOLS"),
-					 gdk_wm_protocols_filter,
-					 NULL);
-#endif
-
   return source;
 }
 
diff --git a/gdk/x11/gdkeventtranslator.c b/gdk/x11/gdkeventtranslator.c
index 39b3c8d..66f45dd 100644
--- a/gdk/x11/gdkeventtranslator.c
+++ b/gdk/x11/gdkeventtranslator.c
@@ -141,24 +141,3 @@ gdk_event_translator_get_event_window (GdkEventTranslator *translator,
 
   return get_gdk_window (display, xwindow);
 }
-
-GdkWindow *
-gdk_event_translator_get_filter_window (GdkEventTranslator *translator,
-                                        GdkDisplay         *display,
-                                        XEvent             *xevent)
-{
-  GdkEventTranslatorIface *iface;
-  Window xwindow = None;
-
-  g_return_val_if_fail (GDK_IS_EVENT_TRANSLATOR (translator), NULL);
-
-  iface = GDK_EVENT_TRANSLATOR_GET_IFACE (translator);
-
-  if (iface->get_filter_window)
-    xwindow = (iface->get_filter_window) (translator, xevent);
-
-  if (xwindow == None)
-    xwindow = xevent->xany.window;
-
-  return get_gdk_window (display, xwindow);
-}
diff --git a/gdk/x11/gdkeventtranslator.h b/gdk/x11/gdkeventtranslator.h
index 4ec6cfc..a3efe56 100644
--- a/gdk/x11/gdkeventtranslator.h
+++ b/gdk/x11/gdkeventtranslator.h
@@ -59,9 +59,6 @@ GdkEvent * gdk_event_translator_translate (GdkEventTranslator *translator,
 GdkWindow * gdk_event_translator_get_event_window  (GdkEventTranslator *translator,
                                                     GdkDisplay         *display,
                                                     XEvent             *xevent);
-GdkWindow * gdk_event_translator_get_filter_window (GdkEventTranslator *translator,
-                                                    GdkDisplay         *display,
-                                                    XEvent             *xevent);
 
 G_END_DECLS
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]