| 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 #ifndef UI_EVENTS_EVENT_H_ | 5 #ifndef UI_EVENTS_EVENT_H_ |
| 6 #define UI_EVENTS_EVENT_H_ | 6 #define UI_EVENTS_EVENT_H_ |
| 7 | 7 |
| 8 #include "base/basictypes.h" | 8 #include "base/basictypes.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "base/event_types.h" | 10 #include "base/event_types.h" |
| 11 #include "base/gtest_prod_util.h" | 11 #include "base/gtest_prod_util.h" |
| 12 #include "base/logging.h" | 12 #include "base/logging.h" |
| 13 #include "base/memory/scoped_ptr.h" | 13 #include "base/memory/scoped_ptr.h" |
| 14 #include "base/time/time.h" | 14 #include "base/time/time.h" |
| 15 #include "ui/events/event_constants.h" | 15 #include "ui/events/event_constants.h" |
| 16 #include "ui/events/gesture_event_details.h" | 16 #include "ui/events/gesture_event_details.h" |
| 17 #include "ui/events/gestures/gesture_types.h" | 17 #include "ui/events/gestures/gesture_types.h" |
| 18 #include "ui/events/keycodes/keyboard_codes.h" | 18 #include "ui/events/keycodes/keyboard_codes.h" |
| 19 #include "ui/events/latency_info.h" | 19 #include "ui/events/latency_info.h" |
| 20 #include "ui/gfx/point.h" | 20 #include "ui/gfx/geometry/point.h" |
| 21 #include "ui/gfx/point_conversions.h" | 21 #include "ui/gfx/geometry/point_conversions.h" |
| 22 | 22 |
| 23 namespace gfx { | 23 namespace gfx { |
| 24 class Transform; | 24 class Transform; |
| 25 } | 25 } |
| 26 | 26 |
| 27 namespace ui { | 27 namespace ui { |
| 28 class EventTarget; | 28 class EventTarget; |
| 29 enum class DomCode; |
| 30 enum class DomKey; |
| 29 | 31 |
| 30 class EVENTS_EXPORT Event { | 32 class EVENTS_EXPORT Event { |
| 31 public: | 33 public: |
| 32 static scoped_ptr<Event> Clone(const Event& event); | 34 static scoped_ptr<Event> Clone(const Event& event); |
| 33 | 35 |
| 34 virtual ~Event(); | 36 virtual ~Event(); |
| 35 | 37 |
| 36 class DispatcherApi { | 38 class DispatcherApi { |
| 37 public: | 39 public: |
| 38 explicit DispatcherApi(Event* event) : event_(event) {} | 40 explicit DispatcherApi(Event* event) : event_(event) {} |
| 39 | 41 |
| 40 void set_target(EventTarget* target) { | 42 void set_target(EventTarget* target) { |
| 41 event_->target_ = target; | 43 event_->target_ = target; |
| 42 } | 44 } |
| 43 | 45 |
| 44 void set_phase(EventPhase phase) { event_->phase_ = phase; } | 46 void set_phase(EventPhase phase) { event_->phase_ = phase; } |
| 45 void set_result(int result) { | 47 void set_result(int result) { |
| 46 event_->result_ = static_cast<EventResult>(result); | 48 event_->result_ = static_cast<EventResult>(result); |
| 47 } | 49 } |
| 48 | 50 |
| 49 private: | 51 private: |
| 50 DispatcherApi(); | 52 DispatcherApi(); |
| 51 Event* event_; | 53 Event* event_; |
| 52 | 54 |
| 53 DISALLOW_COPY_AND_ASSIGN(DispatcherApi); | 55 DISALLOW_COPY_AND_ASSIGN(DispatcherApi); |
| 54 }; | 56 }; |
| 55 | 57 |
| 58 const base::NativeEvent& native_event() const { return native_event_; } |
| 56 EventType type() const { return type_; } | 59 EventType type() const { return type_; } |
| 57 void set_type(EventType type) { type_ = type; } | 60 const std::string& name() const { return name_; } |
| 58 | |
| 59 // time_stamp represents time since machine was booted. | 61 // time_stamp represents time since machine was booted. |
| 60 const base::TimeDelta& time_stamp() const { return time_stamp_; } | 62 const base::TimeDelta& time_stamp() const { return time_stamp_; } |
| 61 void set_time_stamp(const base::TimeDelta& stamp) { time_stamp_ = stamp; } | 63 int flags() const { return flags_; } |
| 62 | 64 |
| 63 int flags() const { return flags_; } | 65 // This is only intended to be used externally by classes that are modifying |
| 66 // events in an EventRewriter. |
| 64 void set_flags(int flags) { flags_ = flags; } | 67 void set_flags(int flags) { flags_ = flags; } |
| 65 | 68 |
| 66 EventTarget* target() const { return target_; } | 69 EventTarget* target() const { return target_; } |
| 67 EventPhase phase() const { return phase_; } | 70 EventPhase phase() const { return phase_; } |
| 68 EventResult result() const { return result_; } | 71 EventResult result() const { return result_; } |
| 69 | 72 |
| 70 LatencyInfo* latency() { return &latency_; } | 73 LatencyInfo* latency() { return &latency_; } |
| 71 const LatencyInfo* latency() const { return &latency_; } | 74 const LatencyInfo* latency() const { return &latency_; } |
| 72 void set_latency(const LatencyInfo& latency) { latency_ = latency; } | 75 void set_latency(const LatencyInfo& latency) { latency_ = latency; } |
| 73 | 76 |
| 74 int source_device_id() const { return source_device_id_; } | 77 int source_device_id() const { return source_device_id_; } |
| 75 void set_source_device_id(const int id) { source_device_id_ = id; } | 78 void set_source_device_id(int id) { source_device_id_ = id; } |
| 76 | 79 |
| 77 // By default, events are "cancelable", this means any default processing that | 80 // By default, events are "cancelable", this means any default processing that |
| 78 // the containing abstraction layer may perform can be prevented by calling | 81 // the containing abstraction layer may perform can be prevented by calling |
| 79 // SetHandled(). SetHandled() or StopPropagation() must not be called for | 82 // SetHandled(). SetHandled() or StopPropagation() must not be called for |
| 80 // events that are not cancelable. | 83 // events that are not cancelable. |
| 81 bool cancelable() const { return cancelable_; } | 84 bool cancelable() const { return cancelable_; } |
| 82 | 85 |
| 83 // The following methods return true if the respective keys were pressed at | 86 // The following methods return true if the respective keys were pressed at |
| 84 // the time the event was created. | 87 // the time the event was created. |
| 85 bool IsShiftDown() const { return (flags_ & EF_SHIFT_DOWN) != 0; } | 88 bool IsShiftDown() const { return (flags_ & EF_SHIFT_DOWN) != 0; } |
| 86 bool IsControlDown() const { return (flags_ & EF_CONTROL_DOWN) != 0; } | 89 bool IsControlDown() const { return (flags_ & EF_CONTROL_DOWN) != 0; } |
| 87 bool IsCapsLockDown() const { return (flags_ & EF_CAPS_LOCK_DOWN) != 0; } | 90 bool IsCapsLockDown() const { return (flags_ & EF_CAPS_LOCK_DOWN) != 0; } |
| 88 bool IsAltDown() const { return (flags_ & EF_ALT_DOWN) != 0; } | 91 bool IsAltDown() const { return (flags_ & EF_ALT_DOWN) != 0; } |
| 89 bool IsAltGrDown() const { return (flags_ & EF_ALTGR_DOWN) != 0; } | 92 bool IsAltGrDown() const { return (flags_ & EF_ALTGR_DOWN) != 0; } |
| 90 bool IsCommandDown() const { return (flags_ & EF_COMMAND_DOWN) != 0; } | 93 bool IsCommandDown() const { return (flags_ & EF_COMMAND_DOWN) != 0; } |
| 91 bool IsRepeat() const { return (flags_ & EF_IS_REPEAT) != 0; } | 94 bool IsRepeat() const { return (flags_ & EF_IS_REPEAT) != 0; } |
| 92 | 95 |
| 93 bool IsKeyEvent() const { | 96 bool IsKeyEvent() const { |
| 94 return type_ == ET_KEY_PRESSED || | 97 return type_ == ET_KEY_PRESSED || type_ == ET_KEY_RELEASED; |
| 95 type_ == ET_KEY_RELEASED || | |
| 96 type_ == ET_TRANSLATED_KEY_PRESS || | |
| 97 type_ == ET_TRANSLATED_KEY_RELEASE; | |
| 98 } | 98 } |
| 99 | 99 |
| 100 bool IsMouseEvent() const { | 100 bool IsMouseEvent() const { |
| 101 return type_ == ET_MOUSE_PRESSED || | 101 return type_ == ET_MOUSE_PRESSED || |
| 102 type_ == ET_MOUSE_DRAGGED || | 102 type_ == ET_MOUSE_DRAGGED || |
| 103 type_ == ET_MOUSE_RELEASED || | 103 type_ == ET_MOUSE_RELEASED || |
| 104 type_ == ET_MOUSE_MOVED || | 104 type_ == ET_MOUSE_MOVED || |
| 105 type_ == ET_MOUSE_ENTERED || | 105 type_ == ET_MOUSE_ENTERED || |
| 106 type_ == ET_MOUSE_EXITED || | 106 type_ == ET_MOUSE_EXITED || |
| 107 type_ == ET_MOUSEWHEEL || | 107 type_ == ET_MOUSEWHEEL || |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 192 bool IsLocatedEvent() const { | 192 bool IsLocatedEvent() const { |
| 193 return IsMouseEvent() || IsScrollEvent() || IsTouchEvent() || | 193 return IsMouseEvent() || IsScrollEvent() || IsTouchEvent() || |
| 194 IsGestureEvent(); | 194 IsGestureEvent(); |
| 195 } | 195 } |
| 196 | 196 |
| 197 // Convenience methods to cast |this| to a GestureEvent. IsGestureEvent() | 197 // Convenience methods to cast |this| to a GestureEvent. IsGestureEvent() |
| 198 // must be true as a precondition to calling these methods. | 198 // must be true as a precondition to calling these methods. |
| 199 GestureEvent* AsGestureEvent(); | 199 GestureEvent* AsGestureEvent(); |
| 200 const GestureEvent* AsGestureEvent() const; | 200 const GestureEvent* AsGestureEvent() const; |
| 201 | 201 |
| 202 // Returns true if the event has a valid |native_event_|. |
| 203 bool HasNativeEvent() const; |
| 204 |
| 202 // Immediately stops the propagation of the event. This must be called only | 205 // Immediately stops the propagation of the event. This must be called only |
| 203 // from an EventHandler during an event-dispatch. Any event handler that may | 206 // from an EventHandler during an event-dispatch. Any event handler that may |
| 204 // be in the list will not receive the event after this is called. | 207 // be in the list will not receive the event after this is called. |
| 205 // Note that StopPropagation() can be called only for cancelable events. | 208 // Note that StopPropagation() can be called only for cancelable events. |
| 206 void StopPropagation(); | 209 void StopPropagation(); |
| 207 bool stopped_propagation() const { return !!(result_ & ER_CONSUMED); } | 210 bool stopped_propagation() const { return !!(result_ & ER_CONSUMED); } |
| 208 | 211 |
| 209 // Marks the event as having been handled. A handled event does not reach the | 212 // Marks the event as having been handled. A handled event does not reach the |
| 210 // next event phase. For example, if an event is handled during the pre-target | 213 // next event phase. For example, if an event is handled during the pre-target |
| 211 // phase, then the event is dispatched to all pre-target handlers, but not to | 214 // phase, then the event is dispatched to all pre-target handlers, but not to |
| 212 // the target or post-target handlers. | 215 // the target or post-target handlers. |
| 213 // Note that SetHandled() can be called only for cancelable events. | 216 // Note that SetHandled() can be called only for cancelable events. |
| 214 void SetHandled(); | 217 void SetHandled(); |
| 215 bool handled() const { return result_ != ER_UNHANDLED; } | 218 bool handled() const { return result_ != ER_UNHANDLED; } |
| 216 | 219 |
| 217 protected: | 220 protected: |
| 218 Event(); | |
| 219 Event(EventType type, base::TimeDelta time_stamp, int flags); | 221 Event(EventType type, base::TimeDelta time_stamp, int flags); |
| 222 Event(const base::NativeEvent& native_event, EventType type, int flags); |
| 220 Event(const Event& copy); | 223 Event(const Event& copy); |
| 221 void SetType(EventType type); | 224 void SetType(EventType type); |
| 222 void set_cancelable(bool cancelable) { cancelable_ = cancelable; } | 225 void set_cancelable(bool cancelable) { cancelable_ = cancelable; } |
| 223 | 226 |
| 227 void set_time_stamp(const base::TimeDelta& time_stamp) { |
| 228 time_stamp_ = time_stamp; |
| 229 } |
| 230 |
| 231 void set_name(const std::string& name) { name_ = name; } |
| 232 |
| 224 private: | 233 private: |
| 225 friend class EventTestApi; | 234 friend class EventTestApi; |
| 226 | 235 |
| 227 EventType type_; | 236 EventType type_; |
| 237 std::string name_; |
| 228 base::TimeDelta time_stamp_; | 238 base::TimeDelta time_stamp_; |
| 229 LatencyInfo latency_; | 239 LatencyInfo latency_; |
| 230 int flags_; | 240 int flags_; |
| 241 base::NativeEvent native_event_; |
| 242 bool delete_native_event_; |
| 231 bool cancelable_; | 243 bool cancelable_; |
| 232 EventTarget* target_; | 244 EventTarget* target_; |
| 233 EventPhase phase_; | 245 EventPhase phase_; |
| 234 EventResult result_; | 246 EventResult result_; |
| 235 | 247 |
| 236 // The device id the event came from, or ED_UNKNOWN_DEVICE if the information | 248 // The device id the event came from, or ED_UNKNOWN_DEVICE if the information |
| 237 // is not available. | 249 // is not available. |
| 238 int source_device_id_; | 250 int source_device_id_; |
| 239 }; | 251 }; |
| 240 | 252 |
| 241 class EVENTS_EXPORT CancelModeEvent : public Event { | 253 class EVENTS_EXPORT CancelModeEvent : public Event { |
| 242 public: | 254 public: |
| 243 CancelModeEvent(); | 255 CancelModeEvent(); |
| 244 ~CancelModeEvent() override; | 256 ~CancelModeEvent() override; |
| 245 }; | 257 }; |
| 246 | 258 |
| 247 class EVENTS_EXPORT LocatedEvent : public Event { | 259 class EVENTS_EXPORT LocatedEvent : public Event { |
| 248 public: | 260 public: |
| 249 LocatedEvent(); | |
| 250 ~LocatedEvent() override; | 261 ~LocatedEvent() override; |
| 251 | 262 |
| 252 float x() const { return location_.x(); } | 263 float x() const { return location_.x(); } |
| 253 float y() const { return location_.y(); } | 264 float y() const { return location_.y(); } |
| 254 void set_location(const gfx::PointF& location) { location_ = location; } | 265 void set_location(const gfx::PointF& location) { location_ = location; } |
| 255 // TODO(tdresser): Always return floating point location. See | 266 // TODO(tdresser): Always return floating point location. See |
| 256 // crbug.com/337824. | 267 // crbug.com/337824. |
| 257 gfx::Point location() const { return gfx::ToFlooredPoint(location_); } | 268 gfx::Point location() const { return gfx::ToFlooredPoint(location_); } |
| 258 const gfx::PointF& location_f() const { return location_; } | 269 const gfx::PointF& location_f() const { return location_; } |
| 259 void set_root_location(const gfx::PointF& root_location) { | 270 void set_root_location(const gfx::PointF& root_location) { |
| 260 root_location_ = root_location; | 271 root_location_ = root_location; |
| 261 } | 272 } |
| 262 gfx::Point root_location() const { | 273 gfx::Point root_location() const { |
| 263 return gfx::ToFlooredPoint(root_location_); | 274 return gfx::ToFlooredPoint(root_location_); |
| 264 } | 275 } |
| 265 const gfx::PointF& root_location_f() const { | 276 const gfx::PointF& root_location_f() const { |
| 266 return root_location_; | 277 return root_location_; |
| 267 } | 278 } |
| 268 const gfx::Point& screen_location() const { return screen_location_; } | |
| 269 void set_screen_location(const gfx::Point& screen_location) { | |
| 270 screen_location_ = screen_location; | |
| 271 } | |
| 272 | 279 |
| 273 // Transform the locations using |inverted_root_transform|. | 280 // Transform the locations using |inverted_root_transform|. |
| 274 // This is applied to both |location_| and |root_location_|. | 281 // This is applied to both |location_| and |root_location_|. |
| 275 virtual void UpdateForRootTransform( | 282 virtual void UpdateForRootTransform( |
| 276 const gfx::Transform& inverted_root_transform); | 283 const gfx::Transform& inverted_root_transform); |
| 277 | 284 |
| 278 template <class T> void ConvertLocationToTarget(T* source, T* target) { | 285 template <class T> void ConvertLocationToTarget(T* source, T* target) { |
| 279 if (!target || target == source) | 286 if (!target || target == source) |
| 280 return; | 287 return; |
| 281 // TODO(tdresser): Rewrite ConvertPointToTarget to use PointF. See | 288 // TODO(tdresser): Rewrite ConvertPointToTarget to use PointF. See |
| 282 // crbug.com/337824. | 289 // crbug.com/337824. |
| 283 gfx::Point offset = gfx::ToFlooredPoint(location_); | 290 gfx::Point offset = gfx::ToFlooredPoint(location_); |
| 284 T::ConvertPointToTarget(source, target, &offset); | 291 T::ConvertPointToTarget(source, target, &offset); |
| 285 gfx::Vector2d diff = gfx::ToFlooredPoint(location_) - offset; | 292 gfx::Vector2d diff = gfx::ToFlooredPoint(location_) - offset; |
| 286 location_= location_ - diff; | 293 location_= location_ - diff; |
| 287 } | 294 } |
| 288 | 295 |
| 289 protected: | 296 protected: |
| 290 friend class LocatedEventTestApi; | 297 friend class LocatedEventTestApi; |
| 298 explicit LocatedEvent(const base::NativeEvent& native_event); |
| 291 | 299 |
| 292 // Create a new LocatedEvent which is identical to the provided model. | 300 // Create a new LocatedEvent which is identical to the provided model. |
| 293 // If source / target windows are provided, the model location will be | 301 // If source / target windows are provided, the model location will be |
| 294 // converted from |source| coordinate system to |target| coordinate system. | 302 // converted from |source| coordinate system to |target| coordinate system. |
| 295 template <class T> | 303 template <class T> |
| 296 LocatedEvent(const LocatedEvent& model, T* source, T* target) | 304 LocatedEvent(const LocatedEvent& model, T* source, T* target) |
| 297 : Event(model), | 305 : Event(model), |
| 298 location_(model.location_), | 306 location_(model.location_), |
| 299 root_location_(model.root_location_), | 307 root_location_(model.root_location_) { |
| 300 screen_location_(model.screen_location_) { | |
| 301 ConvertLocationToTarget(source, target); | 308 ConvertLocationToTarget(source, target); |
| 302 } | 309 } |
| 303 | 310 |
| 304 // Used for synthetic events in testing. | 311 // Used for synthetic events in testing. |
| 305 LocatedEvent(EventType type, | 312 LocatedEvent(EventType type, |
| 306 const gfx::PointF& location, | 313 const gfx::PointF& location, |
| 307 const gfx::PointF& root_location, | 314 const gfx::PointF& root_location, |
| 308 base::TimeDelta time_stamp, | 315 base::TimeDelta time_stamp, |
| 309 int flags); | 316 int flags); |
| 310 | 317 |
| 311 gfx::PointF location_; | 318 gfx::PointF location_; |
| 312 | 319 |
| 313 // |location_| multiplied by an optional transformation matrix for | 320 // |location_| multiplied by an optional transformation matrix for |
| 314 // rotations, animations and skews. | 321 // rotations, animations and skews. |
| 315 gfx::PointF root_location_; | 322 gfx::PointF root_location_; |
| 316 | |
| 317 // The system provided location of the event. | |
| 318 gfx::Point screen_location_; | |
| 319 }; | 323 }; |
| 320 | 324 |
| 321 class EVENTS_EXPORT MouseEvent : public LocatedEvent { | 325 class EVENTS_EXPORT MouseEvent : public LocatedEvent { |
| 322 public: | 326 public: |
| 323 MouseEvent(); | 327 explicit MouseEvent(const base::NativeEvent& native_event); |
| 324 | 328 |
| 325 // Create a new MouseEvent based on the provided model. | 329 // Create a new MouseEvent based on the provided model. |
| 326 // Uses the provided |type| and |flags| for the new event. | 330 // Uses the provided |type| and |flags| for the new event. |
| 327 // If source / target windows are provided, the model location will be | 331 // If source / target windows are provided, the model location will be |
| 328 // converted from |source| coordinate system to |target| coordinate system. | 332 // converted from |source| coordinate system to |target| coordinate system. |
| 329 template <class T> | 333 template <class T> |
| 330 MouseEvent(const MouseEvent& model, T* source, T* target) | 334 MouseEvent(const MouseEvent& model, T* source, T* target) |
| 331 : LocatedEvent(model, source, target), | 335 : LocatedEvent(model, source, target), |
| 332 changed_button_flags_(model.changed_button_flags_) { | 336 changed_button_flags_(model.changed_button_flags_) { |
| 333 } | 337 } |
| 334 | 338 |
| 335 template <class T> | 339 template <class T> |
| 336 MouseEvent(const MouseEvent& model, | 340 MouseEvent(const MouseEvent& model, |
| 337 T* source, | 341 T* source, |
| 338 T* target, | 342 T* target, |
| 339 EventType type, | 343 EventType type, |
| 340 int flags) | 344 int flags) |
| 341 : LocatedEvent(model, source, target), | 345 : LocatedEvent(model, source, target), |
| 342 changed_button_flags_(model.changed_button_flags_) { | 346 changed_button_flags_(model.changed_button_flags_) { |
| 343 SetType(type); | 347 SetType(type); |
| 344 set_flags(flags); | 348 set_flags(flags); |
| 345 } | 349 } |
| 346 | 350 |
| 347 // Used for synthetic events in testing and by the gesture recognizer. | 351 // Used for synthetic events in testing, gesture recognizer and Ozone |
| 348 MouseEvent(EventType type, | 352 MouseEvent(EventType type, |
| 349 const gfx::PointF& location, | 353 const gfx::PointF& location, |
| 350 const gfx::PointF& root_location, | 354 const gfx::PointF& root_location, |
| 355 base::TimeDelta time_stamp, |
| 351 int flags, | 356 int flags, |
| 352 int changed_button_flags); | 357 int changed_button_flags); |
| 353 | 358 |
| 354 // Conveniences to quickly test what button is down | 359 // Conveniences to quickly test what button is down |
| 355 bool IsOnlyLeftMouseButton() const { | 360 bool IsOnlyLeftMouseButton() const { |
| 356 return (flags() & EF_LEFT_MOUSE_BUTTON) && | 361 return button_flags() == EF_LEFT_MOUSE_BUTTON; |
| 357 !(flags() & (EF_MIDDLE_MOUSE_BUTTON | EF_RIGHT_MOUSE_BUTTON)); | |
| 358 } | 362 } |
| 359 | 363 |
| 360 bool IsLeftMouseButton() const { | 364 bool IsLeftMouseButton() const { |
| 361 return (flags() & EF_LEFT_MOUSE_BUTTON) != 0; | 365 return (flags() & EF_LEFT_MOUSE_BUTTON) != 0; |
| 362 } | 366 } |
| 363 | 367 |
| 364 bool IsOnlyMiddleMouseButton() const { | 368 bool IsOnlyMiddleMouseButton() const { |
| 365 return (flags() & EF_MIDDLE_MOUSE_BUTTON) && | 369 return button_flags() == EF_MIDDLE_MOUSE_BUTTON; |
| 366 !(flags() & (EF_LEFT_MOUSE_BUTTON | EF_RIGHT_MOUSE_BUTTON)); | |
| 367 } | 370 } |
| 368 | 371 |
| 369 bool IsMiddleMouseButton() const { | 372 bool IsMiddleMouseButton() const { |
| 370 return (flags() & EF_MIDDLE_MOUSE_BUTTON) != 0; | 373 return (flags() & EF_MIDDLE_MOUSE_BUTTON) != 0; |
| 371 } | 374 } |
| 372 | 375 |
| 373 bool IsOnlyRightMouseButton() const { | 376 bool IsOnlyRightMouseButton() const { |
| 374 return (flags() & EF_RIGHT_MOUSE_BUTTON) && | 377 return button_flags() == EF_RIGHT_MOUSE_BUTTON; |
| 375 !(flags() & (EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON)); | |
| 376 } | 378 } |
| 377 | 379 |
| 378 bool IsRightMouseButton() const { | 380 bool IsRightMouseButton() const { |
| 379 return (flags() & EF_RIGHT_MOUSE_BUTTON) != 0; | 381 return (flags() & EF_RIGHT_MOUSE_BUTTON) != 0; |
| 380 } | 382 } |
| 381 | 383 |
| 382 bool IsAnyButton() const { | 384 bool IsAnyButton() const { |
| 383 return (flags() & (EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON | | 385 return button_flags() != 0; |
| 384 EF_RIGHT_MOUSE_BUTTON)) != 0; | |
| 385 } | 386 } |
| 386 | 387 |
| 387 // Compares two mouse down events and returns true if the second one should | 388 // Compares two mouse down events and returns true if the second one should |
| 388 // be considered a repeat of the first. | 389 // be considered a repeat of the first. |
| 389 static bool IsRepeatedClickEvent( | 390 static bool IsRepeatedClickEvent( |
| 390 const MouseEvent& event1, | 391 const MouseEvent& event1, |
| 391 const MouseEvent& event2); | 392 const MouseEvent& event2); |
| 392 | 393 |
| 393 // Get the click count. Can be 1, 2 or 3 for mousedown messages, 0 otherwise. | 394 // Get the click count. Can be 1, 2 or 3 for mousedown messages, 0 otherwise. |
| 394 int GetClickCount() const; | 395 int GetClickCount() const; |
| 395 | 396 |
| 396 // Set the click count for a mousedown message. Can be 1, 2 or 3. | 397 // Set the click count for a mousedown message. Can be 1, 2 or 3. |
| 397 void SetClickCount(int click_count); | 398 void SetClickCount(int click_count); |
| 398 | 399 |
| 399 // Identifies the button that changed. During a press this corresponds to the | 400 // Identifies the button that changed. During a press this corresponds to the |
| 400 // button that was pressed and during a release this corresponds to the button | 401 // button that was pressed and during a release this corresponds to the button |
| 401 // that was released. | 402 // that was released. |
| 402 // NOTE: during a press and release flags() contains the complete set of | 403 // NOTE: during a press and release flags() contains the complete set of |
| 403 // flags. Use this to determine the button that was pressed or released. | 404 // flags. Use this to determine the button that was pressed or released. |
| 404 int changed_button_flags() const { return changed_button_flags_; } | 405 int changed_button_flags() const { return changed_button_flags_; } |
| 405 | 406 |
| 406 // Updates the button that changed. | 407 // Updates the button that changed. |
| 407 void set_changed_button_flags(int flags) { changed_button_flags_ = flags; } | 408 void set_changed_button_flags(int flags) { changed_button_flags_ = flags; } |
| 408 | 409 |
| 410 private: |
| 411 FRIEND_TEST_ALL_PREFIXES(EventTest, DoubleClickRequiresRelease); |
| 412 FRIEND_TEST_ALL_PREFIXES(EventTest, SingleClickRightLeft); |
| 413 |
| 414 // Returns the flags for the mouse buttons. |
| 415 int button_flags() const { |
| 416 return flags() & (EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON | |
| 417 EF_RIGHT_MOUSE_BUTTON | EF_BACK_MOUSE_BUTTON | |
| 418 EF_FORWARD_MOUSE_BUTTON); |
| 419 } |
| 420 |
| 409 // Returns the repeat count based on the previous mouse click, if it is | 421 // Returns the repeat count based on the previous mouse click, if it is |
| 410 // recent enough and within a small enough distance. | 422 // recent enough and within a small enough distance. |
| 411 static int GetRepeatCount(const MouseEvent& click_event); | 423 static int GetRepeatCount(const MouseEvent& click_event); |
| 412 | 424 |
| 413 private: | 425 // Resets the last_click_event_ for unit tests. |
| 414 FRIEND_TEST_ALL_PREFIXES(EventTest, DoubleClickRequiresRelease); | 426 static void ResetLastClickForTest(); |
| 415 FRIEND_TEST_ALL_PREFIXES(EventTest, SingleClickRightLeft); | |
| 416 | 427 |
| 417 // See description above getter for details. | 428 // See description above getter for details. |
| 418 int changed_button_flags_; | 429 int changed_button_flags_; |
| 430 |
| 431 static MouseEvent* last_click_event_; |
| 432 |
| 433 // We can create a MouseEvent for a native event more than once. We set this |
| 434 // to true when the next event either has a different timestamp or we see a |
| 435 // release signalling that the press (click) event was completed. |
| 436 static bool last_click_complete_; |
| 419 }; | 437 }; |
| 420 | 438 |
| 421 class ScrollEvent; | 439 class ScrollEvent; |
| 422 | 440 |
| 423 class EVENTS_EXPORT MouseWheelEvent : public MouseEvent { | 441 class EVENTS_EXPORT MouseWheelEvent : public MouseEvent { |
| 424 public: | 442 public: |
| 425 // See |offset| for details. | 443 // See |offset| for details. |
| 426 static const int kWheelDelta; | 444 static const int kWheelDelta; |
| 427 | 445 |
| 428 MouseWheelEvent(); | 446 explicit MouseWheelEvent(const base::NativeEvent& native_event); |
| 429 explicit MouseWheelEvent(const ScrollEvent& scroll_event); | 447 explicit MouseWheelEvent(const ScrollEvent& scroll_event); |
| 430 MouseWheelEvent(const MouseEvent& mouse_event, int x_offset, int y_offset); | 448 MouseWheelEvent(const MouseEvent& mouse_event, int x_offset, int y_offset); |
| 431 MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event); | 449 MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event); |
| 432 | 450 |
| 433 template <class T> | 451 template <class T> |
| 434 MouseWheelEvent(const MouseWheelEvent& model, | 452 MouseWheelEvent(const MouseWheelEvent& model, |
| 435 T* source, | 453 T* source, |
| 436 T* target) | 454 T* target) |
| 437 : MouseEvent(model, source, target, model.type(), model.flags()), | 455 : MouseEvent(model, source, target, model.type(), model.flags()), |
| 438 offset_(model.x_offset(), model.y_offset()) { | 456 offset_(model.x_offset(), model.y_offset()) { |
| 439 } | 457 } |
| 440 | 458 |
| 441 // Used for synthetic events in testing and by the gesture recognizer. | 459 // Used for synthetic events in testing and by the gesture recognizer. |
| 442 MouseWheelEvent(const gfx::Vector2d& offset, | 460 MouseWheelEvent(const gfx::Vector2d& offset, |
| 443 const gfx::PointF& location, | 461 const gfx::PointF& location, |
| 444 const gfx::PointF& root_location, | 462 const gfx::PointF& root_location, |
| 463 base::TimeDelta time_stamp, |
| 445 int flags, | 464 int flags, |
| 446 int changed_button_flags); | 465 int changed_button_flags); |
| 447 | 466 |
| 448 // The amount to scroll. This is in multiples of kWheelDelta. | 467 // The amount to scroll. This is in multiples of kWheelDelta. |
| 449 // Note: x_offset() > 0/y_offset() > 0 means scroll left/up. | 468 // Note: x_offset() > 0/y_offset() > 0 means scroll left/up. |
| 450 int x_offset() const { return offset_.x(); } | 469 int x_offset() const { return offset_.x(); } |
| 451 int y_offset() const { return offset_.y(); } | 470 int y_offset() const { return offset_.y(); } |
| 452 const gfx::Vector2d& offset() const { return offset_; } | 471 const gfx::Vector2d& offset() const { return offset_; } |
| 453 void set_offset(const gfx::Vector2d& offset) { offset_ = offset; } | |
| 454 | |
| 455 // Overridden from LocatedEvent. | |
| 456 void UpdateForRootTransform( | |
| 457 const gfx::Transform& inverted_root_transform) override; | |
| 458 | 472 |
| 459 private: | 473 private: |
| 460 gfx::Vector2d offset_; | 474 gfx::Vector2d offset_; |
| 461 }; | 475 }; |
| 462 | 476 |
| 463 class EVENTS_EXPORT TouchEvent : public LocatedEvent { | 477 class EVENTS_EXPORT TouchEvent : public LocatedEvent { |
| 464 public: | 478 public: |
| 465 TouchEvent(); | 479 explicit TouchEvent(const base::NativeEvent& native_event); |
| 466 | 480 |
| 467 // Create a new TouchEvent which is identical to the provided model. | 481 // Create a new TouchEvent which is identical to the provided model. |
| 468 // If source / target windows are provided, the model location will be | 482 // If source / target windows are provided, the model location will be |
| 469 // converted from |source| coordinate system to |target| coordinate system. | 483 // converted from |source| coordinate system to |target| coordinate system. |
| 470 template <class T> | 484 template <class T> |
| 471 TouchEvent(const TouchEvent& model, T* source, T* target) | 485 TouchEvent(const TouchEvent& model, T* source, T* target) |
| 472 : LocatedEvent(model, source, target), | 486 : LocatedEvent(model, source, target), |
| 473 touch_id_(model.touch_id_), | 487 touch_id_(model.touch_id_), |
| 488 unique_event_id_(model.unique_event_id_), |
| 474 radius_x_(model.radius_x_), | 489 radius_x_(model.radius_x_), |
| 475 radius_y_(model.radius_y_), | 490 radius_y_(model.radius_y_), |
| 476 rotation_angle_(model.rotation_angle_), | 491 rotation_angle_(model.rotation_angle_), |
| 477 force_(model.force_) { | 492 force_(model.force_), |
| 478 } | 493 may_cause_scrolling_(model.may_cause_scrolling_), |
| 494 should_remove_native_touch_id_mapping_(false) {} |
| 479 | 495 |
| 480 TouchEvent(EventType type, | 496 TouchEvent(EventType type, |
| 481 const gfx::PointF& location, | 497 const gfx::PointF& location, |
| 482 int touch_id, | 498 int touch_id, |
| 483 base::TimeDelta time_stamp); | 499 base::TimeDelta time_stamp); |
| 484 | 500 |
| 485 TouchEvent(EventType type, | 501 TouchEvent(EventType type, |
| 486 const gfx::PointF& location, | 502 const gfx::PointF& location, |
| 487 int flags, | 503 int flags, |
| 488 int touch_id, | 504 int touch_id, |
| 489 base::TimeDelta timestamp, | 505 base::TimeDelta timestamp, |
| 490 float radius_x, | 506 float radius_x, |
| 491 float radius_y, | 507 float radius_y, |
| 492 float angle, | 508 float angle, |
| 493 float force); | 509 float force); |
| 494 | 510 |
| 511 TouchEvent(const TouchEvent& copy); |
| 512 |
| 495 ~TouchEvent() override; | 513 ~TouchEvent() override; |
| 496 | 514 |
| 515 // The id of the pointer this event modifies. |
| 497 int touch_id() const { return touch_id_; } | 516 int touch_id() const { return touch_id_; } |
| 498 void set_touch_id(int touch_id) { touch_id_ = touch_id; } | 517 // A unique identifier for this event. |
| 518 uint32 unique_event_id() const { return unique_event_id_; } |
| 519 // If we aren't provided with a radius on one axis, use the |
| 520 // information from the other axis. |
| 521 float radius_x() const { return radius_x_ > 0 ? radius_x_ : radius_y_; } |
| 522 float radius_y() const { return radius_y_ > 0 ? radius_y_ : radius_x_; } |
| 523 float rotation_angle() const { return rotation_angle_; } |
| 524 float force() const { return force_; } |
| 499 | 525 |
| 500 float radius_x() const { return radius_x_; } | 526 void set_may_cause_scrolling(bool causes) { may_cause_scrolling_ = causes; } |
| 527 bool may_cause_scrolling() const { return may_cause_scrolling_; } |
| 528 |
| 529 // Used for unit tests. |
| 501 void set_radius_x(const float r) { radius_x_ = r; } | 530 void set_radius_x(const float r) { radius_x_ = r; } |
| 502 float radius_y() const { return radius_y_; } | |
| 503 void set_radius_y(const float r) { radius_y_ = r; } | 531 void set_radius_y(const float r) { radius_y_ = r; } |
| 504 | 532 |
| 505 float rotation_angle() const { return rotation_angle_; } | 533 void set_should_remove_native_touch_id_mapping( |
| 506 void set_rotation_angle(float rotation_angle) { | 534 bool should_remove_native_touch_id_mapping) { |
| 507 rotation_angle_ = rotation_angle; | 535 should_remove_native_touch_id_mapping_ = |
| 536 should_remove_native_touch_id_mapping; |
| 508 } | 537 } |
| 509 | 538 |
| 510 float force() const { return force_; } | |
| 511 void set_force(float force) { force_ = force; } | |
| 512 | |
| 513 // Overridden from LocatedEvent. | 539 // Overridden from LocatedEvent. |
| 514 void UpdateForRootTransform( | 540 void UpdateForRootTransform( |
| 515 const gfx::Transform& inverted_root_transform) override; | 541 const gfx::Transform& inverted_root_transform) override; |
| 516 | 542 |
| 517 protected: | 543 // Marks the event as not participating in synchronous gesture recognition. |
| 518 void set_radius(float radius_x, float radius_y) { | 544 void DisableSynchronousHandling(); |
| 519 radius_x_ = radius_x; | 545 bool synchronous_handling_disabled() const { |
| 520 radius_y_ = radius_y; | 546 return !!(result() & ER_DISABLE_SYNC_HANDLING); |
| 521 } | 547 } |
| 522 | 548 |
| 523 private: | 549 private: |
| 550 // Adjusts rotation_angle_ to within the acceptable range. |
| 551 void FixRotationAngle(); |
| 552 |
| 524 // The identity (typically finger) of the touch starting at 0 and incrementing | 553 // The identity (typically finger) of the touch starting at 0 and incrementing |
| 525 // for each separable additional touch that the hardware can detect. | 554 // for each separable additional touch that the hardware can detect. |
| 526 int touch_id_; | 555 const int touch_id_; |
| 556 |
| 557 // A unique identifier for the touch event. |
| 558 const uint32 unique_event_id_; |
| 527 | 559 |
| 528 // Radius of the X (major) axis of the touch ellipse. 0.0 if unknown. | 560 // Radius of the X (major) axis of the touch ellipse. 0.0 if unknown. |
| 529 float radius_x_; | 561 float radius_x_; |
| 530 | 562 |
| 531 // Radius of the Y (minor) axis of the touch ellipse. 0.0 if unknown. | 563 // Radius of the Y (minor) axis of the touch ellipse. 0.0 if unknown. |
| 532 float radius_y_; | 564 float radius_y_; |
| 533 | 565 |
| 534 // Angle of the major axis away from the X axis. Default 0.0. | 566 // Clockwise angle (in degrees) of the major axis from the X axis. Must be |
| 567 // less than 180 and non-negative. |
| 535 float rotation_angle_; | 568 float rotation_angle_; |
| 536 | 569 |
| 537 // Force (pressure) of the touch. Normalized to be [0, 1]. Default to be 0.0. | 570 // Force (pressure) of the touch. Normalized to be [0, 1]. Default to be 0.0. |
| 538 float force_; | 571 float force_; |
| 572 |
| 573 // Whether the (unhandled) touch event will produce a scroll event (e.g., a |
| 574 // touchmove that exceeds the platform slop region, or a touchend that |
| 575 // causes a fling). Defaults to false. |
| 576 bool may_cause_scrolling_; |
| 577 |
| 578 // True if this event should remove the mapping between the native |
| 579 // event id and the touch_id_. This should only be the case for |
| 580 // release and cancel events where the associated touch press event |
| 581 // created a mapping between the native id and the touch_id_. |
| 582 bool should_remove_native_touch_id_mapping_; |
| 539 }; | 583 }; |
| 540 | 584 |
| 541 // An interface that individual platforms can use to store additional data on | 585 // An interface that individual platforms can use to store additional data on |
| 542 // KeyEvent. | 586 // KeyEvent. |
| 543 // | 587 // |
| 544 // Currently only used in mojo. | 588 // Currently only used in mojo. |
| 545 class EVENTS_EXPORT ExtendedKeyEventData { | 589 class EVENTS_EXPORT ExtendedKeyEventData { |
| 546 public: | 590 public: |
| 547 virtual ~ExtendedKeyEventData() {} | 591 virtual ~ExtendedKeyEventData() {} |
| 548 | 592 |
| 549 virtual ExtendedKeyEventData* Clone() const = 0; | 593 virtual ExtendedKeyEventData* Clone() const = 0; |
| 550 }; | 594 }; |
| 551 | 595 |
| 552 // A KeyEvent is really two distinct classes, melded together due to the | 596 // A KeyEvent is really two distinct classes, melded together due to the |
| 553 // DOM legacy of Windows key events: a keystroke event (is_char_ == false), | 597 // DOM legacy of Windows key events: a keystroke event (is_char_ == false), |
| 554 // or a character event (is_char_ == true). | 598 // or a character event (is_char_ == true). |
| 555 // | 599 // |
| 556 // For a keystroke event, | 600 // For a keystroke event, |
| 557 // -- is_char_ is false. | 601 // -- is_char_ is false. |
| 558 // -- type() can be any one of ET_KEY_PRESSED, ET_KEY_RELEASED, | 602 // -- Event::type() can be any one of ET_KEY_PRESSED, ET_KEY_RELEASED. |
| 559 // ET_TRANSLATED_KEY_PRESS, or ET_TRANSLATED_KEY_RELEASE. | 603 // -- code_ and Event::flags() represent the physical key event. |
| 560 // -- character_ functions as a bypass or cache for GetCharacter(). | 604 // - code_ is a platform-independent representation of the physical key, |
| 561 // -- key_code_ is a VKEY_ value associated with the key. For printable | 605 // based on DOM KeyboardEvent |code| values. It does not vary depending |
| 562 // characters, this may or may not be a mapped value, imitating MS Windows: | 606 // on key layout. |
| 607 // - Event::flags() provides the active modifiers for the physical key |
| 608 // press. Its value reflects the state after the event; that is, for |
| 609 // a modifier key, a press includes the corresponding flag and a release |
| 610 // does not. |
| 611 // -- key_ and character_ provide the meaning of the key event, in the context |
| 612 // of the active layout and modifiers. Together they correspond to DOM |
| 613 // KeyboardEvent |key| values. |
| 614 // - key_ is an enumeration of non-Unicode meanings, plus sentinels |
| 615 // (specifically DomKey::CHARACTER for Unicode meanings). |
| 616 // - character_ is the code point for Unicode meanings. |
| 617 // -- key_code_ is a KeyboardCode value associated with the key. This supports |
| 618 // the legacy web event |keyCode| field, and the VKEY_ values are chosen |
| 619 // to match Windows/IE for compatibility. For printable characters, this |
| 620 // may or may not be a layout-mapped value, imitating MS Windows: |
| 563 // if the mapped key generates a character that has an associated VKEY_ | 621 // if the mapped key generates a character that has an associated VKEY_ |
| 564 // code, then key_code_ is that code; if not, then key_code_ is the unmapped | 622 // code, then key_code_ is that code; if not, then key_code_ is the unmapped |
| 565 // VKEY_ code. For example, US, Greek, Cyrillic, Japanese, etc. all use | 623 // VKEY_ code. For example, US, Greek, Cyrillic, Japanese, etc. all use |
| 566 // VKEY_Q for the key beside Tab, while French uses VKEY_A. | 624 // VKEY_Q for the key beside Tab, while French uses VKEY_A. |
| 567 // -- code_ is in one-to-one correspondence with a physical keyboard | |
| 568 // location, and does not vary depending on key layout. | |
| 569 // | 625 // |
| 570 // For a character event, | 626 // For a character event, |
| 571 // -- is_char_ is true. | 627 // -- is_char_ is true. |
| 572 // -- type() is ET_KEY_PRESSED. | 628 // -- type() is ET_KEY_PRESSED. |
| 573 // -- character_ is a UTF-16 character value. | 629 // -- code_ is DomCode::NONE. |
| 630 // -- key_ is DomKey::CHARACTER and character_ is a UTF-16 code point. |
| 574 // -- key_code_ is conflated with character_ by some code, because both | 631 // -- key_code_ is conflated with character_ by some code, because both |
| 575 // arrive in the wParam field of a Windows event. | 632 // arrive in the wParam field of a Windows event. |
| 576 // -- code_ is the empty string. | |
| 577 // | 633 // |
| 578 class EVENTS_EXPORT KeyEvent : public Event { | 634 class EVENTS_EXPORT KeyEvent : public Event { |
| 579 public: | 635 public: |
| 580 KeyEvent(); | 636 // Create a KeyEvent from a NativeEvent. For Windows this native event can |
| 637 // be either a keystroke message (WM_KEYUP/WM_KEYDOWN) or a character message |
| 638 // (WM_CHAR). Other systems have only keystroke events. |
| 639 explicit KeyEvent(const base::NativeEvent& native_event); |
| 581 | 640 |
| 582 // Create a keystroke event. | 641 // Create a keystroke event. |
| 583 KeyEvent(EventType type, KeyboardCode key_code, int flags); | 642 KeyEvent(EventType type, KeyboardCode key_code, int flags); |
| 584 | 643 |
| 644 // Create a fully defined keystroke event. |
| 645 KeyEvent(EventType type, |
| 646 KeyboardCode key_code, |
| 647 DomCode code, |
| 648 int flags, |
| 649 DomKey key, |
| 650 base::char16 character, |
| 651 base::TimeDelta time_stamp); |
| 652 |
| 585 // Create a character event. | 653 // Create a character event. |
| 586 KeyEvent(base::char16 character, KeyboardCode key_code, int flags); | 654 KeyEvent(base::char16 character, KeyboardCode key_code, int flags); |
| 587 | 655 |
| 588 // Used for synthetic events with code of DOM KeyboardEvent (e.g. 'KeyA') | 656 // Used for synthetic events with code of DOM KeyboardEvent (e.g. 'KeyA') |
| 589 // See also: ui/events/keycodes/dom4/keycode_converter_data.h | 657 // See also: ui/events/keycodes/dom/dom_values.txt |
| 590 KeyEvent(EventType type, | 658 KeyEvent(EventType type, |
| 591 KeyboardCode key_code, | 659 KeyboardCode key_code, |
| 592 const std::string& code, | 660 DomCode code, |
| 593 int flags); | 661 int flags); |
| 594 | 662 |
| 595 KeyEvent(const KeyEvent& rhs); | 663 KeyEvent(const KeyEvent& rhs); |
| 596 | 664 |
| 597 KeyEvent& operator=(const KeyEvent& rhs); | 665 KeyEvent& operator=(const KeyEvent& rhs); |
| 598 | 666 |
| 599 ~KeyEvent() override; | 667 ~KeyEvent() override; |
| 600 | 668 |
| 601 // TODO(erg): While we transition to mojo, we have to hack around a mismatch | 669 // TODO(erg): While we transition to mojo, we have to hack around a mismatch |
| 602 // in our event types. Our ui::Events don't really have all the data we need | 670 // in our event types. Our ui::Events don't really have all the data we need |
| (...skipping 19 matching lines...) Expand all Loading... |
| 622 // If this is a keystroke event with key_code_ VKEY_RETURN, returns '\r'; | 690 // If this is a keystroke event with key_code_ VKEY_RETURN, returns '\r'; |
| 623 // otherwise returns the same as GetCharacter(). | 691 // otherwise returns the same as GetCharacter(). |
| 624 base::char16 GetUnmodifiedText() const; | 692 base::char16 GetUnmodifiedText() const; |
| 625 | 693 |
| 626 // If the Control key is down in the event, returns a layout-independent | 694 // If the Control key is down in the event, returns a layout-independent |
| 627 // character (corresponding to US layout); otherwise returns the same | 695 // character (corresponding to US layout); otherwise returns the same |
| 628 // as GetUnmodifiedText(). | 696 // as GetUnmodifiedText(). |
| 629 base::char16 GetText() const; | 697 base::char16 GetText() const; |
| 630 | 698 |
| 631 // Gets the platform key code. For XKB, this is the xksym value. | 699 // Gets the platform key code. For XKB, this is the xksym value. |
| 700 void set_platform_keycode(uint32 keycode) { platform_keycode_ = keycode; } |
| 632 uint32 platform_keycode() const { return platform_keycode_; } | 701 uint32 platform_keycode() const { return platform_keycode_; } |
| 633 void set_platform_keycode(uint32 keycode) { platform_keycode_ = keycode; } | |
| 634 | 702 |
| 635 // Gets the associated (Windows-based) KeyboardCode for this key event. | 703 // Gets the associated (Windows-based) KeyboardCode for this key event. |
| 636 // Historically, this has also been used to obtain the character associated | 704 // Historically, this has also been used to obtain the character associated |
| 637 // with a character event, because both use the Window message 'wParam' field. | 705 // with a character event, because both use the Window message 'wParam' field. |
| 638 // This should be avoided; if necessary for backwards compatibility, use | 706 // This should be avoided; if necessary for backwards compatibility, use |
| 639 // GetConflatedWindowsKeyCode(). | 707 // GetConflatedWindowsKeyCode(). |
| 640 KeyboardCode key_code() const { return key_code_; } | 708 KeyboardCode key_code() const { return key_code_; } |
| 641 void set_key_code(KeyboardCode key_code) { key_code_ = key_code; } | |
| 642 | 709 |
| 643 // True if this is a character event, false if this is a keystroke event. | 710 // True if this is a character event, false if this is a keystroke event. |
| 644 bool is_char() const { return is_char_; } | 711 bool is_char() const { return is_char_; } |
| 645 void set_is_char(bool is_char) { is_char_ = is_char; } | 712 |
| 713 // This is only intended to be used externally by classes that are modifying |
| 714 // events in an EventRewriter. |
| 715 void set_key_code(KeyboardCode key_code) { key_code_ = key_code; } |
| 646 | 716 |
| 647 // Returns the same value as key_code(), except that located codes are | 717 // Returns the same value as key_code(), except that located codes are |
| 648 // returned in place of non-located ones (e.g. VKEY_LSHIFT or VKEY_RSHIFT | 718 // returned in place of non-located ones (e.g. VKEY_LSHIFT or VKEY_RSHIFT |
| 649 // instead of VKEY_SHIFT). This is a hybrid of semantic and physical | 719 // instead of VKEY_SHIFT). This is a hybrid of semantic and physical |
| 650 // for legacy DOM reasons. | 720 // for legacy DOM reasons. |
| 651 KeyboardCode GetLocatedWindowsKeyboardCode() const; | 721 KeyboardCode GetLocatedWindowsKeyboardCode() const; |
| 652 | 722 |
| 653 // For a keystroke event, returns the same value as key_code(). | 723 // For a keystroke event, returns the same value as key_code(). |
| 654 // For a character event, returns the same value as GetCharacter(). | 724 // For a character event, returns the same value as GetCharacter(). |
| 655 // This exists for backwards compatibility with Windows key events. | 725 // This exists for backwards compatibility with Windows key events. |
| 656 uint16 GetConflatedWindowsKeyCode() const; | 726 uint16 GetConflatedWindowsKeyCode() const; |
| 657 | 727 |
| 658 // Returns true for [Alt]+<num-pad digit> Unicode alt key codes used by Win. | 728 // Returns true for [Alt]+<num-pad digit> Unicode alt key codes used by Win. |
| 659 // TODO(msw): Additional work may be needed for analogues on other platforms. | 729 // TODO(msw): Additional work may be needed for analogues on other platforms. |
| 660 bool IsUnicodeKeyCode() const; | 730 bool IsUnicodeKeyCode() const; |
| 661 | 731 |
| 662 std::string code() const { return code_; } | 732 // Returns the DOM .code (physical key identifier) for a keystroke event. |
| 663 void set_code(const std::string& code) { code_ = code; } | 733 DomCode code() const { return code_; }; |
| 734 std::string GetCodeString() const; |
| 735 |
| 736 // Returns the DOM .key (layout meaning) for a keystroke event. |
| 737 DomKey GetDomKey() const; |
| 664 | 738 |
| 665 // Normalizes flags_ so that it describes the state after the event. | 739 // Normalizes flags_ so that it describes the state after the event. |
| 666 // (Native X11 event flags describe the state before the event.) | 740 // (Native X11 event flags describe the state before the event.) |
| 667 void NormalizeFlags(); | 741 void NormalizeFlags(); |
| 668 | 742 |
| 669 // Returns true if the key event has already been processed by an input method | |
| 670 // and there is no need to pass the key event to the input method again. | |
| 671 bool IsTranslated() const; | |
| 672 // Marks this key event as translated or not translated. | |
| 673 void SetTranslated(bool translated); | |
| 674 | |
| 675 protected: | 743 protected: |
| 676 friend class KeyEventTestApi; | 744 friend class KeyEventTestApi; |
| 677 | 745 |
| 746 // This allows a subclass TranslatedKeyEvent to be a non character event. |
| 747 void set_is_char(bool is_char) { is_char_ = is_char; } |
| 748 |
| 678 private: | 749 private: |
| 679 // True if the key press originated from a 'right' key (VKEY_RSHIFT, etc.). | 750 // Determine key_ and character_ on a keystroke event from code_ and flags(). |
| 680 bool IsRightSideKey() const; | 751 void ApplyLayout() const; |
| 681 | 752 |
| 682 KeyboardCode key_code_; | 753 KeyboardCode key_code_; |
| 683 | 754 |
| 684 // String of 'code' defined in DOM KeyboardEvent (e.g. 'KeyA', 'Space') | 755 // DOM KeyboardEvent |code| (e.g. DomCode::KEY_A, DomCode::SPACE). |
| 685 // http://www.w3.org/TR/uievents/#keyboard-key-codes. | 756 // http://www.w3.org/TR/DOM-Level-3-Events-code/ |
| 686 // | 757 // |
| 687 // This value represents the physical position in the keyboard and can be | 758 // This value represents the physical position in the keyboard and can be |
| 688 // converted from / to keyboard scan code like XKB. | 759 // converted from / to keyboard scan code like XKB. |
| 689 std::string code_; | 760 DomCode code_; |
| 690 | 761 |
| 691 // True if this is a character event, false if this is a keystroke event. | 762 // True if this is a character event, false if this is a keystroke event. |
| 692 bool is_char_; | 763 bool is_char_; |
| 693 | 764 |
| 694 // The platform related keycode value. For XKB, it's keysym value. | 765 // The platform related keycode value. For XKB, it's keysym value. |
| 695 // For now, this is used for CharacterComposer in ChromeOS. | 766 // For now, this is used for CharacterComposer in ChromeOS. |
| 696 uint32 platform_keycode_; | 767 mutable uint32 platform_keycode_; |
| 768 |
| 769 // TODO(kpschoedel): refactor so that key_ and character_ are not mutable. |
| 770 // This requires defining the KeyEvent completely at construction rather |
| 771 // than lazily under GetCharacter(), which likely also means removing |
| 772 // the two 'incomplete' constructors. crbug.com/444045 |
| 773 // |
| 774 // DOM KeyboardEvent |key| |
| 775 // http://www.w3.org/TR/DOM-Level-3-Events-key/ |
| 776 // |
| 777 // This value, together with character_, represents the meaning of a key. |
| 778 // The value is DomKey::CHARACTER when the interpretation is a character. |
| 779 // This, along with character_, is not necessarily initialized when the |
| 780 // event is constructed; it may be set only if and when GetCharacter() |
| 781 // or GetDomKey() is called. |
| 782 mutable DomKey key_; |
| 697 | 783 |
| 698 // String of 'key' defined in DOM KeyboardEvent (e.g. 'a', 'â') | 784 // String of 'key' defined in DOM KeyboardEvent (e.g. 'a', 'â') |
| 699 // http://www.w3.org/TR/uievents/#keyboard-key-codes. | 785 // http://www.w3.org/TR/uievents/#keyboard-key-codes. |
| 700 // | 786 // |
| 701 // This value represents the text that the key event will insert to input | 787 // This value represents the text that the key event will insert to input |
| 702 // field. For key with modifier key, it may have specifial text. | 788 // field. For key with modifier key, it may have specifial text. |
| 703 // e.g. CTRL+A has '\x01'. | 789 // e.g. CTRL+A has '\x01'. |
| 704 mutable base::char16 character_; | 790 mutable base::char16 character_; |
| 705 | 791 |
| 706 // Parts of our event handling require raw native events (see both the | 792 // Parts of our event handling require raw native events (see both the |
| 707 // windows and linux implementations of web_input_event in content/). Because | 793 // windows and linux implementations of web_input_event in content/). Because |
| 708 // mojo instead serializes and deserializes events in potentially different | 794 // mojo instead serializes and deserializes events in potentially different |
| 709 // processes, we need to have a mechanism to keep track of this data. | 795 // processes, we need to have a mechanism to keep track of this data. |
| 710 scoped_ptr<ExtendedKeyEventData> extended_key_event_data_; | 796 scoped_ptr<ExtendedKeyEventData> extended_key_event_data_; |
| 797 |
| 798 static bool IsRepeated(const KeyEvent& event); |
| 799 |
| 800 static KeyEvent* last_key_event_; |
| 711 }; | 801 }; |
| 712 | 802 |
| 713 class EVENTS_EXPORT ScrollEvent : public MouseEvent { | 803 class EVENTS_EXPORT ScrollEvent : public MouseEvent { |
| 714 public: | 804 public: |
| 715 ScrollEvent(); | 805 explicit ScrollEvent(const base::NativeEvent& native_event); |
| 716 template <class T> | 806 template <class T> |
| 717 ScrollEvent(const ScrollEvent& model, | 807 ScrollEvent(const ScrollEvent& model, |
| 718 T* source, | 808 T* source, |
| 719 T* target) | 809 T* target) |
| 720 : MouseEvent(model, source, target), | 810 : MouseEvent(model, source, target), |
| 721 x_offset_(model.x_offset_), | 811 x_offset_(model.x_offset_), |
| 722 y_offset_(model.y_offset_), | 812 y_offset_(model.y_offset_), |
| 723 x_offset_ordinal_(model.x_offset_ordinal_), | 813 x_offset_ordinal_(model.x_offset_ordinal_), |
| 724 y_offset_ordinal_(model.y_offset_ordinal_), | 814 y_offset_ordinal_(model.y_offset_ordinal_), |
| 725 finger_count_(model.finger_count_){ | 815 finger_count_(model.finger_count_){ |
| (...skipping 10 matching lines...) Expand all Loading... |
| 736 float y_offset_ordinal, | 826 float y_offset_ordinal, |
| 737 int finger_count); | 827 int finger_count); |
| 738 | 828 |
| 739 // Scale the scroll event's offset value. | 829 // Scale the scroll event's offset value. |
| 740 // This is useful in the multi-monitor setup where it needs to be scaled | 830 // This is useful in the multi-monitor setup where it needs to be scaled |
| 741 // to provide a consistent user experience. | 831 // to provide a consistent user experience. |
| 742 void Scale(const float factor); | 832 void Scale(const float factor); |
| 743 | 833 |
| 744 float x_offset() const { return x_offset_; } | 834 float x_offset() const { return x_offset_; } |
| 745 float y_offset() const { return y_offset_; } | 835 float y_offset() const { return y_offset_; } |
| 746 void set_offset(float x, float y) { | |
| 747 x_offset_ = x; | |
| 748 y_offset_ = y; | |
| 749 } | |
| 750 | |
| 751 float x_offset_ordinal() const { return x_offset_ordinal_; } | 836 float x_offset_ordinal() const { return x_offset_ordinal_; } |
| 752 float y_offset_ordinal() const { return y_offset_ordinal_; } | 837 float y_offset_ordinal() const { return y_offset_ordinal_; } |
| 753 void set_offset_ordinal(float x, float y) { | |
| 754 x_offset_ordinal_ = x; | |
| 755 y_offset_ordinal_ = y; | |
| 756 } | |
| 757 | |
| 758 int finger_count() const { return finger_count_; } | 838 int finger_count() const { return finger_count_; } |
| 759 void set_finger_count(int finger_count) { finger_count_ = finger_count; } | |
| 760 | 839 |
| 761 private: | 840 private: |
| 762 // Potential accelerated offsets. | 841 // Potential accelerated offsets. |
| 763 float x_offset_; | 842 float x_offset_; |
| 764 float y_offset_; | 843 float y_offset_; |
| 765 // Unaccelerated offsets. | 844 // Unaccelerated offsets. |
| 766 float x_offset_ordinal_; | 845 float x_offset_ordinal_; |
| 767 float y_offset_ordinal_; | 846 float y_offset_ordinal_; |
| 768 // Number of fingers on the pad. | 847 // Number of fingers on the pad. |
| 769 int finger_count_; | 848 int finger_count_; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 790 | 869 |
| 791 const GestureEventDetails& details() const { return details_; } | 870 const GestureEventDetails& details() const { return details_; } |
| 792 | 871 |
| 793 private: | 872 private: |
| 794 GestureEventDetails details_; | 873 GestureEventDetails details_; |
| 795 }; | 874 }; |
| 796 | 875 |
| 797 } // namespace ui | 876 } // namespace ui |
| 798 | 877 |
| 799 #endif // UI_EVENTS_EVENT_H_ | 878 #endif // UI_EVENTS_EVENT_H_ |
| OLD | NEW |