15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#ifndef UI_EVENTS_EVENT_H_
6d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#define UI_EVENTS_EVENT_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/event_types.h"
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "base/gtest_prod_util.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
1303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
15d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/events/gesture_event_details.h"
1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/gestures/gesture_types.h"
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/latency_info.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h"
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/point_conversions.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Transform;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EventTarget;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT Event {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static scoped_ptr<Event> Clone(const Event& event);
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~Event();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class DispatcherApi {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   public:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    explicit DispatcherApi(Event* event) : event_(event) {}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_target(EventTarget* target) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event_->target_ = target;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_phase(EventPhase phase) { event_->phase_ = phase; }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void set_result(int result) {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event_->result_ = static_cast<EventResult>(result);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   private:
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DispatcherApi();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Event* event_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DISALLOW_COPY_AND_ASSIGN(DispatcherApi);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::NativeEvent& native_event() const { return native_event_; }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventType type() const { return type_; }
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const std::string& name() const { return name_; }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // time_stamp represents time since machine was booted.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const base::TimeDelta& time_stamp() const { return time_stamp_; }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags() const { return flags_; }
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only intended to be used externally by classes that are modifying
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // events in an EventRewriter.
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_flags(int flags) { flags_ = flags; }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventTarget* target() const { return target_; }
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventPhase phase() const { return phase_; }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventResult result() const { return result_; }
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  LatencyInfo* latency() { return &latency_; }
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const LatencyInfo* latency() const { return &latency_; }
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void set_latency(const LatencyInfo& latency) { latency_ = latency; }
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int source_device_id() const { return source_device_id_; }
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // By default, events are "cancelable", this means any default processing that
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the containing abstraction layer may perform can be prevented by calling
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // SetHandled(). SetHandled() or StopPropagation() must not be called for
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events that are not cancelable.
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cancelable() const { return cancelable_; }
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The following methods return true if the respective keys were pressed at
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the time the event was created.
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsShiftDown() const { return (flags_ & EF_SHIFT_DOWN) != 0; }
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsControlDown() const { return (flags_ & EF_CONTROL_DOWN) != 0; }
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsCapsLockDown() const { return (flags_ & EF_CAPS_LOCK_DOWN) != 0; }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsAltDown() const { return (flags_ & EF_ALT_DOWN) != 0; }
89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  bool IsAltGrDown() const { return (flags_ & EF_ALTGR_DOWN) != 0; }
9003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  bool IsCommandDown() const { return (flags_ & EF_COMMAND_DOWN) != 0; }
9146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  bool IsRepeat() const { return (flags_ & EF_IS_REPEAT) != 0; }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsKeyEvent() const {
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return type_ == ET_KEY_PRESSED ||
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_KEY_RELEASED ||
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_TRANSLATED_KEY_PRESS ||
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_TRANSLATED_KEY_RELEASE;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsMouseEvent() const {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return type_ == ET_MOUSE_PRESSED ||
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_MOUSE_DRAGGED ||
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_MOUSE_RELEASED ||
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_MOUSE_MOVED ||
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_MOUSE_ENTERED ||
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_MOUSE_EXITED ||
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           type_ == ET_MOUSEWHEEL ||
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           type_ == ET_MOUSE_CAPTURE_CHANGED;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsTouchEvent() const {
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return type_ == ET_TOUCH_RELEASED ||
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_TOUCH_PRESSED ||
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_TOUCH_MOVED ||
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_TOUCH_CANCELLED;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsGestureEvent() const {
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (type_) {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_SCROLL_BEGIN:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_SCROLL_END:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_SCROLL_UPDATE:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_TAP:
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      case ET_GESTURE_TAP_CANCEL:
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_TAP_DOWN:
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_BEGIN:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_END:
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_TWO_FINGER_TAP:
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_PINCH_BEGIN:
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_PINCH_END:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_PINCH_UPDATE:
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_LONG_PRESS:
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_GESTURE_LONG_TAP:
134cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      case ET_GESTURE_SWIPE:
1351e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      case ET_GESTURE_SHOW_PRESS:
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      case ET_GESTURE_WIN8_EDGE_SWIPE:
137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // When adding a gesture event which is paired with an event which
138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        // occurs earlier, add the event to |IsEndingEvent|.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return true;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_SCROLL_FLING_CANCEL:
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case ET_SCROLL_FLING_START:
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // These can be ScrollEvents too. EF_FROM_TOUCH determines if they're
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        // Gesture or Scroll events.
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        return (flags_ & EF_FROM_TOUCH) == EF_FROM_TOUCH;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      default:
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // An ending event is paired with the event which started it. Setting capture
154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // should not prevent ending events from getting to their initial target.
155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  bool IsEndingEvent() const {
156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    switch(type_) {
157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      case ui::ET_TOUCH_CANCELLED:
158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      case ui::ET_GESTURE_TAP_CANCEL:
159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      case ui::ET_GESTURE_END:
160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      case ui::ET_GESTURE_SCROLL_END:
161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      case ui::ET_GESTURE_PINCH_END:
162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return true;
163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      default:
164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        return false;
165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    }
166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  }
167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScrollEvent() const {
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Flings can be GestureEvents too. EF_FROM_TOUCH determins if they're
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Gesture or Scroll events.
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return type_ == ET_SCROLL ||
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           ((type_ == ET_SCROLL_FLING_START ||
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           type_ == ET_SCROLL_FLING_CANCEL) &&
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           !(flags() & EF_FROM_TOUCH));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsScrollGestureEvent() const {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return type_ == ET_GESTURE_SCROLL_BEGIN ||
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_GESTURE_SCROLL_UPDATE ||
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_GESTURE_SCROLL_END;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsFlingScrollEvent() const {
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return type_ == ET_SCROLL_FLING_CANCEL ||
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           type_ == ET_SCROLL_FLING_START;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool IsMouseWheelEvent() const {
189eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return type_ == ET_MOUSEWHEEL;
190eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool IsLocatedEvent() const {
1931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return IsMouseEvent() || IsScrollEvent() || IsTouchEvent() ||
1941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci           IsGestureEvent();
1951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Convenience methods to cast |this| to a GestureEvent. IsGestureEvent()
198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // must be true as a precondition to calling these methods.
199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GestureEvent* AsGestureEvent();
200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  const GestureEvent* AsGestureEvent() const;
201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if the event has a valid |native_event_|.
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasNativeEvent() const;
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Immediately stops the propagation of the event. This must be called only
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // from an EventHandler during an event-dispatch. Any event handler that may
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // be in the list will not receive the event after this is called.
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note that StopPropagation() can be called only for cancelable events.
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void StopPropagation();
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool stopped_propagation() const { return !!(result_ & ER_CONSUMED); }
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Marks the event as having been handled. A handled event does not reach the
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // next event phase. For example, if an event is handled during the pre-target
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // phase, then the event is dispatched to all pre-target handlers, but not to
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the target or post-target handlers.
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Note that SetHandled() can be called only for cancelable events.
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetHandled();
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool handled() const { return result_ != ER_UNHANDLED; }
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Event(EventType type, base::TimeDelta time_stamp, int flags);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Event(const base::NativeEvent& native_event, EventType type, int flags);
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Event(const Event& copy);
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SetType(EventType type);
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_delete_native_event(bool delete_native_event) {
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete_native_event_ = delete_native_event;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_cancelable(bool cancelable) { cancelable_ = cancelable; }
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_time_stamp(const base::TimeDelta& time_stamp) {
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    time_stamp_ = time_stamp;
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void set_name(const std::string& name) { name_ = name; }
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
237f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  friend class EventTestApi;
238f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventType type_;
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string name_;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta time_stamp_;
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  LatencyInfo latency_;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int flags_;
244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::NativeEvent native_event_;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool delete_native_event_;
2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool cancelable_;
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventTarget* target_;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventPhase phase_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EventResult result_;
250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // The device id the event came from, or ED_UNKNOWN_DEVICE if the information
252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // is not available.
253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  int source_device_id_;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT CancelModeEvent : public Event {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CancelModeEvent();
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~CancelModeEvent();
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)};
2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT LocatedEvent : public Event {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~LocatedEvent();
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  float x() const { return location_.x(); }
2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  float y() const { return location_.y(); }
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_location(const gfx::PointF& location) { location_ = location; }
2695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // TODO(tdresser): Always return floating point location. See
2705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // crbug.com/337824.
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Point location() const { return gfx::ToFlooredPoint(location_); }
272f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const gfx::PointF& location_f() const { return location_; }
2735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_root_location(const gfx::PointF& root_location) {
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    root_location_ = root_location;
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::Point root_location() const {
2775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return gfx::ToFlooredPoint(root_location_);
2785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
279f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const gfx::PointF& root_location_f() const {
280f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return root_location_;
281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Transform the locations using |inverted_root_transform|.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is applied to both |location_| and |root_location_|.
2852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdateForRootTransform(
2862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Transform& inverted_root_transform);
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class T> void ConvertLocationToTarget(T* source, T* target) {
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    if (!target || target == source)
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      return;
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // TODO(tdresser): Rewrite ConvertPointToTarget to use PointF. See
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    // crbug.com/337824.
2935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::Point offset = gfx::ToFlooredPoint(location_);
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    T::ConvertPointToTarget(source, target, &offset);
2955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    gfx::Vector2d diff = gfx::ToFlooredPoint(location_) - offset;
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    location_= location_ - diff;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
300f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  friend class LocatedEventTestApi;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit LocatedEvent(const base::NativeEvent& native_event);
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new LocatedEvent which is identical to the provided model.
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If source / target windows are provided, the model location will be
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // converted from |source| coordinate system to |target| coordinate system.
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class T>
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocatedEvent(const LocatedEvent& model, T* source, T* target)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : Event(model),
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        location_(model.location_),
310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        root_location_(model.root_location_) {
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ConvertLocationToTarget(source, target);
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for synthetic events in testing.
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  LocatedEvent(EventType type,
3165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               const gfx::PointF& location,
3175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               const gfx::PointF& root_location,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               base::TimeDelta time_stamp,
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int flags);
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::PointF location_;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |location_| multiplied by an optional transformation matrix for
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // rotations, animations and skews.
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  gfx::PointF root_location_;
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT MouseEvent : public LocatedEvent {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MouseEvent(const base::NativeEvent& native_event);
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new MouseEvent based on the provided model.
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uses the provided |type| and |flags| for the new event.
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If source / target windows are provided, the model location will be
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // converted from |source| coordinate system to |target| coordinate system.
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class T>
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MouseEvent(const MouseEvent& model, T* source, T* target)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : LocatedEvent(model, source, target),
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        changed_button_flags_(model.changed_button_flags_) {
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class T>
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MouseEvent(const MouseEvent& model,
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             T* source,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             T* target,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             EventType type,
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int flags)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : LocatedEvent(model, source, target),
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        changed_button_flags_(model.changed_button_flags_) {
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetType(type);
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_flags(flags);
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for synthetic events in testing and by the gesture recognizer.
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MouseEvent(EventType type,
3565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             const gfx::PointF& location,
3575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             const gfx::PointF& root_location,
3585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             int flags,
3595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             int changed_button_flags);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Conveniences to quickly test what button is down
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsOnlyLeftMouseButton() const {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (flags() & EF_LEFT_MOUSE_BUTTON) &&
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !(flags() & (EF_MIDDLE_MOUSE_BUTTON | EF_RIGHT_MOUSE_BUTTON));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsLeftMouseButton() const {
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (flags() & EF_LEFT_MOUSE_BUTTON) != 0;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsOnlyMiddleMouseButton() const {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (flags() & EF_MIDDLE_MOUSE_BUTTON) &&
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !(flags() & (EF_LEFT_MOUSE_BUTTON | EF_RIGHT_MOUSE_BUTTON));
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsMiddleMouseButton() const {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (flags() & EF_MIDDLE_MOUSE_BUTTON) != 0;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsOnlyRightMouseButton() const {
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (flags() & EF_RIGHT_MOUSE_BUTTON) &&
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !(flags() & (EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON));
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool IsRightMouseButton() const {
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return (flags() & EF_RIGHT_MOUSE_BUTTON) != 0;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsAnyButton() const {
3902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return (flags() & (EF_LEFT_MOUSE_BUTTON | EF_MIDDLE_MOUSE_BUTTON |
3912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                       EF_RIGHT_MOUSE_BUTTON)) != 0;
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compares two mouse down events and returns true if the second one should
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // be considered a repeat of the first.
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsRepeatedClickEvent(
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const MouseEvent& event1,
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const MouseEvent& event2);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Get the click count. Can be 1, 2 or 3 for mousedown messages, 0 otherwise.
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetClickCount() const;
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set the click count for a mousedown message. Can be 1, 2 or 3.
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetClickCount(int click_count);
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Identifies the button that changed. During a press this corresponds to the
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // button that was pressed and during a release this corresponds to the button
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // that was released.
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NOTE: during a press and release flags() contains the complete set of
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // flags. Use this to determine the button that was pressed or released.
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int changed_button_flags() const { return changed_button_flags_; }
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Updates the button that changed.
414116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  void set_changed_button_flags(int flags) { changed_button_flags_ = flags; }
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(EventTest, DoubleClickRequiresRelease);
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(EventTest, SingleClickRightLeft);
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the repeat count based on the previous mouse click, if it is
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // recent enough and within a small enough distance.
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static int GetRepeatCount(const MouseEvent& click_event);
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Resets the last_click_event_ for unit tests.
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static void ResetLastClickForTest();
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See description above getter for details.
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int changed_button_flags_;
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static MouseEvent* last_click_event_;
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // We can create a MouseEvent for a native event more than once. We set this
4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // to true when the next event either has a different timestamp or we see a
4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // release signalling that the press (click) event was completed.
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static bool last_click_complete_;
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScrollEvent;
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
44068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT MouseWheelEvent : public MouseEvent {
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // See |offset| for details.
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kWheelDelta;
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MouseWheelEvent(const base::NativeEvent& native_event);
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit MouseWheelEvent(const ScrollEvent& scroll_event);
447c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  MouseWheelEvent(const MouseEvent& mouse_event, int x_offset, int y_offset);
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event);
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class T>
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MouseWheelEvent(const MouseWheelEvent& model,
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  T* source,
453c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                  T* target)
454c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch      : MouseEvent(model, source, target, model.type(), model.flags()),
455c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        offset_(model.x_offset(), model.y_offset()) {
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
458116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  // Used for synthetic events in testing and by the gesture recognizer.
459116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  MouseWheelEvent(const gfx::Vector2d& offset,
460116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  const gfx::PointF& location,
461116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  const gfx::PointF& root_location,
462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  int flags,
463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                  int changed_button_flags);
464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The amount to scroll. This is in multiples of kWheelDelta.
466c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Note: x_offset() > 0/y_offset() > 0 means scroll left/up.
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int x_offset() const { return offset_.x(); }
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  int y_offset() const { return offset_.y(); }
469868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  const gfx::Vector2d& offset() const { return offset_; }
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
471eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Overridden from LocatedEvent.
472eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void UpdateForRootTransform(
473eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      const gfx::Transform& inverted_root_transform) OVERRIDE;
474eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Vector2d offset_;
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
47968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT TouchEvent : public LocatedEvent {
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit TouchEvent(const base::NativeEvent& native_event);
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new TouchEvent which is identical to the provided model.
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If source / target windows are provided, the model location will be
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // converted from |source| coordinate system to |target| coordinate system.
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class T>
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TouchEvent(const TouchEvent& model, T* source, T* target)
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : LocatedEvent(model, source, target),
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        touch_id_(model.touch_id_),
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        radius_x_(model.radius_x_),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        radius_y_(model.radius_y_),
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        rotation_angle_(model.rotation_angle_),
493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        force_(model.force_) {
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TouchEvent(EventType type,
4975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             const gfx::PointF& location,
4985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int touch_id,
4995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             base::TimeDelta time_stamp);
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TouchEvent(EventType type,
5025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)             const gfx::PointF& location,
5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int flags,
5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int touch_id,
5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             base::TimeDelta timestamp,
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             float radius_x,
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             float radius_y,
5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             float angle,
5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             float force);
5105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~TouchEvent();
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int touch_id() const { return touch_id_; }
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float radius_x() const { return radius_x_; }
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float radius_y() const { return radius_y_; }
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float rotation_angle() const { return rotation_angle_; }
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float force() const { return force_; }
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Used for unit tests.
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_radius_x(const float r) { radius_x_ = r; }
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_radius_y(const float r) { radius_y_ = r; }
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from LocatedEvent.
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void UpdateForRootTransform(
525c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const gfx::Transform& inverted_root_transform) OVERRIDE;
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_radius(float radius_x, float radius_y) {
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    radius_x_ = radius_x;
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    radius_y_ = radius_y;
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_rotation_angle(float rotation_angle) {
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rotation_angle_ = rotation_angle;
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_force(float force) { force_ = force; }
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The identity (typically finger) of the touch starting at 0 and incrementing
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for each separable additional touch that the hardware can detect.
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int touch_id_;
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Radius of the X (major) axis of the touch ellipse. 0.0 if unknown.
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float radius_x_;
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Radius of the Y (minor) axis of the touch ellipse. 0.0 if unknown.
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float radius_y_;
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Angle of the major axis away from the X axis. Default 0.0.
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float rotation_angle_;
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Force (pressure) of the touch. Normalized to be [0, 1]. Default to be 0.0.
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float force_;
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// An interface that individual platforms can use to store additional data on
55803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// KeyEvent.
55903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)//
56003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)// Currently only used in mojo.
56103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)class EVENTS_EXPORT ExtendedKeyEventData {
56203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) public:
56303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual ~ExtendedKeyEventData() {}
56403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
56503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual ExtendedKeyEventData* Clone() const = 0;
56603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)};
56703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
5685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// A KeyEvent is really two distinct classes, melded together due to the
5695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// DOM legacy of Windows key events: a keystroke event (is_char_ == false),
5705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// or a character event (is_char_ == true).
5715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
5725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// For a keystroke event,
5735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -- is_char_ is false.
5745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -- type() can be any one of ET_KEY_PRESSED, ET_KEY_RELEASED,
5755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//    ET_TRANSLATED_KEY_PRESS, or ET_TRANSLATED_KEY_RELEASE.
5765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -- character_ functions as a bypass or cache for GetCharacter().
5775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -- key_code_ is a VKEY_ value associated with the key. For printable
5785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//    characters, this may or may not be a mapped value, imitating MS Windows:
5795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//    if the mapped key generates a character that has an associated VKEY_
5805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//    code, then key_code_ is that code; if not, then key_code_ is the unmapped
5815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//    VKEY_ code. For example, US, Greek, Cyrillic, Japanese, etc. all use
5825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//    VKEY_Q for the key beside Tab, while French uses VKEY_A.
5835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -- code_ is in one-to-one correspondence with a physical keyboard
5845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//    location, and does not vary depending on key layout.
5855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
5865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// For a character event,
5875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -- is_char_ is true.
5885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -- type() is ET_KEY_PRESSED.
5895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -- character_ is a UTF-16 character value.
5905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// -- key_code_ is conflated with character_ by some code, because both
5915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//    arrive in the wParam field of a Windows event.
5921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// -- code_ is the empty string.
5935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
59468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT KeyEvent : public Event {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
5965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Create a KeyEvent from a NativeEvent. For Windows this native event can
5975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // be either a keystroke message (WM_KEYUP/WM_KEYDOWN) or a character message
5985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // (WM_CHAR). Other systems have only keystroke events.
5995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  explicit KeyEvent(const base::NativeEvent& native_event);
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Create a keystroke event.
6025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  KeyEvent(EventType type, KeyboardCode key_code, int flags);
6035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Create a character event.
6055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  KeyEvent(base::char16 character, KeyboardCode key_code, int flags);
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
607a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Used for synthetic events with code of DOM KeyboardEvent (e.g. 'KeyA')
608a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // See also: ui/events/keycodes/dom4/keycode_converter_data.h
6095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  KeyEvent(EventType type,
6105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)           KeyboardCode key_code,
6115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)           const std::string& code,
6125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)           int flags);
613a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
61403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  KeyEvent(const KeyEvent& rhs);
61503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
61603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  KeyEvent& operator=(const KeyEvent& rhs);
61703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
61803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  virtual ~KeyEvent();
61903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
62003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // TODO(erg): While we transition to mojo, we have to hack around a mismatch
62103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // in our event types. Our ui::Events don't really have all the data we need
62203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // to process key events, and we instead do per-platform conversions with
62303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // native HWNDs or XEvents. And we can't reliably send those native data
62403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // types across mojo types in a cross-platform way. So instead, we set the
62503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // resulting data when read across IPC boundaries.
62603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void SetExtendedKeyEventData(scoped_ptr<ExtendedKeyEventData> data);
62703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  const ExtendedKeyEventData* extended_key_event_data() const {
62803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)    return extended_key_event_data_.get();
62903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  }
63003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
6315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // This bypasses the normal mapping from keystroke events to characters,
6325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // which allows an I18N virtual keyboard to fabricate a keyboard event that
6334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // does not have a corresponding KeyboardCode (example: U+00E1 Latin small
6344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // letter A with acute, U+0410 Cyrillic capital letter A).
6355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  void set_character(base::char16 character) { character_ = character; }
6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Gets the character generated by this key event. It only supports Unicode
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // BMP characters.
6395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  base::char16 GetCharacter() const;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If this is a keystroke event with key_code_ VKEY_RETURN, returns '\r';
6421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // otherwise returns the same as GetCharacter().
6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::char16 GetUnmodifiedText() const;
6441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If the Control key is down in the event, returns a layout-independent
6461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // character (corresponding to US layout); otherwise returns the same
6471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // as GetUnmodifiedText().
6481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  base::char16 GetText() const;
6491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
650f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Gets the platform key code. For XKB, this is the xksym value.
65103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  void set_platform_keycode(uint32 keycode) { platform_keycode_ = keycode; }
652f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  uint32 platform_keycode() const { return platform_keycode_; }
6531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Gets the associated (Windows-based) KeyboardCode for this key event.
6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Historically, this has also been used to obtain the character associated
6561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // with a character event, because both use the Window message 'wParam' field.
6571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This should be avoided; if necessary for backwards compatibility, use
6581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // GetConflatedWindowsKeyCode().
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyboardCode key_code() const { return key_code_; }
6605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // True if this is a character event, false if this is a keystroke event.
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_char() const { return is_char_; }
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is only intended to be used externally by classes that are modifying
6655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // events in an EventRewriter.
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_key_code(KeyboardCode key_code) { key_code_ = key_code; }
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Returns the same value as key_code(), except that located codes are
6691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // returned in place of non-located ones (e.g. VKEY_LSHIFT or VKEY_RSHIFT
6701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // instead of VKEY_SHIFT). This is a hybrid of semantic and physical
6711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // for legacy DOM reasons.
6721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  KeyboardCode GetLocatedWindowsKeyboardCode() const;
6731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // For a keystroke event, returns the same value as key_code().
6751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // For a character event, returns the same value as GetCharacter().
6761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // This exists for backwards compatibility with Windows key events.
6771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  uint16 GetConflatedWindowsKeyCode() const;
6781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true for [Alt]+<num-pad digit> Unicode alt key codes used by Win.
6802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(msw): Additional work may be needed for analogues on other platforms.
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsUnicodeKeyCode() const;
6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
683a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string code() const { return code_; }
684a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
6855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Normalizes flags_ so that it describes the state after the event.
6865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // (Native X11 event flags describe the state before the event.)
6875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void NormalizeFlags();
6885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Returns true if the key event has already been processed by an input method
690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // and there is no need to pass the key event to the input method again.
691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  bool IsTranslated() const;
692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Marks this key event as translated or not translated.
693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  void SetTranslated(bool translated);
694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
6955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected:
6965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  friend class KeyEventTestApi;
6975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
6985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // This allows a subclass TranslatedKeyEvent to be a non character event.
6995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void set_is_char(bool is_char) { is_char_ = is_char; }
7005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // True if the key press originated from a 'right' key (VKEY_RSHIFT, etc.).
7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool IsRightSideKey() const;
7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyboardCode key_code_;
706a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
707a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // String of 'code' defined in DOM KeyboardEvent (e.g. 'KeyA', 'Space')
708a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // http://www.w3.org/TR/uievents/#keyboard-key-codes.
709a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  //
710a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // This value represents the physical position in the keyboard and can be
711a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // converted from / to keyboard scan code like XKB.
712a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  std::string code_;
713a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
7145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // True if this is a character event, false if this is a keystroke event.
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_char_;
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
717f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The platform related keycode value. For XKB, it's keysym value.
718f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // For now, this is used for CharacterComposer in ChromeOS.
719f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  uint32 platform_keycode_;
720f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
721f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // String of 'key' defined in DOM KeyboardEvent (e.g. 'a', 'â')
722f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // http://www.w3.org/TR/uievents/#keyboard-key-codes.
723f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  //
724f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // This value represents the text that the key event will insert to input
725f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // field. For key with modifier key, it may have specifial text.
726f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // e.g. CTRL+A has '\x01'.
7271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  mutable base::char16 character_;
72846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
72903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // Parts of our event handling require raw native events (see both the
73003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // windows and linux implementations of web_input_event in content/). Because
73103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // mojo instead serializes and deserializes events in potentially different
73203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  // processes, we need to have a mechanism to keep track of this data.
73303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)  scoped_ptr<ExtendedKeyEventData> extended_key_event_data_;
73403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)
73546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static bool IsRepeated(const KeyEvent& event);
73646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
73746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  static KeyEvent* last_key_event_;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
74068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT ScrollEvent : public MouseEvent {
7415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
7425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScrollEvent(const base::NativeEvent& native_event);
7435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <class T>
7445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScrollEvent(const ScrollEvent& model,
7455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              T* source,
7462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              T* target)
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      : MouseEvent(model, source, target),
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        x_offset_(model.x_offset_),
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        y_offset_(model.y_offset_),
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        x_offset_ordinal_(model.x_offset_ordinal_),
7512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        y_offset_ordinal_(model.y_offset_ordinal_),
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        finger_count_(model.finger_count_){
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Used for tests.
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ScrollEvent(EventType type,
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)              const gfx::PointF& location,
7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              base::TimeDelta time_stamp,
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              int flags,
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              float x_offset,
7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              float y_offset,
7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              float x_offset_ordinal,
7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              float y_offset_ordinal,
7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)              int finger_count);
7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Scale the scroll event's offset value.
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is useful in the multi-monitor setup where it needs to be scaled
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to provide a consistent user experience.
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Scale(const float factor);
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float x_offset() const { return x_offset_; }
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float y_offset() const { return y_offset_; }
7732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float x_offset_ordinal() const { return x_offset_ordinal_; }
7742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float y_offset_ordinal() const { return y_offset_ordinal_; }
7752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int finger_count() const { return finger_count_; }
7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
7782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Potential accelerated offsets.
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float x_offset_;
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float y_offset_;
7812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Unaccelerated offsets.
7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float x_offset_ordinal_;
7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  float y_offset_ordinal_;
7842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Number of fingers on the pad.
7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int finger_count_;
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
78868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class EVENTS_EXPORT GestureEvent : public LocatedEvent {
7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
790116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GestureEvent(float x,
7915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)               float y,
7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               int flags,
7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               base::TimeDelta time_stamp,
794116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch               const GestureEventDetails& details);
7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new GestureEvent which is identical to the provided model.
7975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If source / target windows are provided, the model location will be
7985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // converted from |source| coordinate system to |target| coordinate system.
7995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  template <typename T>
8005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GestureEvent(const GestureEvent& model, T* source, T* target)
8015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      : LocatedEvent(model, source, target),
802116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        details_(model.details_) {
8035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
8045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~GestureEvent();
8065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const GestureEventDetails& details() const { return details_; }
8085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
8105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GestureEventDetails details_;
8115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
8125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif  // UI_EVENTS_EVENT_H_
816