Index: ui/base/x/events_x.cc |
diff --git a/ui/base/x/events_x.cc b/ui/base/x/events_x.cc |
index e82a06a4afd73765d217125cdb05f19bc3ec2d9f..9aa84d7702ff49f3590af15c2cb8253f50281cbe 100644 |
--- a/ui/base/x/events_x.cc |
+++ b/ui/base/x/events_x.cc |
@@ -40,6 +40,8 @@ |
#define AXIS_LABEL_PROP_ABS_FLING_Y "Abs Fling Y Velocity" |
#define AXIS_LABEL_PROP_ABS_FLING_STATE "Abs Fling State" |
+#define AXIS_LABEL_PROP_ABS_FINGER_COUNT "Abs Finger Count" |
+ |
// New versions of the valuators, with double values instead of fixed point. |
#define AXIS_LABEL_PROP_ABS_DBL_START_TIME "Abs Dbl Start Timestamp" |
#define AXIS_LABEL_PROP_ABS_DBL_END_TIME "Abs Dbl End Timestamp" |
@@ -66,6 +68,7 @@ const char* kCMTCachedAtoms[] = { |
AXIS_LABEL_PROP_ABS_DBL_FLING_VX, |
AXIS_LABEL_PROP_ABS_DBL_FLING_VY, |
AXIS_LABEL_PROP_ABS_FLING_STATE, |
+ AXIS_LABEL_PROP_ABS_FINGER_COUNT, |
NULL |
}; |
@@ -121,6 +124,7 @@ class CMTEventData { |
Atom fling_vy = atom_cache_.GetAtom(AXIS_LABEL_PROP_ABS_FLING_Y); |
Atom fling_vy_dbl = atom_cache_.GetAtom(AXIS_LABEL_PROP_ABS_DBL_FLING_VY); |
Atom fling_state = atom_cache_.GetAtom(AXIS_LABEL_PROP_ABS_FLING_STATE); |
+ Atom finger_count = atom_cache_.GetAtom(AXIS_LABEL_PROP_ABS_FINGER_COUNT); |
for (int i = 0; i < count; ++i) { |
XIDeviceInfo* info = info_list + i; |
@@ -149,6 +153,9 @@ class CMTEventData { |
} else if (v->label == y_axis) { |
valuators.scroll_y = number; |
is_cmt = true; |
+ } else if (v->label == finger_count) { |
+ valuators.finger_count = number; |
+ is_cmt = true; |
} else if (v->label == start_time) { |
valuators.start_time = number; |
is_cmt = true; |
@@ -222,13 +229,18 @@ class CMTEventData { |
// Returns true if this is a scroll event (a motion event with the necessary |
// valuators. Also returns the offsets. |x_offset| and |y_offset| can be |
// NULL. |
- bool GetScrollOffsets(const XEvent& xev, float* x_offset, float* y_offset) { |
+ bool GetScrollOffsets(const XEvent& xev, |
+ float* x_offset, |
+ float* y_offset, |
+ int* finger_count) { |
XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data); |
if (x_offset) |
*x_offset = 0; |
if (y_offset) |
*y_offset = 0; |
+ if (finger_count) |
+ *finger_count = 2; |
const int sourceid = xiev->sourceid; |
if (!cmt_devices_[sourceid]) |
@@ -250,6 +262,8 @@ class CMTEventData { |
*x_offset = *valuators * natural_scroll_factor; |
else if (y_offset && v.scroll_y == i) |
*y_offset = *valuators * natural_scroll_factor; |
+ else if (finger_count && v.finger_count == i) |
+ *finger_count = static_cast<int>(*valuators); |
valuators++; |
} |
} |
@@ -358,6 +372,7 @@ class CMTEventData { |
int max; |
int scroll_x; |
int scroll_y; |
+ int finger_count; |
int start_time; |
int end_time; |
int fling_vx; |
@@ -373,6 +388,7 @@ class CMTEventData { |
: max(-1), |
scroll_x(-1), |
scroll_y(-1), |
+ finger_count(-1), |
start_time(-1), |
end_time(-1), |
fling_vx(-1), |
@@ -749,7 +765,7 @@ EventType EventTypeFromNative(const base::NativeEvent& native_event) { |
bool is_cancel; |
if (GetFlingData(native_event, &vx, &vy, &is_cancel)) { |
return is_cancel ? ET_SCROLL_FLING_CANCEL : ET_SCROLL_FLING_START; |
- } else if (GetScrollOffsets(native_event, NULL, NULL)) { |
+ } else if (GetScrollOffsets(native_event, NULL, NULL, NULL)) { |
return ET_SCROLL; |
} else if (GetButtonMaskForX2Event(xievent)) { |
return ET_MOUSE_DRAGGED; |
@@ -1066,9 +1082,10 @@ float GetTouchForce(const base::NativeEvent& native_event) { |
bool GetScrollOffsets(const base::NativeEvent& native_event, |
float* x_offset, |
- float* y_offset) { |
+ float* y_offset, |
+ int* finger_count) { |
return CMTEventData::GetInstance()->GetScrollOffsets( |
- *native_event, x_offset, y_offset); |
+ *native_event, x_offset, y_offset, finger_count); |
} |
bool GetFlingData(const base::NativeEvent& native_event, |