Add methods for getting event/filter window from the event, with default impl.

This commit is contained in:
Carlos Garnacho
2009-05-30 14:36:26 +02:00
parent a18600e21f
commit 1fa2f018ef
2 changed files with 112 additions and 0 deletions

View File

@@ -62,3 +62,103 @@ gdk_event_translator_translate (GdkEventTranslator *translator,
return NULL;
}
static GdkWindow *
get_gdk_window (GdkDisplay *display,
Window xwindow)
{
GdkWindow *window;
/* Now find out the corresponding GdkWindows */
window = gdk_window_lookup_for_display (display, xwindow);
/* We may receive events such as NoExpose/GraphicsExpose
* and ShmCompletion for pixmaps
*/
if (window && !GDK_IS_WINDOW (window))
window = NULL;
return window;
}
GdkWindow *
gdk_event_translator_get_event_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_event_window)
xwindow = (iface->get_event_window) (translator, xevent);
if (xwindow == None)
{
/* Default implementation */
switch (xevent->type)
{
case CreateNotify:
xwindow = xevent->xcreatewindow.window;
break;
case DestroyNotify:
xwindow = xevent->xdestroywindow.window;
break;
case UnmapNotify:
xwindow = xevent->xunmap.window;
break;
case MapNotify:
xwindow = xevent->xmap.window;
break;
case MapRequest:
xwindow = xevent->xmaprequest.window;
break;
case ReparentNotify:
xwindow = xevent->xreparent.window;
break;
case ConfigureNotify:
xwindow = xevent->xconfigure.window;
break;
case ConfigureRequest:
xwindow = xevent->xconfigurerequest.window;
break;
case GravityNotify:
xwindow = xevent->xgravity.window;
break;
case CirculateNotify:
xwindow = xevent->xcirculate.window;
break;
case CirculateRequest:
xwindow = xevent->xcirculaterequest.window;
break;
default:
xwindow = xevent->xany.window;
}
}
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);
}

View File

@@ -43,6 +43,11 @@ struct _GdkEventTranslatorIface
GdkDisplay *display,
GdkEvent *event,
XEvent *xevent);
Window (* get_event_window) (GdkEventTranslator *translator,
XEvent *xevent);
Window (* get_filter_window) (GdkEventTranslator *translator,
XEvent *xevent);
};
GType gdk_event_translator_get_type (void) G_GNUC_CONST;
@@ -51,6 +56,13 @@ GdkEvent * gdk_event_translator_translate (GdkEventTranslator *translator,
GdkDisplay *display,
XEvent *xevent);
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
#endif /* __GDK_EVENT_TRANSLATOR_H__ */