| Index: ui/base/x/events_x.cc
|
| diff --git a/ui/base/x/events_x.cc b/ui/base/x/events_x.cc
|
| index 14b8da13759b760bf02e7cd199e24f227da6d019..00cafb5a79326a0fe70dc7bbcce0f10769271ece 100644
|
| --- a/ui/base/x/events_x.cc
|
| +++ b/ui/base/x/events_x.cc
|
| @@ -36,6 +36,10 @@
|
| #define AXIS_LABEL_PROP_ABS_START_TIME "Abs Start Timestamp"
|
| #define AXIS_LABEL_PROP_ABS_END_TIME "Abs End Timestamp"
|
|
|
| +// Ordinal values
|
| +#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X "Abs Dbl Ordinal X"
|
| +#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y "Abs Dbl Ordinal Y"
|
| +
|
| // Fling properties
|
| #define AXIS_LABEL_PROP_ABS_FLING_X "Abs Fling X Velocity"
|
| #define AXIS_LABEL_PROP_ABS_FLING_Y "Abs Fling Y Velocity"
|
| @@ -58,6 +62,8 @@ const int kMinWheelButton = 4;
|
| const int kMaxWheelButton = 7;
|
|
|
| const char* kCMTCachedAtoms[] = {
|
| + AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X,
|
| + AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y,
|
| AXIS_LABEL_PROP_REL_HWHEEL,
|
| AXIS_LABEL_PROP_REL_WHEEL,
|
| AXIS_LABEL_PROP_ABS_START_TIME,
|
| @@ -111,6 +117,8 @@ class CMTEventData {
|
| ui::DeviceListCacheX::GetInstance()->GetXI2DeviceList(display);
|
| Atom x_axis = atom_cache_.GetAtom(AXIS_LABEL_PROP_REL_HWHEEL);
|
| Atom y_axis = atom_cache_.GetAtom(AXIS_LABEL_PROP_REL_WHEEL);
|
| + Atom x_ordinal = atom_cache_.GetAtom(AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X);
|
| + Atom y_ordinal = atom_cache_.GetAtom(AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y);
|
| Atom start_time = atom_cache_.GetAtom(AXIS_LABEL_PROP_ABS_START_TIME);
|
| Atom start_time_dbl =
|
| atom_cache_.GetAtom(AXIS_LABEL_PROP_ABS_DBL_START_TIME);
|
| @@ -150,6 +158,12 @@ class CMTEventData {
|
| } else if (v->label == y_axis) {
|
| valuators.scroll_y = number;
|
| is_cmt = true;
|
| + } else if (v->label == x_ordinal) {
|
| + valuators.ordinal_x = number;
|
| + is_cmt = true;
|
| + } else if (v->label == y_ordinal) {
|
| + valuators.ordinal_y = number;
|
| + is_cmt = true;
|
| } else if (v->label == finger_count) {
|
| valuators.finger_count = number;
|
| is_cmt = true;
|
| @@ -227,6 +241,8 @@ class CMTEventData {
|
| bool GetScrollOffsets(const XEvent& xev,
|
| float* x_offset,
|
| float* y_offset,
|
| + float* x_offset_ordinal,
|
| + float* y_offset_ordinal,
|
| int* finger_count) {
|
| XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
|
|
|
| @@ -234,7 +250,11 @@ class CMTEventData {
|
| *x_offset = 0;
|
| if (y_offset)
|
| *y_offset = 0;
|
| - if (finger_count)
|
| + if (x_offset_ordinal)
|
| + *x_offset_ordinal = 0;
|
| + if (y_offset_ordinal)
|
| + *y_offset_ordinal = 0;
|
| + if (finger_count)
|
| *finger_count = 2;
|
|
|
| const int sourceid = xiev->sourceid;
|
| @@ -257,6 +277,10 @@ class CMTEventData {
|
| *x_offset = *valuators * natural_scroll_factor;
|
| else if (y_offset && v.scroll_y == i)
|
| *y_offset = *valuators * natural_scroll_factor;
|
| + else if (x_offset_ordinal && v.ordinal_x == i)
|
| + *x_offset_ordinal = *valuators * natural_scroll_factor;
|
| + else if (y_offset_ordinal && v.ordinal_y == i)
|
| + *y_offset_ordinal = *valuators * natural_scroll_factor;
|
| else if (finger_count && v.finger_count == i)
|
| *finger_count = static_cast<int>(*valuators);
|
| valuators++;
|
| @@ -268,12 +292,20 @@ class CMTEventData {
|
|
|
| bool GetFlingData(const XEvent& xev,
|
| float* vx, float* vy,
|
| + float* vx_ordinal, float* vy_ordinal,
|
| bool* is_cancel) {
|
| XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data);
|
|
|
| - *vx = 0;
|
| - *vy = 0;
|
| - *is_cancel = false;
|
| + if (vx)
|
| + *vx = 0;
|
| + if (vy)
|
| + *vy = 0;
|
| + if (vx_ordinal)
|
| + *vx_ordinal = 0;
|
| + if (vy_ordinal)
|
| + *vy_ordinal = 0;
|
| + if (is_cancel)
|
| + *is_cancel = false;
|
|
|
| const int sourceid = xiev->sourceid;
|
| if (!cmt_devices_[sourceid])
|
| @@ -293,18 +325,22 @@ class CMTEventData {
|
| if (XIMaskIsSet(xiev->valuators.mask, i)) {
|
| // Convert values to unsigned ints representing ms before storing them,
|
| // as that is how they were encoded before conversion to doubles.
|
| - if (v.fling_vx_dbl == i) {
|
| + if (vx && v.fling_vx_dbl == i) {
|
| *vx = natural_scroll_factor * *valuators;
|
| - } else if (v.fling_vx == i) {
|
| + } else if (vx && v.fling_vx == i) {
|
| *vx = natural_scroll_factor *
|
| static_cast<double>(static_cast<int>(*valuators)) / 1000.0f;
|
| - } else if (v.fling_vy_dbl == i) {
|
| + } else if (vy && v.fling_vy_dbl == i) {
|
| *vy = natural_scroll_factor * *valuators;
|
| - } else if (v.fling_vy == i) {
|
| + } else if (vy && v.fling_vy == i) {
|
| *vy = natural_scroll_factor *
|
| static_cast<double>(static_cast<int>(*valuators)) / 1000.0f;
|
| - } else if (v.fling_state == i) {
|
| + } else if (is_cancel && v.fling_state == i) {
|
| *is_cancel = !!static_cast<unsigned int>(*valuators);
|
| + } else if (vx_ordinal && v.ordinal_x == i) {
|
| + *vx_ordinal = *valuators * natural_scroll_factor;
|
| + } else if (vy_ordinal && v.ordinal_y == i) {
|
| + *vy_ordinal = *valuators * natural_scroll_factor;
|
| }
|
| valuators++;
|
| }
|
| @@ -367,6 +403,8 @@ class CMTEventData {
|
| int max;
|
| int scroll_x;
|
| int scroll_y;
|
| + int ordinal_x;
|
| + int ordinal_y;
|
| int finger_count;
|
| int start_time;
|
| int end_time;
|
| @@ -383,6 +421,8 @@ class CMTEventData {
|
| : max(-1),
|
| scroll_x(-1),
|
| scroll_y(-1),
|
| + ordinal_x(-1),
|
| + ordinal_y(-1),
|
| finger_count(-1),
|
| start_time(-1),
|
| end_time(-1),
|
| @@ -790,11 +830,11 @@ EventType EventTypeFromNative(const base::NativeEvent& native_event) {
|
| return ET_MOUSE_RELEASED;
|
| }
|
| case XI_Motion: {
|
| - float vx, vy;
|
| bool is_cancel;
|
| - if (GetFlingData(native_event, &vx, &vy, &is_cancel)) {
|
| + if (GetFlingData(native_event, NULL, NULL, NULL, NULL, &is_cancel)) {
|
| return is_cancel ? ET_SCROLL_FLING_CANCEL : ET_SCROLL_FLING_START;
|
| - } else if (GetScrollOffsets(native_event, NULL, NULL, NULL)) {
|
| + } else if (GetScrollOffsets(
|
| + native_event, NULL, NULL, NULL, NULL, NULL)) {
|
| return ET_SCROLL;
|
| } else if (GetButtonMaskForX2Event(xievent)) {
|
| return ET_MOUSE_DRAGGED;
|
| @@ -1112,17 +1152,24 @@ float GetTouchForce(const base::NativeEvent& native_event) {
|
| bool GetScrollOffsets(const base::NativeEvent& native_event,
|
| float* x_offset,
|
| float* y_offset,
|
| + float* x_offset_ordinal,
|
| + float* y_offset_ordinal,
|
| int* finger_count) {
|
| return CMTEventData::GetInstance()->GetScrollOffsets(
|
| - *native_event, x_offset, y_offset, finger_count);
|
| + *native_event,
|
| + x_offset, y_offset,
|
| + x_offset_ordinal, y_offset_ordinal,
|
| + finger_count);
|
| }
|
|
|
| bool GetFlingData(const base::NativeEvent& native_event,
|
| float* vx,
|
| float* vy,
|
| + float* vx_ordinal,
|
| + float* vy_ordinal,
|
| bool* is_cancel) {
|
| return CMTEventData::GetInstance()->GetFlingData(
|
| - *native_event, vx, vy, is_cancel);
|
| + *native_event, vx, vy, vx_ordinal, vy_ordinal, is_cancel);
|
| }
|
|
|
| bool GetGestureTimes(const base::NativeEvent& native_event,
|
|
|