event.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
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)#include "ui/events/event.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath>
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point3_f.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point_conversions.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h"
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform_util.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion_x.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::NativeEvent CopyNativeEvent(const base::NativeEvent& event) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!event || event->type == GenericEvent)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XEvent* copy = new XEvent;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *copy = *event;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return copy;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event;
38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#elif defined(USE_OZONE)
39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return NULL;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() <<
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Don't know how to copy base::NativeEvent for this platform";
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point CalibratePoint(const gfx::Point& point,
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const gfx::Size& from,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          const gfx::Size& to) {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float calibrated_x =
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<float>(point.x()) * to.width() / from.width();
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  float calibrated_y =
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      static_cast<float>(point.y()) * to.height() / from.height();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Point(static_cast<int>(floorf(calibrated_x + 0.5f)),
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    static_cast<int>(floorf(calibrated_y + 0.5f)));
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string EventTypeName(ui::EventType type) {
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define RETURN_IF_TYPE(t) if (type == ui::t)  return #t
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CASE_TYPE(t) case ui::t:  return #t
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_UNKNOWN);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_PRESSED);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_DRAGGED);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_RELEASED);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_MOVED);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_ENTERED);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_EXITED);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_KEY_PRESSED);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_KEY_RELEASED);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSEWHEEL);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_CAPTURE_CHANGED);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_RELEASED);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_PRESSED);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_MOVED);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_STATIONARY);
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_CANCELLED);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_DROP_TARGET_EVENT);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TRANSLATED_KEY_PRESS);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TRANSLATED_KEY_RELEASE);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_SCROLL_BEGIN);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_SCROLL_END);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_SCROLL_UPDATE);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP_DOWN);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP_CANCEL);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_BEGIN);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_END);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TWO_FINGER_TAP);
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_PINCH_BEGIN);
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_PINCH_END);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_PINCH_UPDATE);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_LONG_PRESS);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_LONG_TAP);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_MULTIFINGER_SWIPE);
962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_SCROLL);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_SCROLL_FLING_START);
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_SCROLL_FLING_CANCEL);
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_CANCEL_MODE);
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CASE_TYPE(ET_UMA_DATA);
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ui::ET_LAST: NOTREACHED(); return std::string();
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Don't include default, so that we get an error when new type is added.
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#undef CASE_TYPE
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::string();
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsX11SendEventTrue(const base::NativeEvent& event) {
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_X11)
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event && event->xany.send_event)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::~Event() {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delete_native_event_)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete native_event_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Event::HasNativeEvent() const {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::NativeEvent null_event;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::memset(&null_event, 0, sizeof(null_event));
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!std::memcmp(&native_event_, &null_event, sizeof(null_event));
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::StopPropagation() {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events.
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH);
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(cancelable_);
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_ = static_cast<EventResult>(result_ | ER_CONSUMED);
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetHandled() {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events.
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH);
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(cancelable_);
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_ = static_cast<EventResult>(result_ | ER_HANDLED);
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(EventType type, base::TimeDelta time_stamp, int flags)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(time_stamp),
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(flags),
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dispatch_to_hidden_targets_(false),
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_X11)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      native_event_(NULL),
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_native_event_(false),
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init();
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const base::NativeEvent& native_event,
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             EventType type,
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int flags)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(EventTimeFromNative(native_event)),
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(flags),
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dispatch_to_hidden_targets_(false),
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_native_event_(false),
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta delta = EventTimeForNow() - time_stamp_;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser",
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                              delta.InMicroseconds(), 0, 1000000, 100);
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string name_for_event =
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringPrintf("Event.Latency.Browser.%s", name_.c_str());
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::HistogramBase* counter_for_type =
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Histogram::FactoryGet(
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          name_for_event,
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          0,
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          1000000,
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          100,
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::HistogramBase::kUmaTargetedHistogramFlag);
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  counter_for_type->Add(delta.InMicroseconds());
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitWithNativeEvent(native_event);
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const Event& copy)
203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : type_(copy.type_),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(copy.time_stamp_),
2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      latency_(copy.latency_),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(copy.flags_),
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      dispatch_to_hidden_targets_(false),
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      native_event_(::CopyNativeEvent(copy.native_event_)),
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_native_event_(false),
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_event_)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete_native_event_ = true;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetType(EventType type) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = std::string();
2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  type_ = type;
2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Event::Init() {
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::memset(&native_event_, 0, sizeof(native_event_));
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Event::InitWithNativeEvent(const base::NativeEvent& native_event) {
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_event_ = native_event;
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void Event::InitLatencyInfo() {
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  latency_.AddLatencyNumberWithTimestamp(INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT,
2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         0,
2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         0,
2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         base::TimeTicks::FromInternalValue(
2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                             time_stamp_.ToInternalValue()),
2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                         1);
2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  latency_.AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CancelModeEvent
2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::CancelModeEvent()
2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Event(ET_CANCEL_MODE, base::TimeDelta(), 0) {
2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_cancelable(false);
2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::~CancelModeEvent() {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocatedEvent
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::~LocatedEvent() {
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(const base::NativeEvent& native_event)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(native_event,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventTypeFromNative(native_event),
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventFlagsFromNative(native_event)),
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(EventLocationFromNative(native_event)),
270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_location_(location_) {
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(EventType type,
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const gfx::Point& location,
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const gfx::Point& root_location,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::TimeDelta time_stamp,
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int flags)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(type, time_stamp, flags),
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(location),
280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_location_(root_location) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocatedEvent::UpdateForRootTransform(
2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& reversed_root_transform) {
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transform has to be done at root level.
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point3F p(location_);
287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  reversed_root_transform.TransformPoint(&p);
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  root_location_ = location_ = gfx::ToFlooredPoint(p.AsPointF());
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(const base::NativeEvent& native_event)
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(native_event),
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      changed_button_flags_(
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetChangedMouseButtonFlagsFromNative(native_event)) {
298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() == ET_MOUSE_PRESSED || type() == ET_MOUSE_RELEASED)
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetClickCount(GetRepeatCount(*this));
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(EventType type,
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const gfx::Point& location,
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const gfx::Point& root_location,
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int flags)
3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LocatedEvent(type, location, root_location, EventTimeForNow(), flags),
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      changed_button_flags_(0) {
3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (this->type() == ET_MOUSE_MOVED && IsAnyButton())
3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetType(ET_MOUSE_DRAGGED);
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MouseEvent::IsRepeatedClickEvent(
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MouseEvent& event1,
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MouseEvent& event2) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These values match the Windows defaults.
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickTimeMS = 500;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickWidth = 4;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickHeight = 4;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event1.type() != ET_MOUSE_PRESSED ||
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event2.type() != ET_MOUSE_PRESSED)
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compare flags, but ignore EF_IS_DOUBLE_CLICK to allow triple clicks.
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((event1.flags() & ~EF_IS_DOUBLE_CLICK) !=
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (event2.flags() & ~EF_IS_DOUBLE_CLICK))
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta time_difference = event2.time_stamp() - event1.time_stamp();
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (time_difference.InMilliseconds() > kDoubleClickTimeMS)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (abs(event2.x() - event1.x()) > kDoubleClickWidth / 2)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (abs(event2.y() - event1.y()) > kDoubleClickHeight / 2)
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetRepeatCount(const MouseEvent& event) {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int click_count = 1;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_click_event_) {
348d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (event.type() == ui::ET_MOUSE_RELEASED)
349d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return last_click_event_->GetClickCount();
3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (IsX11SendEventTrue(event.native_event()))
3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      click_count = last_click_event_->GetClickCount();
3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else if (IsRepeatedClickEvent(*last_click_event_, event))
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      click_count = last_click_event_->GetClickCount() + 1;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete last_click_event_;
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_click_event_ = new MouseEvent(event);
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (click_count > 3)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    click_count = 3;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_click_event_->SetClickCount(click_count);
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return click_count;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent* MouseEvent::last_click_event_ = NULL;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetClickCount() const {
367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags() & EF_IS_TRIPLE_CLICK)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 3;
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (flags() & EF_IS_DOUBLE_CLICK)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 2;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MouseEvent::SetClickCount(int click_count) {
379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(click_count > 0);
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(click_count <= 3);
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int f = flags();
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (click_count) {
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1:
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_DOUBLE_CLICK;
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_TRIPLE_CLICK;
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2:
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f |= EF_IS_DOUBLE_CLICK;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_TRIPLE_CLICK;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 3:
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_DOUBLE_CLICK;
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f |= EF_IS_TRIPLE_CLICK;
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_flags(f);
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseWheelEvent
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const base::NativeEvent& native_event)
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(native_event),
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset_(GetMouseWheelOffset(native_event)) {
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const ScrollEvent& scroll_event)
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(scroll_event),
413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      offset_(scroll_event.x_offset(), scroll_event.y_offset()){
4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetType(ET_MOUSEWHEEL);
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const MouseEvent& mouse_event,
418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int x_offset,
419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int y_offset)
420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : MouseEvent(mouse_event), offset_(x_offset, y_offset) {
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type() == ET_MOUSEWHEEL);
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMouseWheelEvent::MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event)
425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : MouseEvent(mouse_wheel_event),
426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      offset_(mouse_wheel_event.offset()) {
427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(type() == ET_MOUSEWHEEL);
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches windows WHEEL_DELTA.
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 120;
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches GTK+ wheel scroll amount.
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 53;
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MouseWheelEvent::UpdateForRootTransform(
440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const gfx::Transform& inverted_root_transform) {
441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LocatedEvent::UpdateForRootTransform(inverted_root_transform);
442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::DecomposedTransform decomp;
443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform);
444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(success);
445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (decomp.scale[0])
446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    offset_.set_x(offset_.x() * decomp.scale[0]);
447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (decomp.scale[1])
448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    offset_.set_y(offset_.y() * decomp.scale[1]);
449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(const base::NativeEvent& native_event)
4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(native_event),
4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(GetTouchId(native_event)),
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(GetTouchRadiusX(native_event)),
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(GetTouchRadiusY(native_event)),
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(GetTouchAngle(native_event)),
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      force_(GetTouchForce(native_event)) {
4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitLatencyInfo();
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const gfx::Point& location,
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int touch_id,
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::TimeDelta time_stamp)
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(type, location, location, time_stamp, 0),
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(touch_id),
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(0.0f),
4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(0.0f),
4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(0.0f),
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      force_(0.0f) {
4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitLatencyInfo();
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const gfx::Point& location,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int flags,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int touch_id,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::TimeDelta time_stamp,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float radius_x,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float radius_y,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float angle,
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float force)
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(type, location, location, time_stamp, flags),
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(touch_id),
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(radius_x),
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(radius_y),
4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(angle),
4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      force_(force) {
4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  InitLatencyInfo();
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::~TouchEvent() {
496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // In ctor TouchEvent(native_event) we call GetTouchId() which in X11
497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // platform setups the tracking_id to slot mapping. So in dtor here,
498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // if this touch event is a release event, we clear the mapping accordingly.
499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (HasNativeEvent())
500a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ClearTouchIdIfReleased(native_event());
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void TouchEvent::Relocate(const gfx::Point& origin) {
5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  location_ -= origin.OffsetFromOrigin();
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  root_location_ -= origin.OffsetFromOrigin();
5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
508c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEvent::UpdateForRootTransform(
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Transform& inverted_root_transform) {
510c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LocatedEvent::UpdateForRootTransform(inverted_root_transform);
5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::DecomposedTransform decomp;
512c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform);
5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(success);
5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (decomp.scale[0])
515c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    radius_x_ *= decomp.scale[0];
5162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (decomp.scale[1])
517c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    radius_y_ *= decomp.scale[1];
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeyEvent
5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(const base::NativeEvent& native_event, bool is_char)
5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(native_event,
5255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventTypeFromNative(native_event),
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventFlagsFromNative(native_event)),
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_code_(KeyboardCodeFromNative(native_event)),
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_char_(is_char),
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      character_(0),
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unmodified_character_(0) {
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NormalizeFlags();
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(EventType type,
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KeyboardCode key_code,
5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int flags,
5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   bool is_char)
5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Event(type, EventTimeForNow(), flags),
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_code_(key_code),
5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_char_(is_char),
5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      character_(GetCharacterFromKeyCode(key_code, flags)),
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unmodified_character_(0) {
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 KeyEvent::GetCharacter() const {
5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (character_)
5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return character_;
5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (native_event().message == WM_CHAR) ? key_code_ :
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCharacterFromKeyCode(key_code_, flags());
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!native_event())
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetCharacterFromKeyCode(key_code_, flags());
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(native_event()->type == KeyPress ||
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         native_event()->type == KeyRelease);
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 ch = 0;
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsControlDown())
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ch = GetCharacterFromXEvent(native_event());
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ch ? ch : GetCharacterFromKeyCode(key_code_, flags());
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 KeyEvent::GetUnmodifiedCharacter() const {
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (unmodified_character_)
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return unmodified_character_;
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Looks like there is no way to get unmodified character on Windows.
5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (native_event().message == WM_CHAR) ? key_code_ :
5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCharacterFromKeyCode(key_code_, flags() & EF_SHIFT_DOWN);
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11)
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!native_event())
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetCharacterFromKeyCode(key_code_, flags() & EF_SHIFT_DOWN);
5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(native_event()->type == KeyPress ||
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         native_event()->type == KeyRelease);
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const unsigned int kIgnoredModifiers = ControlMask | LockMask |
5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask;
5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XKeyEvent copy = native_event()->xkey;  // bit-wise copy is safe.
5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can't use things like (native_event()->xkey.state & ShiftMask), as it
5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // may mask out bits used by X11 internally.
5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy.state &= ~kIgnoredModifiers;
5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 ch = GetCharacterFromXEvent(reinterpret_cast<XEvent*>(&copy));
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ch ? ch : GetCharacterFromKeyCode(key_code_, flags() & EF_SHIFT_DOWN);
595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#elif defined(USE_OZONE)
596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return is_char() ? key_code_ : GetCharacterFromKeyCode(
597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)                                     key_code_, flags() & EF_SHIFT_DOWN);
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTIMPLEMENTED();
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KeyEvent* KeyEvent::Copy() const {
605d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(USE_OZONE)
606d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  KeyEvent* copy = new KeyEvent(*this);
607d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  KeyEvent* copy = new KeyEvent(::CopyNativeEvent(native_event()), is_char());
609d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  copy->set_delete_native_event(true);
6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return copy;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool KeyEvent::IsUnicodeKeyCode() const {
6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsAltDown())
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int key = key_code();
6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (key >= VKEY_NUMPAD0 && key <= VKEY_NUMPAD9)
6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check whether the user is using the numeric keypad with num-lock off.
6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In that case, EF_EXTENDED will not be set; if it is set, the key event
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // originated from the relevant non-numpad dedicated key, e.g. [Insert].
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (!(flags() & EF_EXTENDED) &&
6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          (key == VKEY_INSERT || key == VKEY_END  || key == VKEY_DOWN ||
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           key == VKEY_NEXT   || key == VKEY_LEFT || key == VKEY_CLEAR ||
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           key == VKEY_RIGHT  || key == VKEY_HOME || key == VKEY_UP ||
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           key == VKEY_PRIOR));
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEvent::NormalizeFlags() {
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mask = 0;
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (key_code()) {
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_CONTROL:
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_CONTROL_DOWN;
6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_SHIFT:
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_SHIFT_DOWN;
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_MENU:
6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_ALT_DOWN;
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_CAPITAL:
6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_CAPS_LOCK_DOWN;
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type() == ET_KEY_PRESSED)
6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_flags(flags() | mask);
6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_flags(flags() & ~mask);
6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TranslatedKeyEvent
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TranslatedKeyEvent::TranslatedKeyEvent(const base::NativeEvent& native_event,
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool is_char)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : KeyEvent(native_event, is_char) {
6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetType(type() == ET_KEY_PRESSED ?
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ET_TRANSLATED_KEY_PRESS : ET_TRANSLATED_KEY_RELEASE);
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TranslatedKeyEvent::TranslatedKeyEvent(bool is_press,
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       KeyboardCode key_code,
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int flags)
6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : KeyEvent((is_press ? ET_TRANSLATED_KEY_PRESS : ET_TRANSLATED_KEY_RELEASE),
6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               key_code,
6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               flags,
6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               false) {
6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatedKeyEvent::ConvertToKeyEvent() {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetType(type() == ET_TRANSLATED_KEY_PRESS ?
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ET_KEY_PRESSED : ET_KEY_RELEASED);
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DropTargetEvent
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DropTargetEvent::DropTargetEvent(const OSExchangeData& data,
6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const gfx::Point& location,
6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const gfx::Point& root_location,
6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int source_operations)
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LocatedEvent(ET_DROP_TARGET_EVENT,
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   location,
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   root_location,
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   EventTimeForNow(),
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   0),
6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      data_(data),
6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      source_operations_(source_operations) {
6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollEvent
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollEvent::ScrollEvent(const base::NativeEvent& native_event)
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(native_event) {
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type() == ET_SCROLL) {
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetScrollOffsets(native_event,
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &x_offset_, &y_offset_,
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &x_offset_ordinal_, &y_offset_ordinal_,
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &finger_count_);
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (type() == ET_SCROLL_FLING_START ||
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             type() == ET_SCROLL_FLING_CANCEL) {
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetFlingData(native_event,
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &x_offset_, &y_offset_,
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &x_offset_ordinal_, &y_offset_ordinal_,
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 NULL);
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Unexpected event type " << type()
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << " when constructing a ScrollEvent.";
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollEvent::ScrollEvent(EventType type,
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         const gfx::Point& location,
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         base::TimeDelta time_stamp,
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int flags,
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float x_offset,
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float y_offset,
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float x_offset_ordinal,
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float y_offset_ordinal,
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int finger_count)
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : MouseEvent(type, location, location, flags),
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      x_offset_(x_offset),
7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      y_offset_(y_offset),
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      x_offset_ordinal_(x_offset_ordinal),
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      y_offset_ordinal_(y_offset_ordinal),
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      finger_count_(finger_count) {
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_time_stamp(time_stamp);
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(IsScrollEvent());
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollEvent::Scale(const float factor) {
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  x_offset_ *= factor;
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  y_offset_ *= factor;
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  x_offset_ordinal_ *= factor;
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  y_offset_ordinal_ *= factor;
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ScrollEvent::UpdateForRootTransform(
745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Transform& inverted_root_transform) {
746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LocatedEvent::UpdateForRootTransform(inverted_root_transform);
7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::DecomposedTransform decomp;
748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform);
7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(success);
7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (decomp.scale[0])
751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    x_offset_ordinal_ *= decomp.scale[0];
7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (decomp.scale[1])
753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    y_offset_ordinal_ *= decomp.scale[1];
7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GestureEvent
7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::GestureEvent(EventType type,
7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int x,
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int y,
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int flags,
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::TimeDelta time_stamp,
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const GestureEventDetails& details,
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           unsigned int touch_ids_bitfield)
7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LocatedEvent(type,
7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   gfx::Point(x, y),
7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   gfx::Point(x, y),
7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   time_stamp,
7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   flags | EF_FROM_TOUCH),
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      details_(details),
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_ids_bitfield_(touch_ids_bitfield) {
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::~GestureEvent() {
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GestureEvent::GetLowestTouchId() const {
7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (touch_ids_bitfield_ == 0)
7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i = -1;
7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the index of the least significant 1 bit
7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!(1 << ++i & touch_ids_bitfield_));
7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i;
7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
788