| 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 <cmath> | 7 #include <cmath> | 
| 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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 102  private: | 102  private: | 
| 103   friend struct DefaultSingletonTraits<XModifierStateWatcher>; | 103   friend struct DefaultSingletonTraits<XModifierStateWatcher>; | 
| 104 | 104 | 
| 105   XModifierStateWatcher() : state_(0) { } | 105   XModifierStateWatcher() : state_(0) { } | 
| 106 | 106 | 
| 107   unsigned int state_; | 107   unsigned int state_; | 
| 108 | 108 | 
| 109   DISALLOW_COPY_AND_ASSIGN(XModifierStateWatcher); | 109   DISALLOW_COPY_AND_ASSIGN(XModifierStateWatcher); | 
| 110 }; | 110 }; | 
| 111 | 111 | 
| 112 #if defined(USE_XI2_MT) |  | 
| 113 // Detects if a touch event is a driver-generated 'special event'. | 112 // Detects if a touch event is a driver-generated 'special event'. | 
| 114 // A 'special event' is a touch event with maximum radius and pressure at | 113 // A 'special event' is a touch event with maximum radius and pressure at | 
| 115 // location (0, 0). | 114 // location (0, 0). | 
| 116 // This needs to be done in a cleaner way: http://crbug.com/169256 | 115 // This needs to be done in a cleaner way: http://crbug.com/169256 | 
| 117 bool TouchEventIsGeneratedHack(const base::NativeEvent& native_event) { | 116 bool TouchEventIsGeneratedHack(const base::NativeEvent& native_event) { | 
| 118   XIDeviceEvent* event = | 117   XIDeviceEvent* event = | 
| 119       static_cast<XIDeviceEvent*>(native_event->xcookie.data); | 118       static_cast<XIDeviceEvent*>(native_event->xcookie.data); | 
| 120   CHECK(event->evtype == XI_TouchBegin || | 119   CHECK(event->evtype == XI_TouchBegin || | 
| 121         event->evtype == XI_TouchUpdate || | 120         event->evtype == XI_TouchUpdate || | 
| 122         event->evtype == XI_TouchEnd); | 121         event->evtype == XI_TouchEnd); | 
| 123 | 122 | 
| 124   // Force is normalized to [0, 1]. | 123   // Force is normalized to [0, 1]. | 
| 125   if (ui::GetTouchForce(native_event) < 1.0f) | 124   if (ui::GetTouchForce(native_event) < 1.0f) | 
| 126     return false; | 125     return false; | 
| 127 | 126 | 
| 128   if (ui::EventLocationFromNative(native_event) != gfx::Point()) | 127   if (ui::EventLocationFromNative(native_event) != gfx::Point()) | 
| 129     return false; | 128     return false; | 
| 130 | 129 | 
| 131   // Radius is in pixels, and the valuator is the diameter in pixels. | 130   // Radius is in pixels, and the valuator is the diameter in pixels. | 
| 132   double radius = ui::GetTouchRadiusX(native_event), min, max; | 131   double radius = ui::GetTouchRadiusX(native_event), min, max; | 
| 133   unsigned int deviceid = | 132   unsigned int deviceid = | 
| 134       static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; | 133       static_cast<XIDeviceEvent*>(native_event->xcookie.data)->sourceid; | 
| 135   if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( | 134   if (!ui::DeviceDataManagerX11::GetInstance()->GetDataRange( | 
| 136       deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) { | 135       deviceid, ui::DeviceDataManagerX11::DT_TOUCH_MAJOR, &min, &max)) { | 
| 137     return false; | 136     return false; | 
| 138   } | 137   } | 
| 139 | 138 | 
| 140   return radius * 2 == max; | 139   return radius * 2 == max; | 
| 141 } | 140 } | 
| 142 #endif |  | 
| 143 | 141 | 
| 144 int GetEventFlagsFromXState(unsigned int state) { | 142 int GetEventFlagsFromXState(unsigned int state) { | 
| 145   int flags = 0; | 143   int flags = 0; | 
| 146   if (state & ControlMask) | 144   if (state & ControlMask) | 
| 147     flags |= ui::EF_CONTROL_DOWN; | 145     flags |= ui::EF_CONTROL_DOWN; | 
| 148   if (state & ShiftMask) | 146   if (state & ShiftMask) | 
| 149     flags |= ui::EF_SHIFT_DOWN; | 147     flags |= ui::EF_SHIFT_DOWN; | 
| 150   if (state & Mod1Mask) | 148   if (state & Mod1Mask) | 
| 151     flags |= ui::EF_ALT_DOWN; | 149     flags |= ui::EF_ALT_DOWN; | 
| 152   if (state & LockMask) | 150   if (state & LockMask) | 
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 239           ui::DeviceDataManagerX11::GetInstance()->GetMappedButton(i) : i; | 237           ui::DeviceDataManagerX11::GetInstance()->GetMappedButton(i) : i; | 
| 240       buttonflags |= GetEventFlagsForButton(button); | 238       buttonflags |= GetEventFlagsForButton(button); | 
| 241     } | 239     } | 
| 242   } | 240   } | 
| 243   return buttonflags; | 241   return buttonflags; | 
| 244 } | 242 } | 
| 245 | 243 | 
| 246 ui::EventType GetTouchEventType(const base::NativeEvent& native_event) { | 244 ui::EventType GetTouchEventType(const base::NativeEvent& native_event) { | 
| 247   XIDeviceEvent* event = | 245   XIDeviceEvent* event = | 
| 248       static_cast<XIDeviceEvent*>(native_event->xcookie.data); | 246       static_cast<XIDeviceEvent*>(native_event->xcookie.data); | 
| 249 #if defined(USE_XI2_MT) |  | 
| 250   switch(event->evtype) { | 247   switch(event->evtype) { | 
| 251     case XI_TouchBegin: | 248     case XI_TouchBegin: | 
| 252       return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN : | 249       return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN : | 
| 253                                                        ui::ET_TOUCH_PRESSED; | 250                                                        ui::ET_TOUCH_PRESSED; | 
| 254     case XI_TouchUpdate: | 251     case XI_TouchUpdate: | 
| 255       return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN : | 252       return TouchEventIsGeneratedHack(native_event) ? ui::ET_UNKNOWN : | 
| 256                                                        ui::ET_TOUCH_MOVED; | 253                                                        ui::ET_TOUCH_MOVED; | 
| 257     case XI_TouchEnd: | 254     case XI_TouchEnd: | 
| 258       return TouchEventIsGeneratedHack(native_event) ? ui::ET_TOUCH_CANCELLED : | 255       return TouchEventIsGeneratedHack(native_event) ? ui::ET_TOUCH_CANCELLED : | 
| 259                                                        ui::ET_TOUCH_RELEASED; | 256                                                        ui::ET_TOUCH_RELEASED; | 
| 260   } | 257   } | 
| 261 #endif  // defined(USE_XI2_MT) |  | 
| 262 | 258 | 
| 263   DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid)); | 259   DCHECK(ui::TouchFactory::GetInstance()->IsTouchDevice(event->sourceid)); | 
| 264   switch (event->evtype) { | 260   switch (event->evtype) { | 
| 265     case XI_ButtonPress: | 261     case XI_ButtonPress: | 
| 266       return ui::ET_TOUCH_PRESSED; | 262       return ui::ET_TOUCH_PRESSED; | 
| 267     case XI_ButtonRelease: | 263     case XI_ButtonRelease: | 
| 268       return ui::ET_TOUCH_RELEASED; | 264       return ui::ET_TOUCH_RELEASED; | 
| 269     case XI_Motion: | 265     case XI_Motion: | 
| 270       // Should not convert any emulated Motion event from touch device to | 266       // Should not convert any emulated Motion event from touch device to | 
| 271       // touch event. | 267       // touch event. | 
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 480     case EnterNotify: | 476     case EnterNotify: | 
| 481     case LeaveNotify: | 477     case LeaveNotify: | 
| 482       return GetEventFlagsFromXState(native_event->xcrossing.state); | 478       return GetEventFlagsFromXState(native_event->xcrossing.state); | 
| 483     case MotionNotify: | 479     case MotionNotify: | 
| 484       return GetEventFlagsFromXState(native_event->xmotion.state); | 480       return GetEventFlagsFromXState(native_event->xmotion.state); | 
| 485     case GenericEvent: { | 481     case GenericEvent: { | 
| 486       XIDeviceEvent* xievent = | 482       XIDeviceEvent* xievent = | 
| 487           static_cast<XIDeviceEvent*>(native_event->xcookie.data); | 483           static_cast<XIDeviceEvent*>(native_event->xcookie.data); | 
| 488 | 484 | 
| 489       switch (xievent->evtype) { | 485       switch (xievent->evtype) { | 
| 490 #if defined(USE_XI2_MT) |  | 
| 491         case XI_TouchBegin: | 486         case XI_TouchBegin: | 
| 492         case XI_TouchUpdate: | 487         case XI_TouchUpdate: | 
| 493         case XI_TouchEnd: | 488         case XI_TouchEnd: | 
| 494           return GetButtonMaskForX2Event(xievent) | | 489           return GetButtonMaskForX2Event(xievent) | | 
| 495                  GetEventFlagsFromXState(xievent->mods.effective) | | 490                  GetEventFlagsFromXState(xievent->mods.effective) | | 
| 496                  GetEventFlagsFromXState( | 491                  GetEventFlagsFromXState( | 
| 497                      XModifierStateWatcher::GetInstance()->state()); | 492                      XModifierStateWatcher::GetInstance()->state()); | 
| 498           break; | 493           break; | 
| 499 #endif |  | 
| 500         case XI_ButtonPress: | 494         case XI_ButtonPress: | 
| 501         case XI_ButtonRelease: { | 495         case XI_ButtonRelease: { | 
| 502           const bool touch = | 496           const bool touch = | 
| 503               TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid); | 497               TouchFactory::GetInstance()->IsTouchDevice(xievent->sourceid); | 
| 504           int flags = GetButtonMaskForX2Event(xievent) | | 498           int flags = GetButtonMaskForX2Event(xievent) | | 
| 505                       GetEventFlagsFromXState(xievent->mods.effective); | 499                       GetEventFlagsFromXState(xievent->mods.effective); | 
| 506           if (touch) { | 500           if (touch) { | 
| 507             flags |= GetEventFlagsFromXState( | 501             flags |= GetEventFlagsFromXState( | 
| 508                 XModifierStateWatcher::GetInstance()->state()); | 502                 XModifierStateWatcher::GetInstance()->state()); | 
| 509           } | 503           } | 
| (...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 920       xievent->detail = | 914       xievent->detail = | 
| 921           UpdateX11EventButton(event->changed_button_flags(), xievent->detail); | 915           UpdateX11EventButton(event->changed_button_flags(), xievent->detail); | 
| 922       break; | 916       break; | 
| 923     } | 917     } | 
| 924     default: | 918     default: | 
| 925       break; | 919       break; | 
| 926   } | 920   } | 
| 927 } | 921 } | 
| 928 | 922 | 
| 929 }  // namespace ui | 923 }  // namespace ui | 
| OLD | NEW | 
|---|