event.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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)
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <X11/extensions/XInput2.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath>
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring>
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h"
165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h"
17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h"
18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point3_f.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point_conversions.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h"
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform_util.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion_x.h"
26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(USE_OZONE)
27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion.h"
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::NativeEvent CopyNativeEvent(const base::NativeEvent& event) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!event || event->type == GenericEvent)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return NULL;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XEvent* copy = new XEvent;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *copy = *event;
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return copy;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return event;
41eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#elif defined(USE_OZONE)
42d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return NULL;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED() <<
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "Don't know how to copy base::NativeEvent for this platform";
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string EventTypeName(ui::EventType type) {
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define RETURN_IF_TYPE(t) if (type == ui::t)  return #t
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CASE_TYPE(t) case ui::t:  return #t
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_UNKNOWN);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_PRESSED);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_DRAGGED);
572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_RELEASED);
582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_MOVED);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_ENTERED);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_EXITED);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_KEY_PRESSED);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_KEY_RELEASED);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSEWHEEL);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_CAPTURE_CHANGED);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_RELEASED);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_PRESSED);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_MOVED);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_STATIONARY);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_CANCELLED);
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_DROP_TARGET_EVENT);
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TRANSLATED_KEY_PRESS);
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TRANSLATED_KEY_RELEASE);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_SCROLL_BEGIN);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_SCROLL_END);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_SCROLL_UPDATE);
761e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    CASE_TYPE(ET_GESTURE_SHOW_PRESS);
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CASE_TYPE(ET_GESTURE_WIN8_EDGE_SWIPE);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP);
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP_DOWN);
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP_CANCEL);
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_BEGIN);
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_END);
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TWO_FINGER_TAP);
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_PINCH_BEGIN);
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_PINCH_END);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_PINCH_UPDATE);
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_LONG_PRESS);
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_LONG_TAP);
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_MULTIFINGER_SWIPE);
90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP_UNCONFIRMED);
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    CASE_TYPE(ET_GESTURE_DOUBLE_TAP);
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_SCROLL);
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_SCROLL_FLING_START);
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_SCROLL_FLING_CANCEL);
952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_CANCEL_MODE);
96eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CASE_TYPE(ET_UMA_DATA);
972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ui::ET_LAST: NOTREACHED(); return std::string();
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Don't include default, so that we get an error when new type is added.
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#undef CASE_TYPE
1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::string();
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsX11SendEventTrue(const base::NativeEvent& event) {
1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_X11)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event && event->xany.send_event)
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::~Event() {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delete_native_event_)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete native_event_;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Event::HasNativeEvent() const {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::NativeEvent null_event;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::memset(&null_event, 0, sizeof(null_event));
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!std::memcmp(&native_event_, &null_event, sizeof(null_event));
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::StopPropagation() {
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events.
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(cancelable_);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_ = static_cast<EventResult>(result_ | ER_CONSUMED);
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetHandled() {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch
1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events.
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH);
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(cancelable_);
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_ = static_cast<EventResult>(result_ | ER_HANDLED);
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(EventType type, base::TimeDelta time_stamp, int flags)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(time_stamp),
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(flags),
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_X11)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      native_event_(NULL),
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_native_event_(false),
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Init();
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const base::NativeEvent& native_event,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             EventType type,
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int flags)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(EventTimeFromNative(native_event)),
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(flags),
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_native_event_(false),
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta delta = EventTimeForNow() - time_stamp_;
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser",
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              delta.InMicroseconds(), 1, 1000000, 100);
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string name_for_event =
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringPrintf("Event.Latency.Browser.%s", name_.c_str());
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::HistogramBase* counter_for_type =
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Histogram::FactoryGet(
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          name_for_event,
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          1,
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          1000000,
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          100,
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::HistogramBase::kUmaTargetedHistogramFlag);
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  counter_for_type->Add(delta.InMicroseconds());
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InitWithNativeEvent(native_event);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const Event& copy)
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : type_(copy.type_),
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(copy.time_stamp_),
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      latency_(copy.latency_),
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(copy.flags_),
201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      native_event_(::CopyNativeEvent(copy.native_event_)),
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_native_event_(false),
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_event_)
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete_native_event_ = true;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetType(EventType type) {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = std::string();
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  type_ = type;
2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Event::Init() {
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::memset(&native_event_, 0, sizeof(native_event_));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Event::InitWithNativeEvent(const base::NativeEvent& native_event) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  native_event_ = native_event;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CancelModeEvent
2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::CancelModeEvent()
2352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Event(ET_CANCEL_MODE, base::TimeDelta(), 0) {
2362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_cancelable(false);
2372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::~CancelModeEvent() {
2402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocatedEvent
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::~LocatedEvent() {
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(const base::NativeEvent& native_event)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(native_event,
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventTypeFromNative(native_event),
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventFlagsFromNative(native_event)),
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(EventLocationFromNative(native_event)),
253c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_location_(location_) {
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(EventType type,
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const gfx::PointF& location,
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const gfx::PointF& root_location,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::TimeDelta time_stamp,
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int flags)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(type, time_stamp, flags),
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(location),
263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_location_(root_location) {
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocatedEvent::UpdateForRootTransform(
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& reversed_root_transform) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transform has to be done at root level.
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point3F p(location_);
270d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  reversed_root_transform.TransformPoint(&p);
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  location_ = p.AsPointF();
2725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  root_location_ = location_;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(const base::NativeEvent& native_event)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(native_event),
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      changed_button_flags_(
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetChangedMouseButtonFlagsFromNative(native_event)) {
282d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() == ET_MOUSE_PRESSED || type() == ET_MOUSE_RELEASED)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetClickCount(GetRepeatCount(*this));
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(EventType type,
2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& location,
2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& root_location,
2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       int flags,
2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       int changed_button_flags)
2912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LocatedEvent(type, location, root_location, EventTimeForNow(), flags),
2925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      changed_button_flags_(changed_button_flags) {
2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (this->type() == ET_MOUSE_MOVED && IsAnyButton())
2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetType(ET_MOUSE_DRAGGED);
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MouseEvent::IsRepeatedClickEvent(
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MouseEvent& event1,
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MouseEvent& event2) {
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These values match the Windows defaults.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickTimeMS = 500;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickWidth = 4;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickHeight = 4;
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event1.type() != ET_MOUSE_PRESSED ||
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event2.type() != ET_MOUSE_PRESSED)
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compare flags, but ignore EF_IS_DOUBLE_CLICK to allow triple clicks.
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((event1.flags() & ~EF_IS_DOUBLE_CLICK) !=
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (event2.flags() & ~EF_IS_DOUBLE_CLICK))
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta time_difference = event2.time_stamp() - event1.time_stamp();
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (time_difference.InMilliseconds() > kDoubleClickTimeMS)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
320a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (std::abs(event2.x() - event1.x()) > kDoubleClickWidth / 2)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
323a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (std::abs(event2.y() - event1.y()) > kDoubleClickHeight / 2)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetRepeatCount(const MouseEvent& event) {
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int click_count = 1;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_click_event_) {
333d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (event.type() == ui::ET_MOUSE_RELEASED)
334d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return last_click_event_->GetClickCount();
3352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (IsX11SendEventTrue(event.native_event()))
3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      click_count = last_click_event_->GetClickCount();
3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else if (IsRepeatedClickEvent(*last_click_event_, event))
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      click_count = last_click_event_->GetClickCount() + 1;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete last_click_event_;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_click_event_ = new MouseEvent(event);
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (click_count > 3)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    click_count = 3;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_click_event_->SetClickCount(click_count);
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return click_count;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent* MouseEvent::last_click_event_ = NULL;
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetClickCount() const {
352d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags() & EF_IS_TRIPLE_CLICK)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 3;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (flags() & EF_IS_DOUBLE_CLICK)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 2;
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MouseEvent::SetClickCount(int click_count) {
364d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(click_count > 0);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(click_count <= 3);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int f = flags();
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (click_count) {
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1:
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_DOUBLE_CLICK;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_TRIPLE_CLICK;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2:
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f |= EF_IS_DOUBLE_CLICK;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_TRIPLE_CLICK;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 3:
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_DOUBLE_CLICK;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f |= EF_IS_TRIPLE_CLICK;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_flags(f);
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseWheelEvent
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const base::NativeEvent& native_event)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(native_event),
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset_(GetMouseWheelOffset(native_event)) {
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const ScrollEvent& scroll_event)
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(scroll_event),
398c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      offset_(scroll_event.x_offset(), scroll_event.y_offset()){
3992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetType(ET_MOUSEWHEEL);
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const MouseEvent& mouse_event,
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int x_offset,
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int y_offset)
405c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : MouseEvent(mouse_event), offset_(x_offset, y_offset) {
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type() == ET_MOUSEWHEEL);
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMouseWheelEvent::MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event)
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : MouseEvent(mouse_wheel_event),
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      offset_(mouse_wheel_event.offset()) {
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(type() == ET_MOUSEWHEEL);
413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
414eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches windows WHEEL_DELTA.
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 120;
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches GTK+ wheel scroll amount.
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 53;
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MouseWheelEvent::UpdateForRootTransform(
425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const gfx::Transform& inverted_root_transform) {
426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LocatedEvent::UpdateForRootTransform(inverted_root_transform);
427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::DecomposedTransform decomp;
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform);
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(success);
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (decomp.scale[0])
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    offset_.set_x(offset_.x() * decomp.scale[0]);
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (decomp.scale[1])
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    offset_.set_y(offset_.y() * decomp.scale[1]);
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
435eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(const base::NativeEvent& native_event)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(native_event),
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(GetTouchId(native_event)),
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(GetTouchRadiusX(native_event)),
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(GetTouchRadiusY(native_event)),
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(GetTouchAngle(native_event)),
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      force_(GetTouchForce(native_event)),
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_device_id_(-1) {
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumberWithTimestamp(
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT,
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      0,
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      0,
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::TimeTicks::FromInternalValue(time_stamp().ToInternalValue()),
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      1);
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_X11)
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(native_event->xcookie.data);
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  source_device_id_ = xiev->deviceid;
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type,
4635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& location,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int touch_id,
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::TimeDelta time_stamp)
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(type, location, location, time_stamp, 0),
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(touch_id),
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(0.0f),
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(0.0f),
4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(0.0f),
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      force_(0.0f),
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_device_id_(-1) {
4735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type,
4775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& location,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int flags,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int touch_id,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::TimeDelta time_stamp,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float radius_x,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float radius_y,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float angle,
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float force)
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(type, location, location, time_stamp, flags),
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(touch_id),
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(radius_x),
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(radius_y),
4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(angle),
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      force_(force),
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_device_id_(-1) {
4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
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)),
528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      code_(CodeFromNative(native_event)),
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_char_(is_char),
5304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      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),
5434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      character_(GetCharacterFromKeyCode(key_code, flags)) {
5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)KeyEvent::KeyEvent(EventType type,
547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   KeyboardCode key_code,
548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   const std::string& code,
549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   int flags,
550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   bool is_char)
551a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : Event(type, EventTimeForNow(), flags),
552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      key_code_(key_code),
553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      code_(code),
554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      is_char_(is_char),
555a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      character_(GetCharacterFromKeyCode(key_code, flags)) {
556a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
557a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 KeyEvent::GetCharacter() const {
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (character_)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return character_;
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (native_event().message == WM_CHAR) ? key_code_ :
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCharacterFromKeyCode(key_code_, flags());
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!native_event())
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetCharacterFromKeyCode(key_code_, flags());
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(native_event()->type == KeyPress ||
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         native_event()->type == KeyRelease);
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint16 ch = 0;
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!IsControlDown())
5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ch = GetCharacterFromXEvent(native_event());
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ch ? ch : GetCharacterFromKeyCode(key_code_, flags());
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (native_event()) {
578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED ||
579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)           EventTypeFromNative(native_event()) == ET_KEY_RELEASED);
580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return GetCharacterFromKeyCode(key_code_, flags());
5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool KeyEvent::IsUnicodeKeyCode() const {
587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_WIN)
5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsAltDown())
5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int key = key_code();
5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (key >= VKEY_NUMPAD0 && key <= VKEY_NUMPAD9)
5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check whether the user is using the numeric keypad with num-lock off.
5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In that case, EF_EXTENDED will not be set; if it is set, the key event
5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // originated from the relevant non-numpad dedicated key, e.g. [Insert].
5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (!(flags() & EF_EXTENDED) &&
5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          (key == VKEY_INSERT || key == VKEY_END  || key == VKEY_DOWN ||
5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           key == VKEY_NEXT   || key == VKEY_LEFT || key == VKEY_CLEAR ||
5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           key == VKEY_RIGHT  || key == VKEY_HOME || key == VKEY_UP ||
6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           key == VKEY_PRIOR));
601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEvent::NormalizeFlags() {
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mask = 0;
6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (key_code()) {
6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_CONTROL:
6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_CONTROL_DOWN;
6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_SHIFT:
6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_SHIFT_DOWN;
6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_MENU:
6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_ALT_DOWN;
6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_CAPITAL:
6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_CAPS_LOCK_DOWN;
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type() == ET_KEY_PRESSED)
6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_flags(flags() | mask);
6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_flags(flags() & ~mask);
6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TranslatedKeyEvent
6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TranslatedKeyEvent::TranslatedKeyEvent(const base::NativeEvent& native_event,
6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       bool is_char)
6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : KeyEvent(native_event, is_char) {
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetType(type() == ET_KEY_PRESSED ?
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ET_TRANSLATED_KEY_PRESS : ET_TRANSLATED_KEY_RELEASE);
6385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TranslatedKeyEvent::TranslatedKeyEvent(bool is_press,
6415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       KeyboardCode key_code,
6425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       int flags)
6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : KeyEvent((is_press ? ET_TRANSLATED_KEY_PRESS : ET_TRANSLATED_KEY_RELEASE),
6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               key_code,
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               flags,
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               false) {
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TranslatedKeyEvent::TranslatedKeyEvent(const KeyEvent& key_event)
6505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : KeyEvent(key_event) {
6515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetType(type() == ET_KEY_PRESSED ?
6525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          ET_TRANSLATED_KEY_PRESS : ET_TRANSLATED_KEY_RELEASE);
6535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  set_is_char(false);
6545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatedKeyEvent::ConvertToKeyEvent() {
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetType(type() == ET_TRANSLATED_KEY_PRESS ?
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          ET_KEY_PRESSED : ET_KEY_RELEASED);
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollEvent
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollEvent::ScrollEvent(const base::NativeEvent& native_event)
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(native_event) {
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type() == ET_SCROLL) {
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetScrollOffsets(native_event,
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &x_offset_, &y_offset_,
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &x_offset_ordinal_, &y_offset_ordinal_,
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &finger_count_);
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (type() == ET_SCROLL_FLING_START ||
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             type() == ET_SCROLL_FLING_CANCEL) {
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetFlingData(native_event,
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &x_offset_, &y_offset_,
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &x_offset_ordinal_, &y_offset_ordinal_,
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 NULL);
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Unexpected event type " << type()
6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << " when constructing a ScrollEvent.";
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollEvent::ScrollEvent(EventType type,
6845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const gfx::PointF& location,
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         base::TimeDelta time_stamp,
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int flags,
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float x_offset,
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float y_offset,
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float x_offset_ordinal,
6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float y_offset_ordinal,
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int finger_count)
6925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : MouseEvent(type, location, location, flags, 0),
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      x_offset_(x_offset),
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      y_offset_(y_offset),
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      x_offset_ordinal_(x_offset_ordinal),
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      y_offset_ordinal_(y_offset_ordinal),
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      finger_count_(finger_count) {
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_time_stamp(time_stamp);
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(IsScrollEvent());
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollEvent::Scale(const float factor) {
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  x_offset_ *= factor;
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  y_offset_ *= factor;
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  x_offset_ordinal_ *= factor;
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  y_offset_ordinal_ *= factor;
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GestureEvent
7115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::GestureEvent(EventType type,
7135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           float x,
7145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           float y,
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int flags,
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::TimeDelta time_stamp,
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const GestureEventDetails& details,
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           unsigned int touch_ids_bitfield)
7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LocatedEvent(type,
7205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   gfx::PointF(x, y),
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   gfx::PointF(x, y),
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   time_stamp,
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   flags | EF_FROM_TOUCH),
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      details_(details),
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_ids_bitfield_(touch_ids_bitfield) {
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::~GestureEvent() {
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GestureEvent::GetLowestTouchId() const {
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (touch_ids_bitfield_ == 0)
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i = -1;
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the index of the least significant 1 bit
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!(1 << ++i & touch_ids_bitfield_));
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i;
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
741