Index: views/focus/accelerator_handler_touch.cc |
diff --git a/views/focus/accelerator_handler_touch.cc b/views/focus/accelerator_handler_touch.cc |
index 9473600afccf8571988005866e694ae796665549..a07b977de3b9011aec23f09d2cc032868cd97476 100644 |
--- a/views/focus/accelerator_handler_touch.cc |
+++ b/views/focus/accelerator_handler_touch.cc |
@@ -5,7 +5,11 @@ |
#include "views/focus/accelerator_handler.h" |
#include <gtk/gtk.h> |
+#if defined(HAVE_XINPUT2) |
+#include <X11/extensions/XInput2.h> |
+#else |
#include <X11/Xlib.h> |
+#endif |
#include "views/accelerator.h" |
#include "views/event.h" |
@@ -34,11 +38,81 @@ RootView* FindRootViewForGdkWindow(GdkWindow* gdk_window) { |
return widget_gtk->GetRootView(); |
} |
+#if defined(HAVE_XINPUT2) |
+bool X2EventIsTouchEvent(XEvent* xev) { |
+ // TODO(sad): Determine if the captured event is a touch-event. |
+ return false; |
+} |
+#endif // HAVE_XINPUT2 |
+ |
} // namespace |
+#if defined(HAVE_XINPUT2) |
+bool DispatchX2Event(RootView* root, XEvent* xev) { |
+ if (X2EventIsTouchEvent(xev)) { |
+ // TODO(sad): Create a TouchEvent, and send it off to |root|. If the event |
+ // is processed by |root|, then return. Otherwise let it fall through so it |
+ // can be used (if desired) as a mouse event. |
+ |
+ // TouchEvent touch(xev); |
+ // if (root->OnTouchEvent(touch)) |
+ // return true; |
+ } |
+ |
+ XGenericEventCookie* cookie = &xev->xcookie; |
+ |
+ switch (cookie->evtype) { |
+ case XI_KeyPress: |
+ case XI_KeyRelease: { |
+ // TODO(sad): We don't capture XInput2 events from keyboard yet. |
+ break; |
+ } |
+ case XI_ButtonPress: |
+ case XI_ButtonRelease: { |
+ MouseEvent mouseev(xev); |
+ if (cookie->evtype == XI_ButtonPress) { |
+ return root->OnMousePressed(mouseev); |
+ } else { |
+ root->OnMouseReleased(mouseev, false); |
+ return true; |
+ } |
+ } |
+ |
+ case XI_Motion: { |
+ MouseEvent mouseev(xev); |
+ if (mouseev.GetType() == Event::ET_MOUSE_DRAGGED) { |
+ return root->OnMouseDragged(mouseev); |
+ } else { |
+ root->OnMouseMoved(mouseev); |
+ return true; |
+ } |
+ break; |
+ } |
+ } |
+ |
+ return false; |
+} |
+ |
+#endif // HAVE_XINPUT2 |
+ |
bool DispatchXEvent(XEvent* xev) { |
GdkDisplay* gdisp = gdk_display_get_default(); |
- GdkWindow* gwind = gdk_window_lookup_for_display(gdisp, xev->xany.window); |
+ XID xwindow = xev->xany.window; |
+ |
+#if defined(HAVE_XINPUT2) |
+ if (xev->type == GenericEvent) { |
+ if (XGetEventData(xev->xgeneric.display, &xev->xcookie)) { |
+ XGenericEventCookie* cookie = &xev->xcookie; |
+ XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(cookie->data); |
+ xwindow = xiev->event; |
+ } else { |
+ DLOG(WARNING) << "Error fetching XGenericEventCookie for event."; |
+ return false; |
+ } |
+ } |
+#endif |
+ |
+ GdkWindow* gwind = gdk_window_lookup_for_display(gdisp, xwindow); |
if (RootView* root = FindRootViewForGdkWindow(gwind)) { |
switch (xev->type) { |
@@ -77,6 +151,14 @@ bool DispatchXEvent(XEvent* xev) { |
return true; |
} |
} |
+ |
+#if defined(HAVE_XINPUT2) |
+ case GenericEvent: { |
+ bool ret = DispatchX2Event(root, xev); |
+ XFreeEventData(xev->xgeneric.display, &xev->xcookie); |
+ return ret; |
+ } |
+#endif |
} |
} |