OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/events/devices/x11/device_data_manager_x11.h" | 5 #include "ui/events/devices/x11/device_data_manager_x11.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 #include <X11/extensions/XInput.h> | 8 #include <X11/extensions/XInput.h> |
9 #include <X11/extensions/XInput2.h> | 9 #include <X11/extensions/XInput2.h> |
10 #include <X11/Xlib.h> | 10 #include <X11/Xlib.h> |
11 | 11 |
12 #include <utility> | 12 #include <utility> |
13 | 13 |
14 #include "base/bind.h" | 14 #include "base/bind.h" |
15 #include "base/bind_helpers.h" | 15 #include "base/bind_helpers.h" |
| 16 #include "base/command_line.h" |
16 #include "base/logging.h" | 17 #include "base/logging.h" |
17 #include "base/macros.h" | 18 #include "base/macros.h" |
18 #include "base/memory/singleton.h" | 19 #include "base/memory/singleton.h" |
19 #include "base/sys_info.h" | 20 #include "base/sys_info.h" |
20 #include "build/build_config.h" | 21 #include "build/build_config.h" |
21 #include "ui/display/display.h" | 22 #include "ui/display/display.h" |
22 #include "ui/events/devices/x11/device_list_cache_x11.h" | 23 #include "ui/events/devices/x11/device_list_cache_x11.h" |
23 #include "ui/events/devices/x11/touch_factory_x11.h" | 24 #include "ui/events/devices/x11/touch_factory_x11.h" |
24 #include "ui/events/event_constants.h" | 25 #include "ui/events/event_constants.h" |
25 #include "ui/events/event_switches.h" | 26 #include "ui/events/event_switches.h" |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 | 118 |
118 template <typename Iterator> | 119 template <typename Iterator> |
119 Iterator FindDeviceWithId(Iterator begin, Iterator end, int id) { | 120 Iterator FindDeviceWithId(Iterator begin, Iterator end, int id) { |
120 for (auto it = begin; it != end; ++it) { | 121 for (auto it = begin; it != end; ++it) { |
121 if (it->id == id) | 122 if (it->id == id) |
122 return it; | 123 return it; |
123 } | 124 } |
124 return end; | 125 return end; |
125 } | 126 } |
126 | 127 |
| 128 // Disables high precision scrolling in X11 |
| 129 const char kDisableHighPrecisionScrolling[] = |
| 130 "disable-high-precision-scrolling"; |
| 131 |
| 132 bool IsHighPrecisionScrollingDisabled() { |
| 133 return base::CommandLine::ForCurrentProcess()->HasSwitch( |
| 134 kDisableHighPrecisionScrolling); |
| 135 } |
| 136 |
127 } // namespace | 137 } // namespace |
128 | 138 |
129 bool DeviceDataManagerX11::IsCMTDataType(const int type) { | 139 bool DeviceDataManagerX11::IsCMTDataType(const int type) { |
130 return (type >= kCMTDataTypeStart) && (type <= kCMTDataTypeEnd); | 140 return (type >= kCMTDataTypeStart) && (type <= kCMTDataTypeEnd); |
131 } | 141 } |
132 | 142 |
133 bool DeviceDataManagerX11::IsTouchDataType(const int type) { | 143 bool DeviceDataManagerX11::IsTouchDataType(const int type) { |
134 return (type >= kTouchDataTypeStart) && (type <= kTouchDataTypeEnd); | 144 return (type >= kTouchDataTypeStart) && (type <= kTouchDataTypeEnd); |
135 } | 145 } |
136 | 146 |
(...skipping 11 matching lines...) Expand all Loading... |
148 set_instance(device_data_manager); | 158 set_instance(device_data_manager); |
149 } | 159 } |
150 | 160 |
151 // static | 161 // static |
152 DeviceDataManagerX11* DeviceDataManagerX11::GetInstance() { | 162 DeviceDataManagerX11* DeviceDataManagerX11::GetInstance() { |
153 return static_cast<DeviceDataManagerX11*>(DeviceDataManager::GetInstance()); | 163 return static_cast<DeviceDataManagerX11*>(DeviceDataManager::GetInstance()); |
154 } | 164 } |
155 | 165 |
156 DeviceDataManagerX11::DeviceDataManagerX11() | 166 DeviceDataManagerX11::DeviceDataManagerX11() |
157 : xi_opcode_(-1), | 167 : xi_opcode_(-1), |
| 168 high_precision_scrolling_disabled_(IsHighPrecisionScrollingDisabled()), |
158 atom_cache_(gfx::GetXDisplay(), kCachedAtoms), | 169 atom_cache_(gfx::GetXDisplay(), kCachedAtoms), |
159 button_map_count_(0) { | 170 button_map_count_(0) { |
160 CHECK(gfx::GetXDisplay()); | 171 CHECK(gfx::GetXDisplay()); |
161 InitializeXInputInternal(); | 172 InitializeXInputInternal(); |
162 | 173 |
163 // Make sure the sizes of enum and kCachedAtoms are aligned. | 174 // Make sure the sizes of enum and kCachedAtoms are aligned. |
164 CHECK(arraysize(kCachedAtoms) == static_cast<size_t>(DT_LAST_ENTRY) + 1); | 175 CHECK(arraysize(kCachedAtoms) == static_cast<size_t>(DT_LAST_ENTRY) + 1); |
165 UpdateDeviceList(gfx::GetXDisplay()); | 176 UpdateDeviceList(gfx::GetXDisplay()); |
166 UpdateButtonMap(); | 177 UpdateButtonMap(); |
167 } | 178 } |
(...skipping 593 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
761 valuator_lookup_[deviceid][data_type] = valuator_class_info->number; | 772 valuator_lookup_[deviceid][data_type] = valuator_class_info->number; |
762 data_type_lookup_[deviceid][valuator_class_info->number] = data_type; | 773 data_type_lookup_[deviceid][valuator_class_info->number] = data_type; |
763 valuator_min_[deviceid][data_type] = valuator_class_info->min; | 774 valuator_min_[deviceid][data_type] = valuator_class_info->min; |
764 valuator_max_[deviceid][data_type] = valuator_class_info->max; | 775 valuator_max_[deviceid][data_type] = valuator_class_info->max; |
765 return IsCMTDataType(data_type); | 776 return IsCMTDataType(data_type); |
766 } | 777 } |
767 | 778 |
768 void DeviceDataManagerX11::UpdateScrollClassDevice( | 779 void DeviceDataManagerX11::UpdateScrollClassDevice( |
769 XIScrollClassInfo* scroll_class_info, | 780 XIScrollClassInfo* scroll_class_info, |
770 int deviceid) { | 781 int deviceid) { |
| 782 if (high_precision_scrolling_disabled_) |
| 783 return; |
| 784 |
771 DCHECK(deviceid >= 0 && deviceid < kMaxDeviceNum); | 785 DCHECK(deviceid >= 0 && deviceid < kMaxDeviceNum); |
772 ScrollInfo& info = scroll_data_[deviceid]; | 786 ScrollInfo& info = scroll_data_[deviceid]; |
773 | 787 |
774 // TODO: xinput2 is disabled until edge cases are fixed. | |
775 // http://crbug.com/616308 | |
776 return; | |
777 | |
778 bool legacy_scroll_available = | 788 bool legacy_scroll_available = |
779 (scroll_class_info->flags & XIScrollFlagNoEmulation) == 0; | 789 (scroll_class_info->flags & XIScrollFlagNoEmulation) == 0; |
780 // If the device's highest resolution is lower than the resolution of xinput1 | 790 // If the device's highest resolution is lower than the resolution of xinput1 |
781 // then use xinput1's events instead (ie. don't configure smooth scrolling). | 791 // then use xinput1's events instead (ie. don't configure smooth scrolling). |
782 if (legacy_scroll_available && | 792 if (legacy_scroll_available && |
783 std::abs(scroll_class_info->increment) <= 1.0) { | 793 std::abs(scroll_class_info->increment) <= 1.0) { |
784 return; | 794 return; |
785 } | 795 } |
786 | 796 |
787 switch (scroll_class_info->scroll_type) { | 797 switch (scroll_class_info->scroll_type) { |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
884 } else { | 894 } else { |
885 keyboards.erase(it); | 895 keyboards.erase(it); |
886 ++blocked_iter; | 896 ++blocked_iter; |
887 } | 897 } |
888 } | 898 } |
889 // Notify base class of updated list. | 899 // Notify base class of updated list. |
890 DeviceDataManager::OnKeyboardDevicesUpdated(keyboards); | 900 DeviceDataManager::OnKeyboardDevicesUpdated(keyboards); |
891 } | 901 } |
892 | 902 |
893 } // namespace ui | 903 } // namespace ui |
OLD | NEW |