diff options
author | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-28 16:18:02 +0000 |
---|---|---|
committer | sadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-28 16:18:02 +0000 |
commit | 03ed0251f417df026b23de8685be145c893d7e2d (patch) | |
tree | e9f2f173a16a0076c7805b8a44b79d42036907df /views/events | |
parent | 8a0b9ca58bb4a04b4a3c0bba97687a0dc0c8c056 (diff) | |
download | chromium_src-03ed0251f417df026b23de8685be145c893d7e2d.zip chromium_src-03ed0251f417df026b23de8685be145c893d7e2d.tar.gz chromium_src-03ed0251f417df026b23de8685be145c893d7e2d.tar.bz2 |
touchui: Convert XI2 MT tracking id to slot id.
The slot id mapped from tracking id is used as the touch id, and the gesture
recognizer expects touch points to always start from 0.
Patch from: Ningxin Hu <ningxin.hu@intel.com>
(http://codereview.chromium.org/7927001/)
BUG=95150
TEST=manually (touch-drag to scroll webpage, tap to click link)
Review URL: http://codereview.chromium.org/8070003
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@103122 0039d316-1c4b-4281-b951-d872f2087c98
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; |