| 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
|
| }
|
| }
|
|
|
|
|