| Index: ui/events/x/device_data_manager.cc
|
| diff --git a/ui/events/x/device_data_manager.cc b/ui/events/x/device_data_manager.cc
|
| index cac9dfda0bdbb6f93a7adf451f54070c25041984..a2e02928c4bb9288353d465c4e52f619682f06b4 100644
|
| --- a/ui/events/x/device_data_manager.cc
|
| +++ b/ui/events/x/device_data_manager.cc
|
| @@ -110,7 +110,8 @@
|
| }
|
|
|
| DeviceDataManager::DeviceDataManager()
|
| - : xi_opcode_(-1),
|
| + : natural_scroll_enabled_(false),
|
| + xi_opcode_(-1),
|
| atom_cache_(gfx::GetXDisplay(), kCachedAtoms),
|
| button_map_count_(0) {
|
| CHECK(gfx::GetXDisplay());
|
| @@ -174,6 +175,14 @@
|
|
|
| bool DeviceDataManager::IsXInput2Available() const {
|
| return xi_opcode_ != -1;
|
| +}
|
| +
|
| +float DeviceDataManager::GetNaturalScrollFactor(int sourceid) const {
|
| + // Natural scroll is touchpad-only.
|
| + if (sourceid >= kMaxDeviceNum || !touchpads_[sourceid])
|
| + return -1.0f;
|
| +
|
| + return natural_scroll_enabled_ ? 1.0f : -1.0f;
|
| }
|
|
|
| void DeviceDataManager::UpdateDeviceList(Display* display) {
|
| @@ -451,17 +460,20 @@
|
| *y_offset_ordinal = 0;
|
| *finger_count = 2;
|
|
|
| + XIDeviceEvent* xiev =
|
| + static_cast<XIDeviceEvent*>(native_event->xcookie.data);
|
| + const float natural_scroll_factor = GetNaturalScrollFactor(xiev->sourceid);
|
| EventData data;
|
| GetEventRawData(*native_event, &data);
|
|
|
| if (data.find(DT_CMT_SCROLL_X) != data.end())
|
| - *x_offset = data[DT_CMT_SCROLL_X];
|
| + *x_offset = data[DT_CMT_SCROLL_X] * natural_scroll_factor;
|
| if (data.find(DT_CMT_SCROLL_Y) != data.end())
|
| - *y_offset = data[DT_CMT_SCROLL_Y];
|
| + *y_offset = data[DT_CMT_SCROLL_Y] * natural_scroll_factor;
|
| if (data.find(DT_CMT_ORDINAL_X) != data.end())
|
| - *x_offset_ordinal = data[DT_CMT_ORDINAL_X];
|
| + *x_offset_ordinal = data[DT_CMT_ORDINAL_X] * natural_scroll_factor;
|
| if (data.find(DT_CMT_ORDINAL_Y) != data.end())
|
| - *y_offset_ordinal = data[DT_CMT_ORDINAL_Y];
|
| + *y_offset_ordinal = data[DT_CMT_ORDINAL_Y] * natural_scroll_factor;
|
| if (data.find(DT_CMT_FINGER_COUNT) != data.end())
|
| *finger_count = static_cast<int>(data[DT_CMT_FINGER_COUNT]);
|
| }
|
| @@ -476,19 +488,22 @@
|
| *vy_ordinal = 0;
|
| *is_cancel = false;
|
|
|
| + XIDeviceEvent* xiev =
|
| + static_cast<XIDeviceEvent*>(native_event->xcookie.data);
|
| + const float natural_scroll_factor = GetNaturalScrollFactor(xiev->sourceid);
|
| EventData data;
|
| GetEventRawData(*native_event, &data);
|
|
|
| if (data.find(DT_CMT_FLING_X) != data.end())
|
| - *vx = data[DT_CMT_FLING_X];
|
| + *vx = data[DT_CMT_FLING_X] * natural_scroll_factor;
|
| if (data.find(DT_CMT_FLING_Y) != data.end())
|
| - *vy = data[DT_CMT_FLING_Y];
|
| + *vy = data[DT_CMT_FLING_Y] * natural_scroll_factor;
|
| if (data.find(DT_CMT_FLING_STATE) != data.end())
|
| *is_cancel = !!static_cast<unsigned int>(data[DT_CMT_FLING_STATE]);
|
| if (data.find(DT_CMT_ORDINAL_X) != data.end())
|
| - *vx_ordinal = data[DT_CMT_ORDINAL_X];
|
| + *vx_ordinal = data[DT_CMT_ORDINAL_X] * natural_scroll_factor;
|
| if (data.find(DT_CMT_ORDINAL_Y) != data.end())
|
| - *vy_ordinal = data[DT_CMT_ORDINAL_Y];
|
| + *vy_ordinal = data[DT_CMT_ORDINAL_Y] * natural_scroll_factor;
|
| }
|
|
|
| void DeviceDataManager::GetMetricsData(const base::NativeEvent& native_event,
|
|
|