Chromium Code Reviews| Index: views/touchui/touch_factory.cc |
| diff --git a/views/touchui/touch_factory.cc b/views/touchui/touch_factory.cc |
| index 81dd41deb83ad7d7fb36c71f9d1969ebb4fd9437..4331044feb088eef1010c33dc1a73970a5e0b4f4 100644 |
| --- a/views/touchui/touch_factory.cc |
| +++ b/views/touchui/touch_factory.cc |
| @@ -29,9 +29,6 @@ XIValuatorClassInfo* FindTPValuator(Display* display, |
| views::TouchFactory::TouchParam tp) { |
| // Lookup table for mapping TouchParam to Atom string used in X. |
| // A full set of Atom strings can be found at xserver-properties.h. |
| - // For Slot ID, See this chromeos revision: http://git.chromium.org/gitweb/? |
| - // p=chromiumos/overlays/chromiumos-overlay.git; |
| - // a=commit;h=9164d0a75e48c4867e4ef4ab51f743ae231c059a |
| static struct { |
| views::TouchFactory::TouchParam tp; |
| const char* atom; |
| @@ -40,7 +37,12 @@ XIValuatorClassInfo* FindTPValuator(Display* display, |
| { views::TouchFactory::TP_TOUCH_MINOR, "Abs MT Touch Minor" }, |
| { views::TouchFactory::TP_ORIENTATION, "Abs MT Orientation" }, |
| { views::TouchFactory::TP_PRESSURE, "Abs MT Pressure" }, |
| +#if !defined(USE_XI2_1) |
| + // For Slot ID, See this chromeos revision: http://git.chromium.org/gitweb/? |
| + // p=chromiumos/overlays/chromiumos-overlay.git; |
| + // a=commit;h=9164d0a75e48c4867e4ef4ab51f743ae231c059a |
| { views::TouchFactory::TP_SLOT_ID, "Abs MT Slot ID" }, |
| +#endif |
| { views::TouchFactory::TP_TRACKING_ID, "Abs MT Tracking ID" }, |
| { views::TouchFactory::TP_LAST_ENTRY, NULL }, |
| }; |
| @@ -126,9 +128,11 @@ TouchFactory::TouchFactory() |
| : is_cursor_visible_(true), |
| keep_mouse_cursor_(false), |
| cursor_timer_(), |
| +#if !defined(USE_XI2_1) |
| + slots_used_(), |
| +#endif |
| pointer_device_lookup_(), |
| - touch_device_list_(), |
| - slots_used_() { |
| + touch_device_list_() { |
| #if defined(TOUCH_UI) |
| if (!base::MessagePumpForUI::HasXInput2()) |
| return; |
| @@ -190,6 +194,7 @@ void TouchFactory::UpdateDeviceList(Display* display) { |
| int count = 0; |
| touch_device_lookup_.reset(); |
| touch_device_list_.clear(); |
| +#if !defined(USE_XI2_1) |
| XDeviceInfo* devlist = XListInputDevices(display, &count); |
| for (int i = 0; i < count; i++) { |
| if (devlist[i].type) { |
| @@ -202,6 +207,7 @@ void TouchFactory::UpdateDeviceList(Display* display) { |
| } |
| if (devlist) |
| XFreeDeviceList(devlist); |
| +#endif |
| // Instead of asking X for the list of devices all the time, let's maintain a |
| // list of pointer devices we care about. |
| @@ -217,10 +223,26 @@ void TouchFactory::UpdateDeviceList(Display* display) { |
| // also select on the floating devices. |
| pointer_device_lookup_.reset(); |
| XIDeviceInfo* devices = XIQueryDevice(display, XIAllDevices, &count); |
| - for (int i = 0; i < count; i++) { |
| - XIDeviceInfo* devinfo = devices + i; |
| - if (devinfo->use == XIFloatingSlave || devinfo->use == XISlavePointer) { |
| - pointer_device_lookup_[devinfo->deviceid] = true; |
| + if (devices) { |
| + for (int i = 0; i < count; i++) { |
| + if (!devices[i].enabled) |
| + continue; |
| + XIDeviceInfo* devinfo = devices + i; |
| +#if defined(USE_XI2_1) |
| + for (int k = 0; k < devinfo->num_classes; ++k) { |
| + XIAnyClassInfo* xiclassinfo = devinfo->classes[k]; |
| + if (xiclassinfo->type == XITouchClass) { |
| + XITouchClassInfo* tci = (XITouchClassInfo *)xiclassinfo; |
| + // Only care direct touch device (such as touch screen) right now |
| + if (tci->mode == XIDirectTouch) { |
| + touch_device_lookup_[devinfo->deviceid] = true; |
| + touch_device_list_.push_back(devinfo->deviceid); |
| + } |
| + } |
| + } |
| +#endif |
| + if (devinfo->use == XIFloatingSlave || devinfo->use == XISlavePointer) |
| + pointer_device_lookup_[devinfo->deviceid] = true; |
| } |
| } |
| if (devices) |
| @@ -231,7 +253,16 @@ void TouchFactory::UpdateDeviceList(Display* display) { |
| bool TouchFactory::ShouldProcessXI2Event(XEvent* xev) { |
| DCHECK_EQ(GenericEvent, xev->type); |
| +#if defined(USE_XI2_1) |
| + XIEvent* event = static_cast<XIEvent*>(xev->xcookie.data); |
| + if (event->evtype != XI_TouchBegin && |
| + event->evtype != XI_TouchUpdate && |
| + event->evtype != XI_TouchEnd) |
| + return true; |
| + XIDeviceEvent* xiev = reinterpret_cast<XIDeviceEvent*>(event); |
| + return touch_device_lookup_[xiev->sourceid]; |
| +#else |
| XGenericEventCookie* cookie = &xev->xcookie; |
| if (cookie->evtype != XI_ButtonPress && |
| cookie->evtype != XI_ButtonRelease && |
| @@ -240,6 +271,7 @@ bool TouchFactory::ShouldProcessXI2Event(XEvent* xev) { |
| XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(cookie->data); |
| return pointer_device_lookup_[xiev->deviceid]; |
| +#endif |
| } |
| void TouchFactory::SetupXI2ForXWindow(Window window) { |
| @@ -255,9 +287,15 @@ void TouchFactory::SetupXI2ForXWindow(Window window) { |
| unsigned char mask[XIMaskLen(XI_LASTEVENT)]; |
| memset(mask, 0, sizeof(mask)); |
| +#if defined(USE_XI2_1) |
| + XISetMask(mask, XI_TouchBegin); |
| + XISetMask(mask, XI_TouchUpdate); |
| + XISetMask(mask, XI_TouchEnd); |
| +#else |
|
sadrul
2011/09/07 14:56:37
I think it'd be a good idea to select for XI_Butto
ningxin.hu
2011/09/08 08:24:50
Yes. It is really a good idea. I am working on thi
|
| XISetMask(mask, XI_ButtonPress); |
| XISetMask(mask, XI_ButtonRelease); |
| XISetMask(mask, XI_Motion); |
| +#endif |
| XIEventMask evmask; |
| evmask.deviceid = XIAllDevices; |
| @@ -286,6 +324,7 @@ bool TouchFactory::IsTouchDevice(unsigned deviceid) const { |
| touch_device_lookup_[deviceid] : false; |
| } |
| +#if !defined(USE_XI2_1) |
| bool TouchFactory::IsSlotUsed(int slot) const { |
| CHECK_LT(slot, kMaxTouchPoints); |
| return slots_used_[slot]; |
| @@ -295,6 +334,7 @@ void TouchFactory::SetSlotUsed(int slot, bool used) { |
| CHECK_LT(slot, kMaxTouchPoints); |
| slots_used_[slot] = used; |
| } |
| +#endif |
| bool TouchFactory::GrabTouchDevices(Display* display, ::Window window) { |
| #if defined(TOUCH_UI) |
| @@ -307,9 +347,15 @@ bool TouchFactory::GrabTouchDevices(Display* display, ::Window window) { |
| bool success = true; |
| memset(mask, 0, sizeof(mask)); |
| +#if defined(USE_XI2_1) |
| + XISetMask(mask, XI_TouchBegin); |
| + XISetMask(mask, XI_TouchUpdate); |
| + XISetMask(mask, XI_TouchEnd); |
| +#else |
|
sadrul
2011/09/07 14:56:37
ditto
ningxin.hu
2011/09/08 08:24:50
Will select touch and mouse events for XI2.1
|
| XISetMask(mask, XI_ButtonPress); |
| XISetMask(mask, XI_ButtonRelease); |
| XISetMask(mask, XI_Motion); |
| +#endif |
| XIEventMask evmask; |
| evmask.mask_len = sizeof(mask); |
| @@ -415,6 +461,12 @@ bool TouchFactory::ExtractTouchParam(const XEvent& xev, |
| return true; |
| } |
| + // With XInput 2.1, Tracking ID could be provided in the detail field |
| + if (tp == TP_TRACKING_ID) { |
| + *value = xiev->detail; |
| + return true; |
| + } |
| + |
| return false; |
| } |