| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/event_constants.h" | 5 #include "ui/events/event_constants.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <string.h> | 8 #include <string.h> |
| 9 #include <X11/extensions/XInput.h> | 9 #include <X11/extensions/XInput.h> |
| 10 #include <X11/extensions/XInput2.h> | 10 #include <X11/extensions/XInput2.h> |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 105 private: | 105 private: |
| 106 friend struct base::DefaultSingletonTraits<XModifierStateWatcher>; | 106 friend struct base::DefaultSingletonTraits<XModifierStateWatcher>; |
| 107 | 107 |
| 108 XModifierStateWatcher() : state_(0) { } | 108 XModifierStateWatcher() : state_(0) { } |
| 109 | 109 |
| 110 unsigned int state_; | 110 unsigned int state_; |
| 111 | 111 |
| 112 DISALLOW_COPY_AND_ASSIGN(XModifierStateWatcher); | 112 DISALLOW_COPY_AND_ASSIGN(XModifierStateWatcher); |
| 113 }; | 113 }; |
| 114 | 114 |
| 115 double GetTouchParamFromXEvent(XEvent* xev, |
| 116 ui::DeviceDataManagerX11::DataType val, |
| 117 double default_value) { |
| 118 ui::DeviceDataManagerX11::GetInstance()->GetEventData(*xev, val, |
| 119 &default_value); |
| 120 return default_value; |
| 121 } |
| 122 |
| 123 void ScaleTouchRadius(XEvent* xev, double* radius) { |
| 124 DCHECK_EQ(GenericEvent, xev->type); |
| 125 XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data); |
| 126 ui::DeviceDataManagerX11::GetInstance()->ApplyTouchRadiusScale(xiev->sourceid, |
| 127 radius); |
| 128 } |
| 129 |
| 130 float GetTouchRadiusX(const base::NativeEvent& native_event) { |
| 131 double radius = |
| 132 GetTouchParamFromXEvent(native_event, |
| 133 ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, 0.0) / |
| 134 2.0; |
| 135 ScaleTouchRadius(native_event, &radius); |
| 136 return radius; |
| 137 } |
| 138 |
| 139 float GetTouchRadiusY(const base::NativeEvent& native_event) { |
| 140 double radius = |
| 141 GetTouchParamFromXEvent(native_event, |
| 142 ui::DeviceDataManagerX11::DT_TOUCH_MINOR, 0.0) / |
| 143 2.0; |
| 144 ScaleTouchRadius(native_event, &radius); |
| 145 return radius; |
| 146 } |
| 147 |
| 148 float GetTouchForce(const base::NativeEvent& native_event) { |
| 149 double force = 0.0; |
| 150 force = GetTouchParamFromXEvent( |
| 151 native_event, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, 0.0); |
| 152 unsigned int deviceid = |
| 153 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; |
| 154 // Force is normalized to fall into [0, 1] |
| 155 if (!ui::DeviceDataManagerX11::GetInstance()->NormalizeData( |
| 156 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, &force)) |
| 157 force = 0.0; |
| 158 return force; |
| 159 } |
| 160 |
| 115 // Detects if a touch event is a driver-generated 'special event'. | 161 // Detects if a touch event is a driver-generated 'special event'. |
| 116 // A 'special event' is a touch event with maximum radius and pressure at | 162 // A 'special event' is a touch event with maximum radius and pressure at |
| 117 // location (0, 0). | 163 // location (0, 0). |
| 118 // This needs to be done in a cleaner way: http://crbug.com/169256 | 164 // This needs to be done in a cleaner way: http://crbug.com/169256 |
| 119 bool TouchEventIsGeneratedHack(const base::NativeEvent& native_event) { | 165 bool TouchEventIsGeneratedHack(const base::NativeEvent& native_event) { |
| 120 XIDeviceEvent* event = | 166 XIDeviceEvent* event = |
| 121 static_cast<XIDeviceEvent*>(native_event->xcookie.data); | 167 static_cast<XIDeviceEvent*>(native_event->xcookie.data); |
| 122 CHECK(event->evtype == XI_TouchBegin || | 168 CHECK(event->evtype == XI_TouchBegin || |
| 123 event->evtype == XI_TouchUpdate || | 169 event->evtype == XI_TouchUpdate || |
| 124 event->evtype == XI_TouchEnd); | 170 event->evtype == XI_TouchEnd); |
| 125 | 171 |
| 126 // Force is normalized to [0, 1]. | 172 // Force is normalized to [0, 1]. |
| 127 if (ui::GetTouchForce(native_event) < 1.0f) | 173 if (GetTouchForce(native_event) < 1.0f) |
| 128 return false; | 174 return false; |
| 129 | 175 |
| 130 if (ui::EventLocationFromNative(native_event) != gfx::Point()) | 176 if (ui::EventLocationFromNative(native_event) != gfx::Point()) |
| 131 return false; | 177 return false; |
| 132 | 178 |
| 133 // Radius is in pixels, and the valuator is the diameter in pixels. | 179 // Radius is in pixels, and the valuator is the diameter in pixels. |
| 134 double radius = ui::GetTouchRadiusX(native_event), min, max; | 180 double radius = GetTouchRadiusX(native_event), min, max; |
| 135 unsigned int deviceid = | 181 unsigned int deviceid = |
| 136 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; | 182 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; |
| 137 if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( | 183 if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( |
| 138 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) { | 184 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) { |
| 139 return false; | 185 return false; |
| 140 } | 186 } |
| 141 | 187 |
| 142 return radius * 2 == max; | 188 return radius * 2 == max; |
| 143 } | 189 } |
| 144 | 190 |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 if (!(event->flags & XIPointerEmulated) && | 318 if (!(event->flags & XIPointerEmulated) && |
| 273 GetButtonMaskForX2Event(event)) | 319 GetButtonMaskForX2Event(event)) |
| 274 return ui::ET_TOUCH_MOVED; | 320 return ui::ET_TOUCH_MOVED; |
| 275 return ui::ET_UNKNOWN; | 321 return ui::ET_UNKNOWN; |
| 276 default: | 322 default: |
| 277 NOTREACHED(); | 323 NOTREACHED(); |
| 278 } | 324 } |
| 279 return ui::ET_UNKNOWN; | 325 return ui::ET_UNKNOWN; |
| 280 } | 326 } |
| 281 | 327 |
| 282 double GetTouchParamFromXEvent(XEvent* xev, | |
| 283 ui::DeviceDataManagerX11::DataType val, | |
| 284 double default_value) { | |
| 285 ui::DeviceDataManagerX11::GetInstance()->GetEventData( | |
| 286 *xev, val, &default_value); | |
| 287 return default_value; | |
| 288 } | |
| 289 | |
| 290 void ScaleTouchRadius(XEvent* xev, double* radius) { | |
| 291 DCHECK_EQ(GenericEvent, xev->type); | |
| 292 XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev->xcookie.data); | |
| 293 ui::DeviceDataManagerX11::GetInstance()->ApplyTouchRadiusScale( | |
| 294 xiev->sourceid, radius); | |
| 295 } | |
| 296 | |
| 297 unsigned int UpdateX11EventFlags(int ui_flags, unsigned int old_x_flags) { | 328 unsigned int UpdateX11EventFlags(int ui_flags, unsigned int old_x_flags) { |
| 298 static struct { | 329 static struct { |
| 299 int ui; | 330 int ui; |
| 300 int x; | 331 int x; |
| 301 } flags[] = { | 332 } flags[] = { |
| 302 {ui::EF_SHIFT_DOWN, ShiftMask}, | 333 {ui::EF_SHIFT_DOWN, ShiftMask}, |
| 303 {ui::EF_CAPS_LOCK_ON, LockMask}, | 334 {ui::EF_CAPS_LOCK_ON, LockMask}, |
| 304 {ui::EF_CONTROL_DOWN, ControlMask}, | 335 {ui::EF_CONTROL_DOWN, ControlMask}, |
| 305 {ui::EF_ALT_DOWN, Mod1Mask}, | 336 {ui::EF_ALT_DOWN, Mod1Mask}, |
| 306 {ui::EF_NUM_LOCK_ON, Mod2Mask}, | 337 {ui::EF_NUM_LOCK_ON, Mod2Mask}, |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 745 if (!manager->GetEventData( | 776 if (!manager->GetEventData( |
| 746 *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) { | 777 *xev, ui::DeviceDataManagerX11::DT_TOUCH_TRACKING_ID, &tracking_id)) { |
| 747 LOG(ERROR) << "Could not get the tracking ID for the event. Using 0."; | 778 LOG(ERROR) << "Could not get the tracking ID for the event. Using 0."; |
| 748 } else { | 779 } else { |
| 749 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); | 780 ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); |
| 750 slot = factory->GetSlotForTrackingID(tracking_id); | 781 slot = factory->GetSlotForTrackingID(tracking_id); |
| 751 } | 782 } |
| 752 return slot; | 783 return slot; |
| 753 } | 784 } |
| 754 | 785 |
| 755 float GetTouchRadiusX(const base::NativeEvent& native_event) { | |
| 756 double radius = GetTouchParamFromXEvent(native_event, | |
| 757 ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, 0.0) / 2.0; | |
| 758 ScaleTouchRadius(native_event, &radius); | |
| 759 return radius; | |
| 760 } | |
| 761 | |
| 762 float GetTouchRadiusY(const base::NativeEvent& native_event) { | |
| 763 double radius = GetTouchParamFromXEvent(native_event, | |
| 764 ui::DeviceDataManagerX11::DT_TOUCH_MINOR, 0.0) / 2.0; | |
| 765 ScaleTouchRadius(native_event, &radius); | |
| 766 return radius; | |
| 767 } | |
| 768 | 786 |
| 769 float GetTouchAngle(const base::NativeEvent& native_event) { | 787 float GetTouchAngle(const base::NativeEvent& native_event) { |
| 770 return GetTouchParamFromXEvent(native_event, | 788 return GetTouchParamFromXEvent(native_event, |
| 771 ui::DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.0) / 2.0; | 789 ui::DeviceDataManagerX11::DT_TOUCH_ORIENTATION, 0.0) / 2.0; |
| 772 } | 790 } |
| 773 | 791 |
| 774 float GetTouchForce(const base::NativeEvent& native_event) { | 792 PointerDetails GetTouchPointerDetailsFromNative( |
| 775 double force = 0.0; | 793 const base::NativeEvent& native_event) { |
| 776 force = GetTouchParamFromXEvent(native_event, | 794 return PointerDetails( |
| 777 ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, 0.0); | 795 EventPointerType::POINTER_TYPE_TOUCH, GetTouchRadiusX(native_event), |
| 778 unsigned int deviceid = | 796 GetTouchRadiusY(native_event), GetTouchForce(native_event), |
| 779 static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; | 797 /* tilt_x */ 0.f, |
| 780 // Force is normalized to fall into [0, 1] | 798 /* tilt_y */ 0.f); |
| 781 if (!ui::DeviceDataManagerX11::GetInstance()->NormalizeData( | |
| 782 deviceid, ui::DeviceDataManagerX11::DT_TOUCH_PRESSURE, &force)) | |
| 783 force = 0.0; | |
| 784 return force; | |
| 785 } | 799 } |
| 786 | 800 |
| 787 bool GetScrollOffsets(const base::NativeEvent& native_event, | 801 bool GetScrollOffsets(const base::NativeEvent& native_event, |
| 788 float* x_offset, | 802 float* x_offset, |
| 789 float* y_offset, | 803 float* y_offset, |
| 790 float* x_offset_ordinal, | 804 float* x_offset_ordinal, |
| 791 float* y_offset_ordinal, | 805 float* y_offset_ordinal, |
| 792 int* finger_count) { | 806 int* finger_count) { |
| 793 if (DeviceDataManagerX11::GetInstance()->IsScrollEvent(native_event)) { | 807 if (DeviceDataManagerX11::GetInstance()->IsScrollEvent(native_event)) { |
| 794 // Temp values to prevent passing NULLs to DeviceDataManager. | 808 // Temp values to prevent passing NULLs to DeviceDataManager. |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 895 xievent->detail = | 909 xievent->detail = |
| 896 UpdateX11EventButton(event->changed_button_flags(), xievent->detail); | 910 UpdateX11EventButton(event->changed_button_flags(), xievent->detail); |
| 897 break; | 911 break; |
| 898 } | 912 } |
| 899 default: | 913 default: |
| 900 break; | 914 break; |
| 901 } | 915 } |
| 902 } | 916 } |
| 903 | 917 |
| 904 } // namespace ui | 918 } // namespace ui |
| OLD | NEW |