diff options
Diffstat (limited to 'views/events')
-rw-r--r-- | views/events/event_x.cc | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/views/events/event_x.cc b/views/events/event_x.cc index cbbc477..f5cfd43 100644 --- a/views/events/event_x.cc +++ b/views/events/event_x.cc @@ -20,20 +20,28 @@ namespace views { namespace { int GetTouchIDFromXEvent(XEvent* xev) { - float id = 0; + float slot = 0; + ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); + XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data); + if (!factory->IsRealTouchDevice(xievent->sourceid)) { + // TODO(sad): Come up with a way to generate touch-ids for multi-touch + // events when touch-events are generated from a mouse. + return slot; + } + #if defined(USE_XI2_MT) - // TODO(ningxin.hu@gmail.com): Make the id always start from 0 for a new - // touch-sequence when TRACKING_ID is used to extract the touch id. - ui::TouchFactory::TouchParam tp = ui::TouchFactory::TP_TRACKING_ID; + float tracking_id; + if (!factory->ExtractTouchParam( + *xev, ui::TouchFactory::TP_TRACKING_ID, &tracking_id)) + LOG(ERROR) << "Could not get the slot ID for the event. Using 0."; + else + slot = factory->GetSlotForTrackingID(tracking_id); #else - ui::TouchFactory::TouchParam tp = ui::TouchFactory::TP_SLOT_ID; + if (!factory->ExtractTouchParam( + *xev, ui::TouchFactory::TP_SLOT_ID, &slot)) + LOG(ERROR) << "Could not get the slot ID for the event. Using 0."; #endif - ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); - XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xev->xcookie.data); - if (factory->IsRealTouchDevice(xievent->sourceid) && - !factory->ExtractTouchParam(*xev, tp, &id)) - LOG(ERROR) << "Could not get the touch ID for the event. Using 0."; - return id; + return slot; } uint16 GetCharacterFromXKeyEvent(XKeyEvent* key) { @@ -174,7 +182,20 @@ TouchEvent::TouchEvent(const ui::NativeEvent& native_event) ui::TouchFactory::TP_ORIENTATION, 0.0)), force_(GetTouchForceFromXEvent(native_event)) { -#if !defined(USE_XI2_MT) +#if defined(USE_XI2_MT) + if (type() == ui::ET_TOUCH_RELEASED) { + // NOTE: The slot is allocated by TouchFactory for each XI_TouchBegin + // event, which carries a new tracking ID to identify a new touch + // sequence. + ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); + float tracking_id; + if (factory->ExtractTouchParam(*native_event, + ui::TouchFactory::TP_TRACKING_ID, + &tracking_id)) { + factory->ReleaseSlotForTrackingID(tracking_id); + } + } +#else if (type() == ui::ET_TOUCH_PRESSED || type() == ui::ET_TOUCH_RELEASED) { ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); float slot; |