gdk: Add _gdk_x11_event_translator_get_window()
This method can be implemented by event translators so they return the right window from XGenericEventCookie events, as ev->xany.window isn't meaningful for these. GdkEventSource now also uses this to find out the right window filters to apply.
This commit is contained in:
		| @ -97,11 +97,30 @@ gdk_event_apply_filters (XEvent    *xevent, | |||||||
| } | } | ||||||
|  |  | ||||||
| static GdkWindow * | static GdkWindow * | ||||||
| gdk_event_source_get_filter_window (GdkEventSource *event_source, | gdk_event_source_get_filter_window (GdkEventSource      *event_source, | ||||||
|                                     XEvent         *xevent) |                                     XEvent              *xevent, | ||||||
|  |                                     GdkEventTranslator **event_translator) | ||||||
| { | { | ||||||
|  |   GList *list = event_source->translators; | ||||||
|   GdkWindow *window; |   GdkWindow *window; | ||||||
|  |  | ||||||
|  |   *event_translator = NULL; | ||||||
|  |  | ||||||
|  |   while (list) | ||||||
|  |     { | ||||||
|  |       GdkEventTranslator *translator = list->data; | ||||||
|  |  | ||||||
|  |       list = list->next; | ||||||
|  |       window = _gdk_x11_event_translator_get_window (translator, | ||||||
|  |                                                      event_source->display, | ||||||
|  |                                                      xevent); | ||||||
|  |       if (window) | ||||||
|  |         { | ||||||
|  |           *event_translator = translator; | ||||||
|  |           return window; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|   window = gdk_x11_window_lookup_for_display (event_source->display, |   window = gdk_x11_window_lookup_for_display (event_source->display, | ||||||
|                                               xevent->xany.window); |                                               xevent->xany.window); | ||||||
|  |  | ||||||
| @ -151,8 +170,8 @@ gdk_event_source_translate_event (GdkEventSource *event_source, | |||||||
|                                   XEvent         *xevent) |                                   XEvent         *xevent) | ||||||
| { | { | ||||||
|   GdkEvent *event = gdk_event_new (GDK_NOTHING); |   GdkEvent *event = gdk_event_new (GDK_NOTHING); | ||||||
|   GList *list = event_source->translators; |  | ||||||
|   GdkFilterReturn result = GDK_FILTER_CONTINUE; |   GdkFilterReturn result = GDK_FILTER_CONTINUE; | ||||||
|  |   GdkEventTranslator *event_translator; | ||||||
|   GdkWindow *filter_window; |   GdkWindow *filter_window; | ||||||
|   Display *dpy; |   Display *dpy; | ||||||
|  |  | ||||||
| @ -164,7 +183,8 @@ gdk_event_source_translate_event (GdkEventSource *event_source, | |||||||
|   if (xevent->type == GenericEvent) |   if (xevent->type == GenericEvent) | ||||||
|     XGetEventData (dpy, &xevent->xcookie); |     XGetEventData (dpy, &xevent->xcookie); | ||||||
|  |  | ||||||
|   filter_window = gdk_event_source_get_filter_window (event_source, xevent); |   filter_window = gdk_event_source_get_filter_window (event_source, xevent, | ||||||
|  |                                                       &event_translator); | ||||||
|   if (filter_window) |   if (filter_window) | ||||||
|     event->any.window = g_object_ref (filter_window); |     event->any.window = g_object_ref (filter_window); | ||||||
|  |  | ||||||
| @ -199,15 +219,27 @@ gdk_event_source_translate_event (GdkEventSource *event_source, | |||||||
|   gdk_event_free (event); |   gdk_event_free (event); | ||||||
|   event = NULL; |   event = NULL; | ||||||
|  |  | ||||||
|   while (list && !event) |   if (event_translator) | ||||||
|     { |     { | ||||||
|       GdkEventTranslator *translator = list->data; |       /* Event translator was gotten before in get_filter_window() */ | ||||||
|  |       event = _gdk_x11_event_translator_translate (event_translator, | ||||||
|       list = list->next; |  | ||||||
|       event = _gdk_x11_event_translator_translate (translator, |  | ||||||
|                                                    event_source->display, |                                                    event_source->display, | ||||||
|                                                    xevent); |                                                    xevent); | ||||||
|     } |     } | ||||||
|  |   else | ||||||
|  |     { | ||||||
|  |       GList *list = event_source->translators; | ||||||
|  |  | ||||||
|  |       while (list && !event) | ||||||
|  |         { | ||||||
|  |           GdkEventTranslator *translator = list->data; | ||||||
|  |  | ||||||
|  |           list = list->next; | ||||||
|  |           event = _gdk_x11_event_translator_translate (translator, | ||||||
|  |                                                        event_source->display, | ||||||
|  |                                                        xevent); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|   if (event && |   if (event && | ||||||
|       (event->type == GDK_ENTER_NOTIFY || |       (event->type == GDK_ENTER_NOTIFY || | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ | |||||||
| #include "config.h" | #include "config.h" | ||||||
|  |  | ||||||
| #include "gdkeventtranslator.h" | #include "gdkeventtranslator.h" | ||||||
|  | #include "gdkwindow-x11.h" | ||||||
|  |  | ||||||
| typedef GdkEventTranslatorIface GdkEventTranslatorInterface; | typedef GdkEventTranslatorIface GdkEventTranslatorInterface; | ||||||
| G_DEFINE_INTERFACE (GdkEventTranslator, _gdk_x11_event_translator, G_TYPE_OBJECT); | G_DEFINE_INTERFACE (GdkEventTranslator, _gdk_x11_event_translator, G_TYPE_OBJECT); | ||||||
| @ -87,3 +87,24 @@ _gdk_x11_event_translator_select_window_events (GdkEventTranslator *translator, | |||||||
|   if (iface->select_window_events) |   if (iface->select_window_events) | ||||||
|     iface->select_window_events (translator, window, event_mask); |     iface->select_window_events (translator, window, event_mask); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | GdkWindow * | ||||||
|  | _gdk_x11_event_translator_get_window (GdkEventTranslator *translator, | ||||||
|  |                                       GdkDisplay         *display, | ||||||
|  |                                       XEvent             *xevent) | ||||||
|  | { | ||||||
|  |   GdkEventTranslatorIface *iface; | ||||||
|  |   GdkWindow *window = NULL; | ||||||
|  |  | ||||||
|  |   g_return_val_if_fail (GDK_IS_EVENT_TRANSLATOR (translator), NULL); | ||||||
|  |  | ||||||
|  |   iface = GDK_EVENT_TRANSLATOR_GET_IFACE (translator); | ||||||
|  |  | ||||||
|  |   if (iface->get_window) | ||||||
|  |     window = iface->get_window (translator, xevent); | ||||||
|  |  | ||||||
|  |   if (!window) | ||||||
|  |     window = gdk_x11_window_lookup_for_display (display, xevent->xany.window); | ||||||
|  |  | ||||||
|  |   return window; | ||||||
|  | } | ||||||
|  | |||||||
| @ -49,6 +49,8 @@ struct _GdkEventTranslatorIface | |||||||
|   void         (* select_window_events) (GdkEventTranslator *translator, |   void         (* select_window_events) (GdkEventTranslator *translator, | ||||||
|                                          Window              window, |                                          Window              window, | ||||||
|                                          GdkEventMask        event_mask); |                                          GdkEventMask        event_mask); | ||||||
|  |   GdkWindow *  (* get_window)           (GdkEventTranslator *translator, | ||||||
|  |                                          XEvent             *xevent); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| GType      _gdk_x11_event_translator_get_type (void) G_GNUC_CONST; | GType      _gdk_x11_event_translator_get_type (void) G_GNUC_CONST; | ||||||
| @ -60,6 +62,9 @@ GdkEventMask _gdk_x11_event_translator_get_handled_events   (GdkEventTranslator | |||||||
| void         _gdk_x11_event_translator_select_window_events (GdkEventTranslator *translator, | void         _gdk_x11_event_translator_select_window_events (GdkEventTranslator *translator, | ||||||
|                                                              Window              window, |                                                              Window              window, | ||||||
|                                                              GdkEventMask        event_mask); |                                                              GdkEventMask        event_mask); | ||||||
|  | GdkWindow *  _gdk_x11_event_translator_get_window           (GdkEventTranslator *translator, | ||||||
|  |                                                              GdkDisplay         *display, | ||||||
|  |                                                              XEvent             *xevent); | ||||||
|  |  | ||||||
| G_END_DECLS | G_END_DECLS | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 Carlos Garnacho
					Carlos Garnacho