Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Unified Diff: ui/base/events/event.h

Issue 16950030: Handle alternate types in HandleMouseEvent. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Move virtual override to end of class/public. Created 7 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | ui/base/events/event.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/base/events/event.h
diff --git a/ui/base/events/event.h b/ui/base/events/event.h
index a17da790ba21d77e2e8b922dfbb9508fe5e770b3..23c3298fdefad499e2d83c0d4aa17afd1c0c9854 100644
--- a/ui/base/events/event.h
+++ b/ui/base/events/event.h
@@ -1,712 +1,717 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef UI_BASE_EVENTS_EVENT_H_
-#define UI_BASE_EVENTS_EVENT_H_
-
-#include "base/basictypes.h"
-#include "base/compiler_specific.h"
-#include "base/event_types.h"
-#include "base/logging.h"
-#include "base/time.h"
-#include "ui/base/dragdrop/os_exchange_data.h"
-#include "ui/base/events/event_constants.h"
-#include "ui/base/gestures/gesture_types.h"
-#include "ui/base/keycodes/keyboard_codes.h"
-#include "ui/base/latency_info.h"
-#include "ui/base/ui_export.h"
-#include "ui/gfx/point.h"
-
-namespace gfx {
-class Transform;
-}
-
-namespace ui {
-class EventTarget;
-
-class UI_EXPORT Event {
- public:
- virtual ~Event();
-
- class DispatcherApi {
- public:
- explicit DispatcherApi(Event* event) : event_(event) {}
-
- void set_target(EventTarget* target) {
- event_->target_ = target;
- }
-
- void set_phase(EventPhase phase) { event_->phase_ = phase; }
- void set_result(int result) {
- event_->result_ = static_cast<EventResult>(result);
- }
-
- private:
- DispatcherApi();
- Event* event_;
-
- DISALLOW_COPY_AND_ASSIGN(DispatcherApi);
- };
-
- // For testing.
- class TestApi {
- public:
- explicit TestApi(Event* event) : event_(event) {}
-
- void set_time_stamp(base::TimeDelta time_stamp) {
- event_->time_stamp_ = time_stamp;
- }
-
- private:
- TestApi();
- Event* event_;
- };
-
- const base::NativeEvent& native_event() const { return native_event_; }
- EventType type() const { return type_; }
- const std::string& name() const { return name_; }
- // time_stamp represents time since machine was booted.
- const base::TimeDelta& time_stamp() const { return time_stamp_; }
- int flags() const { return flags_; }
-
- // This is only intended to be used externally by classes that are modifying
- // events in EventFilter::PreHandleKeyEvent().
- void set_flags(int flags) { flags_ = flags; }
-
- EventTarget* target() const { return target_; }
- EventPhase phase() const { return phase_; }
- EventResult result() const { return result_; }
- bool dispatch_to_hidden_targets() const {
- return dispatch_to_hidden_targets_;
- }
-
- LatencyInfo* latency() { return &latency_; }
- void set_latency(const LatencyInfo& latency) { latency_ = latency; }
-
- // By default, events are "cancelable", this means any default processing that
- // the containing abstraction layer may perform can be prevented by calling
- // SetHandled(). SetHandled() or StopPropagation() must not be called for
- // events that are not cancelable.
- bool cancelable() const { return cancelable_; }
-
- // The following methods return true if the respective keys were pressed at
- // the time the event was created.
- bool IsShiftDown() const { return (flags_ & EF_SHIFT_DOWN) != 0; }
- bool IsControlDown() const { return (flags_ & EF_CONTROL_DOWN) != 0; }
- bool IsCapsLockDown() const { return (flags_ & EF_CAPS_LOCK_DOWN) != 0; }
- bool IsAltDown() const { return (flags_ & EF_ALT_DOWN) != 0; }
-
- bool IsKeyEvent() const {
- return type_ == ET_KEY_PRESSED ||
- type_ == ET_KEY_RELEASED ||
- type_ == ET_TRANSLATED_KEY_PRESS ||
- type_ == ET_TRANSLATED_KEY_RELEASE;
- }
-
- bool IsMouseEvent() const {
- return type_ == ET_MOUSE_PRESSED ||
- type_ == ET_MOUSE_DRAGGED ||
- type_ == ET_MOUSE_RELEASED ||
- type_ == ET_MOUSE_MOVED ||
- type_ == ET_MOUSE_ENTERED ||
- type_ == ET_MOUSE_EXITED ||
- type_ == ET_MOUSEWHEEL ||
- type_ == ET_MOUSE_CAPTURE_CHANGED;
- }
-
- bool IsTouchEvent() const {
- return type_ == ET_TOUCH_RELEASED ||
- type_ == ET_TOUCH_PRESSED ||
- type_ == ET_TOUCH_MOVED ||
- type_ == ET_TOUCH_STATIONARY ||
- type_ == ET_TOUCH_CANCELLED;
- }
-
- bool IsGestureEvent() const {
- switch (type_) {
- case ET_GESTURE_SCROLL_BEGIN:
- case ET_GESTURE_SCROLL_END:
- case ET_GESTURE_SCROLL_UPDATE:
- case ET_GESTURE_TAP:
- case ET_GESTURE_TAP_CANCEL:
- case ET_GESTURE_TAP_DOWN:
- case ET_GESTURE_BEGIN:
- case ET_GESTURE_END:
- case ET_GESTURE_TWO_FINGER_TAP:
- case ET_GESTURE_PINCH_BEGIN:
- case ET_GESTURE_PINCH_END:
- case ET_GESTURE_PINCH_UPDATE:
- case ET_GESTURE_LONG_PRESS:
- case ET_GESTURE_LONG_TAP:
- case ET_GESTURE_MULTIFINGER_SWIPE:
- return true;
-
- case ET_SCROLL_FLING_CANCEL:
- case ET_SCROLL_FLING_START:
- // These can be ScrollEvents too. EF_FROM_TOUCH determines if they're
- // Gesture or Scroll events.
- return (flags_ & EF_FROM_TOUCH) == EF_FROM_TOUCH;
-
- default:
- break;
- }
- return false;
- }
-
- bool IsScrollEvent() const {
- // Flings can be GestureEvents too. EF_FROM_TOUCH determins if they're
- // Gesture or Scroll events.
- return type_ == ET_SCROLL ||
- ((type_ == ET_SCROLL_FLING_START ||
- type_ == ET_SCROLL_FLING_CANCEL) &&
- !(flags() & EF_FROM_TOUCH));
- }
-
- bool IsScrollGestureEvent() const {
- return type_ == ET_GESTURE_SCROLL_BEGIN ||
- type_ == ET_GESTURE_SCROLL_UPDATE ||
- type_ == ET_GESTURE_SCROLL_END;
- }
-
- bool IsFlingScrollEvent() const {
- return type_ == ET_SCROLL_FLING_CANCEL ||
- type_ == ET_SCROLL_FLING_START;
- }
-
- // Returns true if the event has a valid |native_event_|.
- bool HasNativeEvent() const;
-
- // Immediately stops the propagation of the event. This must be called only
- // from an EventHandler during an event-dispatch. Any event handler that may
- // be in the list will not receive the event after this is called.
- // Note that StopPropagation() can be called only for cancelable events.
- void StopPropagation();
- bool stopped_propagation() const { return !!(result_ & ER_CONSUMED); }
-
- // Marks the event as having been handled. A handled event does not reach the
- // next event phase. For example, if an event is handled during the pre-target
- // phase, then the event is dispatched to all pre-target handlers, but not to
- // the target or post-target handlers.
- // Note that SetHandled() can be called only for cancelable events.
- void SetHandled();
- bool handled() const { return result_ != ER_UNHANDLED; }
-
- protected:
- Event(EventType type, base::TimeDelta time_stamp, int flags);
- Event(const base::NativeEvent& native_event, EventType type, int flags);
- Event(const Event& copy);
- void SetType(EventType type);
- void set_delete_native_event(bool delete_native_event) {
- delete_native_event_ = delete_native_event;
- }
- void set_cancelable(bool cancelable) { cancelable_ = cancelable; }
- void set_dispatch_to_hidden_targets(bool dispatch_to_hidden_targets) {
- dispatch_to_hidden_targets_ = dispatch_to_hidden_targets;
- }
-
- void set_time_stamp(const base::TimeDelta& time_stamp) {
- time_stamp_ = time_stamp;
- }
-
- void set_name(const std::string& name) { name_ = name; }
-
- void InitLatencyInfo();
-
- private:
- void operator=(const Event&);
-
- // Safely initializes the native event members of this class.
- void Init();
- void InitWithNativeEvent(const base::NativeEvent& native_event);
-
- EventType type_;
- std::string name_;
- base::TimeDelta time_stamp_;
- LatencyInfo latency_;
- int flags_;
- bool dispatch_to_hidden_targets_;
- base::NativeEvent native_event_;
- bool delete_native_event_;
- bool cancelable_;
- EventTarget* target_;
- EventPhase phase_;
- EventResult result_;
-};
-
-class UI_EXPORT CancelModeEvent : public Event {
- public:
- CancelModeEvent();
- virtual ~CancelModeEvent();
-};
-
-class UI_EXPORT LocatedEvent : public Event {
- public:
- // For testing.
- class TestApi : public Event::TestApi {
- public:
- explicit TestApi(LocatedEvent* located_event)
- : Event::TestApi(located_event),
- located_event_(located_event) {}
-
- void set_location(const gfx::Point& location) {
- located_event_->location_ = location;
- }
-
- private:
- TestApi();
- LocatedEvent* located_event_;
- };
-
- virtual ~LocatedEvent();
-
- int x() const { return location_.x(); }
- int y() const { return location_.y(); }
- void set_location(const gfx::Point& location) { location_ = location; }
- gfx::Point location() const { return location_; }
- void set_root_location(const gfx::Point& root_location) {
- root_location_ = root_location;
- }
- gfx::Point root_location() const { return root_location_; }
-
- // Transform the locations using |inverted_root_transform|.
- // This is applied to both |location_| and |root_location_|.
- virtual void UpdateForRootTransform(
- const gfx::Transform& inverted_root_transform);
-
- template <class T> void ConvertLocationToTarget(T* source, T* target) {
- if (target && target != source)
- T::ConvertPointToTarget(source, target, &location_);
- }
-
- protected:
- explicit LocatedEvent(const base::NativeEvent& native_event);
-
- // Create a new LocatedEvent which is identical to the provided model.
- // If source / target windows are provided, the model location will be
- // converted from |source| coordinate system to |target| coordinate system.
- template <class T>
- LocatedEvent(const LocatedEvent& model, T* source, T* target)
- : Event(model),
- location_(model.location_),
- root_location_(model.root_location_) {
- ConvertLocationToTarget(source, target);
- }
-
- // Used for synthetic events in testing.
- LocatedEvent(EventType type,
- const gfx::Point& location,
- const gfx::Point& root_location,
- base::TimeDelta time_stamp,
- int flags);
-
- gfx::Point location_;
-
- // |location_| multiplied by an optional transformation matrix for
- // rotations, animations and skews.
- gfx::Point root_location_;
-};
-
-class UI_EXPORT MouseEvent : public LocatedEvent {
- public:
- explicit MouseEvent(const base::NativeEvent& native_event);
-
- // Create a new MouseEvent based on the provided model.
- // Uses the provided |type| and |flags| for the new event.
- // If source / target windows are provided, the model location will be
- // converted from |source| coordinate system to |target| coordinate system.
- template <class T>
- MouseEvent(const MouseEvent& model, T* source, T* target)
- : LocatedEvent(model, source, target),
- changed_button_flags_(model.changed_button_flags_) {
- }
-
- template <class T>
- MouseEvent(const MouseEvent& model,
- T* source,
- T* target,
- EventType type,
- int flags)
- : LocatedEvent(model, source, target),
- changed_button_flags_(model.changed_button_flags_) {
- SetType(type);
- set_flags(flags);
- }
-
- // Used for synthetic events in testing and by the gesture recognizer.
- MouseEvent(EventType type,
- const gfx::Point& location,
- const gfx::Point& root_location,
- int flags);
-
- // Conveniences to quickly test what button is down
- bool IsOnlyLeftMouseButton() const {
- return (flags() & EF_LEFT_MOUSE_BUTTON) &&
- !(flags() & (EF_MIDDLE_MOUSE_BUTTON | EF_RIGHT_MOUSE_BUTTON));
- }
-
- bool IsLeftMouseButton() const {
- return (flags() & EF_LEFT_MOUSE_BUTTON) != 0;
- }
-
- bool IsOnlyMiddleMouseButton() const {
- return (flags() & EF_MIDDLE_MOUSE_BUTTON) &&
- !(flags() & (EF_LEFT_MOUSE_BUTTON | EF_RIGHT_MOUSE_BUTTON));
- }
-
- bool IsMiddleMouseButton() const {
- return (flags() & EF_MIDDLE_MOUSE_BUTTON) != 0;
- }
-
- bool IsOnlyRightMouseButton() const {
- return (flags() & EF_RIGHT_MOUSE_BUTTON) &&
- !(flags() & (EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON));
- }
-
- bool IsRightMouseButton() const {
- return (flags() & EF_RIGHT_MOUSE_BUTTON) != 0;
- }
-
- bool IsAnyButton() const {
- return (flags() & (EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON |
- EF_RIGHT_MOUSE_BUTTON)) != 0;
- }
-
- // Compares two mouse down events and returns true if the second one should
- // be considered a repeat of the first.
- static bool IsRepeatedClickEvent(
- const MouseEvent& event1,
- const MouseEvent& event2);
-
- // Get the click count. Can be 1, 2 or 3 for mousedown messages, 0 otherwise.
- int GetClickCount() const;
-
- // Set the click count for a mousedown message. Can be 1, 2 or 3.
- void SetClickCount(int click_count);
-
- // Identifies the button that changed. During a press this corresponds to the
- // button that was pressed and during a release this corresponds to the button
- // that was released.
- // NOTE: during a press and release flags() contains the complete set of
- // flags. Use this to determine the button that was pressed or released.
- int changed_button_flags() const { return changed_button_flags_; }
-
- private:
- // Returns the repeat count based on the previous mouse click, if it is
- // recent enough and within a small enough distance.
- static int GetRepeatCount(const MouseEvent& click_event);
-
- gfx::Point root_location_;
-
- // See description above getter for details.
- int changed_button_flags_;
-
- static MouseEvent* last_click_event_;
-};
-
-class ScrollEvent;
-
-class UI_EXPORT MouseWheelEvent : public MouseEvent {
- public:
- // See |offset| for details.
- static const int kWheelDelta;
-
- explicit MouseWheelEvent(const base::NativeEvent& native_event);
- explicit MouseWheelEvent(const ScrollEvent& scroll_event);
- MouseWheelEvent(const MouseEvent& mouse_event, int x_offset, int y_offset);
-
- template <class T>
- MouseWheelEvent(const MouseWheelEvent& model,
- T* source,
- T* target,
- EventType type,
- int flags)
- : MouseEvent(model, source, target, type, flags),
- offset_(model.x_offset(), model.y_offset()){
- }
-
- // The amount to scroll. This is in multiples of kWheelDelta.
- // Note: x_offset() > 0/y_offset() > 0 means scroll left/up.
- int x_offset() const { return offset_.x(); }
- int y_offset() const { return offset_.y(); }
- const gfx::Vector2d& offset() const { return offset_; }
-
- private:
- gfx::Vector2d offset_;
-
- DISALLOW_COPY_AND_ASSIGN(MouseWheelEvent);
-};
-
-class UI_EXPORT TouchEvent : public LocatedEvent {
- public:
- explicit TouchEvent(const base::NativeEvent& native_event);
-
- // Create a new TouchEvent which is identical to the provided model.
- // If source / target windows are provided, the model location will be
- // converted from |source| coordinate system to |target| coordinate system.
- template <class T>
- TouchEvent(const TouchEvent& model, T* source, T* target)
- : LocatedEvent(model, source, target),
- touch_id_(model.touch_id_),
- radius_x_(model.radius_x_),
- radius_y_(model.radius_y_),
- rotation_angle_(model.rotation_angle_),
- force_(model.force_) {
- }
-
- TouchEvent(EventType type,
- const gfx::Point& root_location,
- int touch_id,
- base::TimeDelta time_stamp);
-
- TouchEvent(EventType type,
- const gfx::Point& location,
- int flags,
- int touch_id,
- base::TimeDelta timestamp,
- float radius_x,
- float radius_y,
- float angle,
- float force);
-
- virtual ~TouchEvent();
-
- int touch_id() const { return touch_id_; }
- float radius_x() const { return radius_x_; }
- float radius_y() const { return radius_y_; }
- float rotation_angle() const { return rotation_angle_; }
- float force() const { return force_; }
-
- // Relocate the touch-point to a new |origin|.
- // This is useful when touch event is in X Root Window coordinates,
- // and it needs to be mapped into Aura Root Window coordinates.
- void Relocate(const gfx::Point& origin);
-
- // Used for unit tests.
- void set_radius_x(const float r) { radius_x_ = r; }
- void set_radius_y(const float r) { radius_y_ = r; }
-
- // Overridden from LocatedEvent.
- virtual void UpdateForRootTransform(
- const gfx::Transform& inverted_root_transform) OVERRIDE;
-
- protected:
- void set_radius(float radius_x, float radius_y) {
- radius_x_ = radius_x;
- radius_y_ = radius_y;
- }
-
- void set_rotation_angle(float rotation_angle) {
- rotation_angle_ = rotation_angle;
- }
-
- void set_force(float force) { force_ = force; }
-
- private:
- // The identity (typically finger) of the touch starting at 0 and incrementing
- // for each separable additional touch that the hardware can detect.
- const int touch_id_;
-
- // Radius of the X (major) axis of the touch ellipse. 0.0 if unknown.
- float radius_x_;
-
- // Radius of the Y (minor) axis of the touch ellipse. 0.0 if unknown.
- float radius_y_;
-
- // Angle of the major axis away from the X axis. Default 0.0.
- float rotation_angle_;
-
- // Force (pressure) of the touch. Normalized to be [0, 1]. Default to be 0.0.
- float force_;
-};
-
-class UI_EXPORT KeyEvent : public Event {
- public:
- KeyEvent(const base::NativeEvent& native_event, bool is_char);
-
- // Used for synthetic events.
- KeyEvent(EventType type, KeyboardCode key_code, int flags, bool is_char);
-
- // These setters allow an I18N virtual keyboard to fabricate a keyboard event
- // which does not have a corresponding KeyboardCode (example: U+00E1 Latin
- // small letter A with acute, U+0410 Cyrillic capital letter A.)
- // GetCharacter() and GetUnmodifiedCharacter() return the character.
- void set_character(uint16 character) { character_ = character; }
- void set_unmodified_character(uint16 unmodified_character) {
- unmodified_character_ = unmodified_character;
- }
-
- // Gets the character generated by this key event. It only supports Unicode
- // BMP characters.
- uint16 GetCharacter() const;
-
- // Gets the character generated by this key event ignoring concurrently-held
- // modifiers (except shift).
- uint16 GetUnmodifiedCharacter() const;
-
- // Returns the copy of this key event. Used in NativeWebKeyboardEvent.
- KeyEvent* Copy() const;
-
- KeyboardCode key_code() const { return key_code_; }
- bool is_char() const { return is_char_; }
-
- // This is only intended to be used externally by classes that are modifying
- // events in EventFilter::PreHandleKeyEvent(). set_character() should also be
- // called.
- void set_key_code(KeyboardCode key_code) { key_code_ = key_code; }
-
- // Returns true for [Alt]+<num-pad digit> Unicode alt key codes used by Win.
- // TODO(msw): Additional work may be needed for analogues on other platforms.
- bool IsUnicodeKeyCode() const;
-
- // Normalizes flags_ to make it Windows/Mac compatible. Since the way
- // of setting modifier mask on X is very different than Windows/Mac as shown
- // in http://crbug.com/127142#c8, the normalization is necessary.
- void NormalizeFlags();
-
- private:
- KeyboardCode key_code_;
- // True if this is a translated character event (vs. a raw key down). Both
- // share the same type: ET_KEY_PRESSED.
- bool is_char_;
-
- uint16 character_;
- uint16 unmodified_character_;
-};
-
-// A key event which is translated by an input method (IME).
-// For example, if an IME receives a KeyEvent(VKEY_SPACE), and it does not
-// consume the key, the IME usually generates and dispatches a
-// TranslatedKeyEvent(VKEY_SPACE) event. If the IME receives a KeyEvent and
-// it does consume the event, it might dispatch a
-// TranslatedKeyEvent(VKEY_PROCESSKEY) event as defined in the DOM spec.
-class UI_EXPORT TranslatedKeyEvent : public KeyEvent {
- public:
- TranslatedKeyEvent(const base::NativeEvent& native_event, bool is_char);
-
- // Used for synthetic events such as a VKEY_PROCESSKEY key event.
- TranslatedKeyEvent(bool is_press, KeyboardCode key_code, int flags);
-
- // Changes the type() of the object from ET_TRANSLATED_KEY_* to ET_KEY_* so
- // that RenderWidgetHostViewAura and NativeWidgetAura could handle the event.
- void ConvertToKeyEvent();
-
- private:
- DISALLOW_COPY_AND_ASSIGN(TranslatedKeyEvent);
-};
-
-class UI_EXPORT DropTargetEvent : public LocatedEvent {
- public:
- DropTargetEvent(const OSExchangeData& data,
- const gfx::Point& location,
- const gfx::Point& root_location,
- int source_operations);
-
- const OSExchangeData& data() const { return data_; }
- int source_operations() const { return source_operations_; }
-
- private:
- // Data associated with the drag/drop session.
- const OSExchangeData& data_;
-
- // Bitmask of supported DragDropTypes::DragOperation by the source.
- int source_operations_;
-
- DISALLOW_COPY_AND_ASSIGN(DropTargetEvent);
-};
-
-class UI_EXPORT ScrollEvent : public MouseEvent {
- public:
- explicit ScrollEvent(const base::NativeEvent& native_event);
- template <class T>
- ScrollEvent(const ScrollEvent& model,
- T* source,
- T* target)
- : MouseEvent(model, source, target),
- x_offset_(model.x_offset_),
- y_offset_(model.y_offset_),
- x_offset_ordinal_(model.x_offset_ordinal_),
- y_offset_ordinal_(model.y_offset_ordinal_),
- finger_count_(model.finger_count_){
- }
-
- // Used for tests.
- ScrollEvent(EventType type,
- const gfx::Point& location,
- base::TimeDelta time_stamp,
- int flags,
- float x_offset,
- float y_offset,
- float x_offset_ordinal,
- float y_offset_ordinal,
- int finger_count);
-
- // Scale the scroll event's offset value.
- // This is useful in the multi-monitor setup where it needs to be scaled
- // to provide a consistent user experience.
- void Scale(const float factor);
-
- float x_offset() const { return x_offset_; }
- float y_offset() const { return y_offset_; }
- float x_offset_ordinal() const { return x_offset_ordinal_; }
- float y_offset_ordinal() const { return y_offset_ordinal_; }
- int finger_count() const { return finger_count_; }
-
- // Overridden from LocatedEvent.
- virtual void UpdateForRootTransform(
- const gfx::Transform& inverted_root_transform) OVERRIDE;
-
- private:
- // Potential accelerated offsets.
- float x_offset_;
- float y_offset_;
- // Unaccelerated offsets.
- float x_offset_ordinal_;
- float y_offset_ordinal_;
- // Number of fingers on the pad.
- int finger_count_;
-};
-
-class UI_EXPORT GestureEvent : public LocatedEvent {
- public:
- GestureEvent(EventType type,
- int x,
- int y,
- int flags,
- base::TimeDelta time_stamp,
- const GestureEventDetails& details,
- unsigned int touch_ids_bitfield);
-
- // Create a new GestureEvent which is identical to the provided model.
- // If source / target windows are provided, the model location will be
- // converted from |source| coordinate system to |target| coordinate system.
- template <typename T>
- GestureEvent(const GestureEvent& model, T* source, T* target)
- : LocatedEvent(model, source, target),
- details_(model.details_),
- touch_ids_bitfield_(model.touch_ids_bitfield_) {
- }
-
- virtual ~GestureEvent();
-
- const GestureEventDetails& details() const { return details_; }
-
- // Returns the lowest touch-id of any of the touches which make up this
- // gesture. If there are no touches associated with this gesture, returns -1.
- int GetLowestTouchId() const;
-
- private:
- GestureEventDetails details_;
-
- // The set of indices of ones in the binary representation of
- // touch_ids_bitfield_ is the set of touch_ids associate with this gesture.
- // This value is stored as a bitfield because the number of touch ids varies,
- // but we currently don't need more than 32 touches at a time.
- const unsigned int touch_ids_bitfield_;
-
- DISALLOW_COPY_AND_ASSIGN(GestureEvent);
-};
-
-} // namespace ui
-
-#endif // UI_BASE_EVENTS_EVENT_H_
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef UI_BASE_EVENTS_EVENT_H_
+#define UI_BASE_EVENTS_EVENT_H_
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "base/event_types.h"
+#include "base/logging.h"
+#include "base/time.h"
+#include "ui/base/dragdrop/os_exchange_data.h"
+#include "ui/base/events/event_constants.h"
+#include "ui/base/gestures/gesture_types.h"
+#include "ui/base/keycodes/keyboard_codes.h"
+#include "ui/base/latency_info.h"
+#include "ui/base/ui_export.h"
+#include "ui/gfx/point.h"
+
+namespace gfx {
+class Transform;
+}
+
+namespace ui {
+class EventTarget;
+
+class UI_EXPORT Event {
+ public:
+ virtual ~Event();
+
+ class DispatcherApi {
+ public:
+ explicit DispatcherApi(Event* event) : event_(event) {}
+
+ void set_target(EventTarget* target) {
+ event_->target_ = target;
+ }
+
+ void set_phase(EventPhase phase) { event_->phase_ = phase; }
+ void set_result(int result) {
+ event_->result_ = static_cast<EventResult>(result);
+ }
+
+ private:
+ DispatcherApi();
+ Event* event_;
+
+ DISALLOW_COPY_AND_ASSIGN(DispatcherApi);
+ };
+
+ // For testing.
+ class TestApi {
+ public:
+ explicit TestApi(Event* event) : event_(event) {}
+
+ void set_time_stamp(base::TimeDelta time_stamp) {
+ event_->time_stamp_ = time_stamp;
+ }
+
+ private:
+ TestApi();
+ Event* event_;
+ };
+
+ const base::NativeEvent& native_event() const { return native_event_; }
+ EventType type() const { return type_; }
+ const std::string& name() const { return name_; }
+ // time_stamp represents time since machine was booted.
+ const base::TimeDelta& time_stamp() const { return time_stamp_; }
+ int flags() const { return flags_; }
+
+ // This is only intended to be used externally by classes that are modifying
+ // events in EventFilter::PreHandleKeyEvent().
+ void set_flags(int flags) { flags_ = flags; }
+
+ EventTarget* target() const { return target_; }
+ EventPhase phase() const { return phase_; }
+ EventResult result() const { return result_; }
+ bool dispatch_to_hidden_targets() const {
+ return dispatch_to_hidden_targets_;
+ }
+
+ LatencyInfo* latency() { return &latency_; }
+ void set_latency(const LatencyInfo& latency) { latency_ = latency; }
+
+ // By default, events are "cancelable", this means any default processing that
+ // the containing abstraction layer may perform can be prevented by calling
+ // SetHandled(). SetHandled() or StopPropagation() must not be called for
+ // events that are not cancelable.
+ bool cancelable() const { return cancelable_; }
+
+ // The following methods return true if the respective keys were pressed at
+ // the time the event was created.
+ bool IsShiftDown() const { return (flags_ & EF_SHIFT_DOWN) != 0; }
+ bool IsControlDown() const { return (flags_ & EF_CONTROL_DOWN) != 0; }
+ bool IsCapsLockDown() const { return (flags_ & EF_CAPS_LOCK_DOWN) != 0; }
+ bool IsAltDown() const { return (flags_ & EF_ALT_DOWN) != 0; }
+
+ bool IsKeyEvent() const {
+ return type_ == ET_KEY_PRESSED ||
+ type_ == ET_KEY_RELEASED ||
+ type_ == ET_TRANSLATED_KEY_PRESS ||
+ type_ == ET_TRANSLATED_KEY_RELEASE;
+ }
+
+ bool IsMouseEvent() const {
+ return type_ == ET_MOUSE_PRESSED ||
+ type_ == ET_MOUSE_DRAGGED ||
+ type_ == ET_MOUSE_RELEASED ||
+ type_ == ET_MOUSE_MOVED ||
+ type_ == ET_MOUSE_ENTERED ||
+ type_ == ET_MOUSE_EXITED ||
+ type_ == ET_MOUSEWHEEL ||
+ type_ == ET_MOUSE_CAPTURE_CHANGED;
+ }
+
+ bool IsTouchEvent() const {
+ return type_ == ET_TOUCH_RELEASED ||
+ type_ == ET_TOUCH_PRESSED ||
+ type_ == ET_TOUCH_MOVED ||
+ type_ == ET_TOUCH_STATIONARY ||
+ type_ == ET_TOUCH_CANCELLED;
+ }
+
+ bool IsGestureEvent() const {
+ switch (type_) {
+ case ET_GESTURE_SCROLL_BEGIN:
+ case ET_GESTURE_SCROLL_END:
+ case ET_GESTURE_SCROLL_UPDATE:
+ case ET_GESTURE_TAP:
+ case ET_GESTURE_TAP_CANCEL:
+ case ET_GESTURE_TAP_DOWN:
+ case ET_GESTURE_BEGIN:
+ case ET_GESTURE_END:
+ case ET_GESTURE_TWO_FINGER_TAP:
+ case ET_GESTURE_PINCH_BEGIN:
+ case ET_GESTURE_PINCH_END:
+ case ET_GESTURE_PINCH_UPDATE:
+ case ET_GESTURE_LONG_PRESS:
+ case ET_GESTURE_LONG_TAP:
+ case ET_GESTURE_MULTIFINGER_SWIPE:
+ return true;
+
+ case ET_SCROLL_FLING_CANCEL:
+ case ET_SCROLL_FLING_START:
+ // These can be ScrollEvents too. EF_FROM_TOUCH determines if they're
+ // Gesture or Scroll events.
+ return (flags_ & EF_FROM_TOUCH) == EF_FROM_TOUCH;
+
+ default:
+ break;
+ }
+ return false;
+ }
+
+ bool IsScrollEvent() const {
+ // Flings can be GestureEvents too. EF_FROM_TOUCH determins if they're
+ // Gesture or Scroll events.
+ return type_ == ET_SCROLL ||
+ ((type_ == ET_SCROLL_FLING_START ||
+ type_ == ET_SCROLL_FLING_CANCEL) &&
+ !(flags() & EF_FROM_TOUCH));
+ }
+
+ bool IsScrollGestureEvent() const {
+ return type_ == ET_GESTURE_SCROLL_BEGIN ||
+ type_ == ET_GESTURE_SCROLL_UPDATE ||
+ type_ == ET_GESTURE_SCROLL_END;
+ }
+
+ bool IsFlingScrollEvent() const {
+ return type_ == ET_SCROLL_FLING_CANCEL ||
+ type_ == ET_SCROLL_FLING_START;
+ }
+
+ bool IsMouseWheelEvent() const {
+ return type_ == ET_MOUSEWHEEL;
+ }
+
+ // Returns true if the event has a valid |native_event_|.
+ bool HasNativeEvent() const;
+
+ // Immediately stops the propagation of the event. This must be called only
+ // from an EventHandler during an event-dispatch. Any event handler that may
+ // be in the list will not receive the event after this is called.
+ // Note that StopPropagation() can be called only for cancelable events.
+ void StopPropagation();
+ bool stopped_propagation() const { return !!(result_ & ER_CONSUMED); }
+
+ // Marks the event as having been handled. A handled event does not reach the
+ // next event phase. For example, if an event is handled during the pre-target
+ // phase, then the event is dispatched to all pre-target handlers, but not to
+ // the target or post-target handlers.
+ // Note that SetHandled() can be called only for cancelable events.
+ void SetHandled();
+ bool handled() const { return result_ != ER_UNHANDLED; }
+
+ protected:
+ Event(EventType type, base::TimeDelta time_stamp, int flags);
+ Event(const base::NativeEvent& native_event, EventType type, int flags);
+ Event(const Event& copy);
+ void SetType(EventType type);
+ void set_delete_native_event(bool delete_native_event) {
+ delete_native_event_ = delete_native_event;
+ }
+ void set_cancelable(bool cancelable) { cancelable_ = cancelable; }
+ void set_dispatch_to_hidden_targets(bool dispatch_to_hidden_targets) {
+ dispatch_to_hidden_targets_ = dispatch_to_hidden_targets;
+ }
+
+ void set_time_stamp(const base::TimeDelta& time_stamp) {
+ time_stamp_ = time_stamp;
+ }
+
+ void set_name(const std::string& name) { name_ = name; }
+
+ void InitLatencyInfo();
+
+ private:
+ void operator=(const Event&);
+
+ // Safely initializes the native event members of this class.
+ void Init();
+ void InitWithNativeEvent(const base::NativeEvent& native_event);
+
+ EventType type_;
+ std::string name_;
+ base::TimeDelta time_stamp_;
+ LatencyInfo latency_;
+ int flags_;
+ bool dispatch_to_hidden_targets_;
+ base::NativeEvent native_event_;
+ bool delete_native_event_;
+ bool cancelable_;
+ EventTarget* target_;
+ EventPhase phase_;
+ EventResult result_;
+};
+
+class UI_EXPORT CancelModeEvent : public Event {
+ public:
+ CancelModeEvent();
+ virtual ~CancelModeEvent();
+};
+
+class UI_EXPORT LocatedEvent : public Event {
+ public:
+ // For testing.
+ class TestApi : public Event::TestApi {
+ public:
+ explicit TestApi(LocatedEvent* located_event)
+ : Event::TestApi(located_event),
+ located_event_(located_event) {}
+
+ void set_location(const gfx::Point& location) {
+ located_event_->location_ = location;
+ }
+
+ private:
+ TestApi();
+ LocatedEvent* located_event_;
+ };
+
+ virtual ~LocatedEvent();
+
+ int x() const { return location_.x(); }
+ int y() const { return location_.y(); }
+ void set_location(const gfx::Point& location) { location_ = location; }
+ gfx::Point location() const { return location_; }
+ void set_root_location(const gfx::Point& root_location) {
+ root_location_ = root_location;
+ }
+ gfx::Point root_location() const { return root_location_; }
+
+ // Transform the locations using |inverted_root_transform|.
+ // This is applied to both |location_| and |root_location_|.
+ virtual void UpdateForRootTransform(
+ const gfx::Transform& inverted_root_transform);
+
+ template <class T> void ConvertLocationToTarget(T* source, T* target) {
+ if (target && target != source)
+ T::ConvertPointToTarget(source, target, &location_);
+ }
+
+ protected:
+ explicit LocatedEvent(const base::NativeEvent& native_event);
+
+ // Create a new LocatedEvent which is identical to the provided model.
+ // If source / target windows are provided, the model location will be
+ // converted from |source| coordinate system to |target| coordinate system.
+ template <class T>
+ LocatedEvent(const LocatedEvent& model, T* source, T* target)
+ : Event(model),
+ location_(model.location_),
+ root_location_(model.root_location_) {
+ ConvertLocationToTarget(source, target);
+ }
+
+ // Used for synthetic events in testing.
+ LocatedEvent(EventType type,
+ const gfx::Point& location,
+ const gfx::Point& root_location,
+ base::TimeDelta time_stamp,
+ int flags);
+
+ gfx::Point location_;
+
+ // |location_| multiplied by an optional transformation matrix for
+ // rotations, animations and skews.
+ gfx::Point root_location_;
+};
+
+class UI_EXPORT MouseEvent : public LocatedEvent {
+ public:
+ explicit MouseEvent(const base::NativeEvent& native_event);
+
+ // Create a new MouseEvent based on the provided model.
+ // Uses the provided |type| and |flags| for the new event.
+ // If source / target windows are provided, the model location will be
+ // converted from |source| coordinate system to |target| coordinate system.
+ template <class T>
+ MouseEvent(const MouseEvent& model, T* source, T* target)
+ : LocatedEvent(model, source, target),
+ changed_button_flags_(model.changed_button_flags_) {
+ }
+
+ template <class T>
+ MouseEvent(const MouseEvent& model,
+ T* source,
+ T* target,
+ EventType type,
+ int flags)
+ : LocatedEvent(model, source, target),
+ changed_button_flags_(model.changed_button_flags_) {
+ SetType(type);
+ set_flags(flags);
+ }
+
+ // Used for synthetic events in testing and by the gesture recognizer.
+ MouseEvent(EventType type,
+ const gfx::Point& location,
+ const gfx::Point& root_location,
+ int flags);
+
+ // Conveniences to quickly test what button is down
+ bool IsOnlyLeftMouseButton() const {
+ return (flags() & EF_LEFT_MOUSE_BUTTON) &&
+ !(flags() & (EF_MIDDLE_MOUSE_BUTTON | EF_RIGHT_MOUSE_BUTTON));
+ }
+
+ bool IsLeftMouseButton() const {
+ return (flags() & EF_LEFT_MOUSE_BUTTON) != 0;
+ }
+
+ bool IsOnlyMiddleMouseButton() const {
+ return (flags() & EF_MIDDLE_MOUSE_BUTTON) &&
+ !(flags() & (EF_LEFT_MOUSE_BUTTON | EF_RIGHT_MOUSE_BUTTON));
+ }
+
+ bool IsMiddleMouseButton() const {
+ return (flags() & EF_MIDDLE_MOUSE_BUTTON) != 0;
+ }
+
+ bool IsOnlyRightMouseButton() const {
+ return (flags() & EF_RIGHT_MOUSE_BUTTON) &&
+ !(flags() & (EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON));
+ }
+
+ bool IsRightMouseButton() const {
+ return (flags() & EF_RIGHT_MOUSE_BUTTON) != 0;
+ }
+
+ bool IsAnyButton() const {
+ return (flags() & (EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON |
+ EF_RIGHT_MOUSE_BUTTON)) != 0;
+ }
+
+ // Compares two mouse down events and returns true if the second one should
+ // be considered a repeat of the first.
+ static bool IsRepeatedClickEvent(
+ const MouseEvent& event1,
+ const MouseEvent& event2);
+
+ // Get the click count. Can be 1, 2 or 3 for mousedown messages, 0 otherwise.
+ int GetClickCount() const;
+
+ // Set the click count for a mousedown message. Can be 1, 2 or 3.
+ void SetClickCount(int click_count);
+
+ // Identifies the button that changed. During a press this corresponds to the
+ // button that was pressed and during a release this corresponds to the button
+ // that was released.
+ // NOTE: during a press and release flags() contains the complete set of
+ // flags. Use this to determine the button that was pressed or released.
+ int changed_button_flags() const { return changed_button_flags_; }
+
+ private:
+ // Returns the repeat count based on the previous mouse click, if it is
+ // recent enough and within a small enough distance.
+ static int GetRepeatCount(const MouseEvent& click_event);
+
+ // See description above getter for details.
+ int changed_button_flags_;
+
+ static MouseEvent* last_click_event_;
+};
+
+class ScrollEvent;
+
+class UI_EXPORT MouseWheelEvent : public MouseEvent {
+ public:
+ // See |offset| for details.
+ static const int kWheelDelta;
+
+ explicit MouseWheelEvent(const base::NativeEvent& native_event);
+ explicit MouseWheelEvent(const ScrollEvent& scroll_event);
+ MouseWheelEvent(const MouseEvent& mouse_event, int x_offset, int y_offset);
+ MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event);
+
+ template <class T>
+ MouseWheelEvent(const MouseWheelEvent& model,
+ T* source,
+ T* target,
+ EventType type,
+ int flags)
+ : MouseEvent(model, source, target, type, flags),
+ offset_(model.x_offset(), model.y_offset()){
+ }
+
+ // The amount to scroll. This is in multiples of kWheelDelta.
+ // Note: x_offset() > 0/y_offset() > 0 means scroll left/up.
+ int x_offset() const { return offset_.x(); }
+ int y_offset() const { return offset_.y(); }
+ const gfx::Vector2d& offset() const { return offset_; }
+
+ // Overridden from LocatedEvent.
+ virtual void UpdateForRootTransform(
+ const gfx::Transform& inverted_root_transform) OVERRIDE;
+
+ private:
+ gfx::Vector2d offset_;
+};
+
+class UI_EXPORT TouchEvent : public LocatedEvent {
+ public:
+ explicit TouchEvent(const base::NativeEvent& native_event);
+
+ // Create a new TouchEvent which is identical to the provided model.
+ // If source / target windows are provided, the model location will be
+ // converted from |source| coordinate system to |target| coordinate system.
+ template <class T>
+ TouchEvent(const TouchEvent& model, T* source, T* target)
+ : LocatedEvent(model, source, target),
+ touch_id_(model.touch_id_),
+ radius_x_(model.radius_x_),
+ radius_y_(model.radius_y_),
+ rotation_angle_(model.rotation_angle_),
+ force_(model.force_) {
+ }
+
+ TouchEvent(EventType type,
+ const gfx::Point& root_location,
+ int touch_id,
+ base::TimeDelta time_stamp);
+
+ TouchEvent(EventType type,
+ const gfx::Point& location,
+ int flags,
+ int touch_id,
+ base::TimeDelta timestamp,
+ float radius_x,
+ float radius_y,
+ float angle,
+ float force);
+
+ virtual ~TouchEvent();
+
+ int touch_id() const { return touch_id_; }
+ float radius_x() const { return radius_x_; }
+ float radius_y() const { return radius_y_; }
+ float rotation_angle() const { return rotation_angle_; }
+ float force() const { return force_; }
+
+ // Relocate the touch-point to a new |origin|.
+ // This is useful when touch event is in X Root Window coordinates,
+ // and it needs to be mapped into Aura Root Window coordinates.
+ void Relocate(const gfx::Point& origin);
+
+ // Used for unit tests.
+ void set_radius_x(const float r) { radius_x_ = r; }
+ void set_radius_y(const float r) { radius_y_ = r; }
+
+ // Overridden from LocatedEvent.
+ virtual void UpdateForRootTransform(
+ const gfx::Transform& inverted_root_transform) OVERRIDE;
+
+ protected:
+ void set_radius(float radius_x, float radius_y) {
+ radius_x_ = radius_x;
+ radius_y_ = radius_y;
+ }
+
+ void set_rotation_angle(float rotation_angle) {
+ rotation_angle_ = rotation_angle;
+ }
+
+ void set_force(float force) { force_ = force; }
+
+ private:
+ // The identity (typically finger) of the touch starting at 0 and incrementing
+ // for each separable additional touch that the hardware can detect.
+ const int touch_id_;
+
+ // Radius of the X (major) axis of the touch ellipse. 0.0 if unknown.
+ float radius_x_;
+
+ // Radius of the Y (minor) axis of the touch ellipse. 0.0 if unknown.
+ float radius_y_;
+
+ // Angle of the major axis away from the X axis. Default 0.0.
+ float rotation_angle_;
+
+ // Force (pressure) of the touch. Normalized to be [0, 1]. Default to be 0.0.
+ float force_;
+};
+
+class UI_EXPORT KeyEvent : public Event {
+ public:
+ KeyEvent(const base::NativeEvent& native_event, bool is_char);
+
+ // Used for synthetic events.
+ KeyEvent(EventType type, KeyboardCode key_code, int flags, bool is_char);
+
+ // These setters allow an I18N virtual keyboard to fabricate a keyboard event
+ // which does not have a corresponding KeyboardCode (example: U+00E1 Latin
+ // small letter A with acute, U+0410 Cyrillic capital letter A.)
+ // GetCharacter() and GetUnmodifiedCharacter() return the character.
+ void set_character(uint16 character) { character_ = character; }
+ void set_unmodified_character(uint16 unmodified_character) {
+ unmodified_character_ = unmodified_character;
+ }
+
+ // Gets the character generated by this key event. It only supports Unicode
+ // BMP characters.
+ uint16 GetCharacter() const;
+
+ // Gets the character generated by this key event ignoring concurrently-held
+ // modifiers (except shift).
+ uint16 GetUnmodifiedCharacter() const;
+
+ // Returns the copy of this key event. Used in NativeWebKeyboardEvent.
+ KeyEvent* Copy() const;
+
+ KeyboardCode key_code() const { return key_code_; }
+ bool is_char() const { return is_char_; }
+
+ // This is only intended to be used externally by classes that are modifying
+ // events in EventFilter::PreHandleKeyEvent(). set_character() should also be
+ // called.
+ void set_key_code(KeyboardCode key_code) { key_code_ = key_code; }
+
+ // Returns true for [Alt]+<num-pad digit> Unicode alt key codes used by Win.
+ // TODO(msw): Additional work may be needed for analogues on other platforms.
+ bool IsUnicodeKeyCode() const;
+
+ // Normalizes flags_ to make it Windows/Mac compatible. Since the way
+ // of setting modifier mask on X is very different than Windows/Mac as shown
+ // in http://crbug.com/127142#c8, the normalization is necessary.
+ void NormalizeFlags();
+
+ private:
+ KeyboardCode key_code_;
+ // True if this is a translated character event (vs. a raw key down). Both
+ // share the same type: ET_KEY_PRESSED.
+ bool is_char_;
+
+ uint16 character_;
+ uint16 unmodified_character_;
+};
+
+// A key event which is translated by an input method (IME).
+// For example, if an IME receives a KeyEvent(VKEY_SPACE), and it does not
+// consume the key, the IME usually generates and dispatches a
+// TranslatedKeyEvent(VKEY_SPACE) event. If the IME receives a KeyEvent and
+// it does consume the event, it might dispatch a
+// TranslatedKeyEvent(VKEY_PROCESSKEY) event as defined in the DOM spec.
+class UI_EXPORT TranslatedKeyEvent : public KeyEvent {
+ public:
+ TranslatedKeyEvent(const base::NativeEvent& native_event, bool is_char);
+
+ // Used for synthetic events such as a VKEY_PROCESSKEY key event.
+ TranslatedKeyEvent(bool is_press, KeyboardCode key_code, int flags);
+
+ // Changes the type() of the object from ET_TRANSLATED_KEY_* to ET_KEY_* so
+ // that RenderWidgetHostViewAura and NativeWidgetAura could handle the event.
+ void ConvertToKeyEvent();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(TranslatedKeyEvent);
+};
+
+class UI_EXPORT DropTargetEvent : public LocatedEvent {
+ public:
+ DropTargetEvent(const OSExchangeData& data,
+ const gfx::Point& location,
+ const gfx::Point& root_location,
+ int source_operations);
+
+ const OSExchangeData& data() const { return data_; }
+ int source_operations() const { return source_operations_; }
+
+ private:
+ // Data associated with the drag/drop session.
+ const OSExchangeData& data_;
+
+ // Bitmask of supported DragDropTypes::DragOperation by the source.
+ int source_operations_;
+
+ DISALLOW_COPY_AND_ASSIGN(DropTargetEvent);
+};
+
+class UI_EXPORT ScrollEvent : public MouseEvent {
+ public:
+ explicit ScrollEvent(const base::NativeEvent& native_event);
+ template <class T>
+ ScrollEvent(const ScrollEvent& model,
+ T* source,
+ T* target)
+ : MouseEvent(model, source, target),
+ x_offset_(model.x_offset_),
+ y_offset_(model.y_offset_),
+ x_offset_ordinal_(model.x_offset_ordinal_),
+ y_offset_ordinal_(model.y_offset_ordinal_),
+ finger_count_(model.finger_count_){
+ }
+
+ // Used for tests.
+ ScrollEvent(EventType type,
+ const gfx::Point& location,
+ base::TimeDelta time_stamp,
+ int flags,
+ float x_offset,
+ float y_offset,
+ float x_offset_ordinal,
+ float y_offset_ordinal,
+ int finger_count);
+
+ // Scale the scroll event's offset value.
+ // This is useful in the multi-monitor setup where it needs to be scaled
+ // to provide a consistent user experience.
+ void Scale(const float factor);
+
+ float x_offset() const { return x_offset_; }
+ float y_offset() const { return y_offset_; }
+ float x_offset_ordinal() const { return x_offset_ordinal_; }
+ float y_offset_ordinal() const { return y_offset_ordinal_; }
+ int finger_count() const { return finger_count_; }
+
+ // Overridden from LocatedEvent.
+ virtual void UpdateForRootTransform(
+ const gfx::Transform& inverted_root_transform) OVERRIDE;
+
+ private:
+ // Potential accelerated offsets.
+ float x_offset_;
+ float y_offset_;
+ // Unaccelerated offsets.
+ float x_offset_ordinal_;
+ float y_offset_ordinal_;
+ // Number of fingers on the pad.
+ int finger_count_;
+};
+
+class UI_EXPORT GestureEvent : public LocatedEvent {
+ public:
+ GestureEvent(EventType type,
+ int x,
+ int y,
+ int flags,
+ base::TimeDelta time_stamp,
+ const GestureEventDetails& details,
+ unsigned int touch_ids_bitfield);
+
+ // Create a new GestureEvent which is identical to the provided model.
+ // If source / target windows are provided, the model location will be
+ // converted from |source| coordinate system to |target| coordinate system.
+ template <typename T>
+ GestureEvent(const GestureEvent& model, T* source, T* target)
+ : LocatedEvent(model, source, target),
+ details_(model.details_),
+ touch_ids_bitfield_(model.touch_ids_bitfield_) {
+ }
+
+ virtual ~GestureEvent();
+
+ const GestureEventDetails& details() const { return details_; }
+
+ // Returns the lowest touch-id of any of the touches which make up this
+ // gesture. If there are no touches associated with this gesture, returns -1.
+ int GetLowestTouchId() const;
+
+ private:
+ GestureEventDetails details_;
+
+ // The set of indices of ones in the binary representation of
+ // touch_ids_bitfield_ is the set of touch_ids associate with this gesture.
+ // This value is stored as a bitfield because the number of touch ids varies,
+ // but we currently don't need more than 32 touches at a time.
+ const unsigned int touch_ids_bitfield_;
+
+ DISALLOW_COPY_AND_ASSIGN(GestureEvent);
+};
+
+} // namespace ui
+
+#endif // UI_BASE_EVENTS_EVENT_H_
« no previous file with comments | « no previous file | ui/base/events/event.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698