diff --git a/src/core/input-events.c b/src/core/input-events.c index 46e755420..c0110ff4d 100644 --- a/src/core/input-events.c +++ b/src/core/input-events.c @@ -777,3 +777,46 @@ meta_input_event_get_device (MetaDisplay *display, return NULL; } + +MetaDevice * +meta_input_event_get_source_device (MetaDisplay *display, + XEvent *ev) +{ +#ifdef HAVE_XINPUT2 + if (ev->type == GenericEvent && + ev->xcookie.extension == display->xinput2_opcode) + { + XIEvent *xev; + + g_assert (display->have_xinput2 == TRUE); + + xev = (XIEvent *) ev->xcookie.data; + + switch (xev->evtype) + { + case XI_Motion: + case XI_ButtonPress: + case XI_ButtonRelease: + case XI_KeyPress: + case XI_KeyRelease: +#ifdef HAVE_XTOUCH + case XI_TouchBegin: + case XI_TouchEnd: + case XI_TouchUpdate: +#endif /* HAVE_XTOUCH */ + return meta_device_map_lookup (display->device_map, + ((XIDeviceEvent *) xev)->sourceid); + case XI_FocusIn: + case XI_FocusOut: + case XI_Enter: + case XI_Leave: + return meta_device_map_lookup (display->device_map, + ((XIEnterEvent *) xev)->sourceid); + default: + break; + } + } +#endif + + return NULL; +} diff --git a/src/core/input-events.h b/src/core/input-events.h index 939764d55..a53d1e3bc 100644 --- a/src/core/input-events.h +++ b/src/core/input-events.h @@ -80,6 +80,7 @@ gboolean meta_input_event_get_crossing_details (MetaDisplay *display, MetaDevice *meta_input_event_get_device (MetaDisplay *display, XEvent *ev); - +MetaDevice *meta_input_event_get_source_device (MetaDisplay *display, + XEvent *ev); #endif /* META_EVENT_H */