summaryrefslogtreecommitdiffstats
path: root/views/events
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-28 16:18:02 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-28 16:18:02 +0000
commit03ed0251f417df026b23de8685be145c893d7e2d (patch)
treee9f2f173a16a0076c7805b8a44b79d42036907df /views/events
parent8a0b9ca58bb4a04b4a3c0bba97687a0dc0c8c056 (diff)
downloadchromium_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.cc45
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;