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)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string EventTypeName(ui::EventType type) {
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define RETURN_IF_TYPE(t) if (type == ui::t)  return #t
342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CASE_TYPE(t) case ui::t:  return #t
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  switch (type) {
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_UNKNOWN);
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_PRESSED);
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_DRAGGED);
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_RELEASED);
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_MOVED);
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_ENTERED);
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_EXITED);
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_KEY_PRESSED);
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_KEY_RELEASED);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSEWHEEL);
462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_MOUSE_CAPTURE_CHANGED);
472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_RELEASED);
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_PRESSED);
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_MOVED);
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TOUCH_CANCELLED);
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_DROP_TARGET_EVENT);
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TRANSLATED_KEY_PRESS);
532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_TRANSLATED_KEY_RELEASE);
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_SCROLL_BEGIN);
552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_SCROLL_END);
562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_SCROLL_UPDATE);
571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    CASE_TYPE(ET_GESTURE_SHOW_PRESS);
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CASE_TYPE(ET_GESTURE_WIN8_EDGE_SWIPE);
592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP);
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP_DOWN);
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP_CANCEL);
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_BEGIN);
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_END);
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_TWO_FINGER_TAP);
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_PINCH_BEGIN);
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_PINCH_END);
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_PINCH_UPDATE);
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_LONG_PRESS);
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_GESTURE_LONG_TAP);
70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    CASE_TYPE(ET_GESTURE_SWIPE);
71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    CASE_TYPE(ET_GESTURE_TAP_UNCONFIRMED);
72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    CASE_TYPE(ET_GESTURE_DOUBLE_TAP);
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_SCROLL);
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_SCROLL_FLING_START);
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_SCROLL_FLING_CANCEL);
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    CASE_TYPE(ET_CANCEL_MODE);
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    CASE_TYPE(ET_UMA_DATA);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case ui::ET_LAST: NOTREACHED(); return std::string();
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // Don't include default, so that we get an error when new type is added.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#undef CASE_TYPE
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NOTREACHED();
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return std::string();
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsX11SendEventTrue(const base::NativeEvent& event) {
882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_X11)
8908fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu  return event && event->xany.send_event;
9008fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu#else
9108fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu  return false;
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
9308fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu}
9408fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu
9508fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liubool X11EventHasNonStandardState(const base::NativeEvent& event) {
9608fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu#if defined(USE_X11)
9708fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu  const unsigned int kAllStateMask =
9808fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu      Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask |
9908fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu      Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask |
10008fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu      LockMask | ControlMask | AnyModifier;
10108fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu  return event && (event->xkey.state & ~kAllStateMask) != 0;
10208fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu#else
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
10408fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu#endif
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::~Event() {
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delete_native_event_)
1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ReleaseCopiedNativeEvent(native_event_);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Event::HasNativeEvent() const {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::NativeEvent null_event;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::memset(&null_event, 0, sizeof(null_event));
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!std::memcmp(&native_event_, &null_event, sizeof(null_event));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::StopPropagation() {
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events.
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH);
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(cancelable_);
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_ = static_cast<EventResult>(result_ | ER_CONSUMED);
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetHandled() {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events.
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH);
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(cancelable_);
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_ = static_cast<EventResult>(result_ | ER_HANDLED);
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(EventType type, base::TimeDelta time_stamp, int flags)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(time_stamp),
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(flags),
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      native_event_(base::NativeEvent()),
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_native_event_(false),
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const base::NativeEvent& native_event,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             EventType type,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int flags)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(EventTimeFromNative(native_event)),
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(flags),
1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      native_event_(native_event),
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)  base::TimeDelta delta = EventTimeForNow() - time_stamp_;
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser",
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              delta.InMicroseconds(), 1, 1000000, 100);
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string name_for_event =
1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringPrintf("Event.Latency.Browser.%s", name_.c_str());
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::HistogramBase* counter_for_type =
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Histogram::FactoryGet(
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          name_for_event,
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          1,
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          1000000,
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          100,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::HistogramBase::kUmaTargetedHistogramFlag);
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  counter_for_type->Add(delta.InMicroseconds());
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const Event& copy)
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : type_(copy.type_),
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(copy.time_stamp_),
1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      latency_(copy.latency_),
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(copy.flags_),
1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      native_event_(CopyNativeEvent(copy.native_event_)),
1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      delete_native_event_(true),
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetType(EventType type) {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = std::string();
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  type_ = type;
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CancelModeEvent
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::CancelModeEvent()
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Event(ET_CANCEL_MODE, base::TimeDelta(), 0) {
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_cancelable(false);
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::~CancelModeEvent() {
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocatedEvent
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::~LocatedEvent() {
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(const base::NativeEvent& native_event)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(native_event,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventTypeFromNative(native_event),
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventFlagsFromNative(native_event)),
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(EventLocationFromNative(native_event)),
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_location_(location_) {
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(EventType type,
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const gfx::PointF& location,
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const gfx::PointF& root_location,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::TimeDelta time_stamp,
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int flags)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(type, time_stamp, flags),
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(location),
239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_location_(root_location) {
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocatedEvent::UpdateForRootTransform(
2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& reversed_root_transform) {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transform has to be done at root level.
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point3F p(location_);
246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  reversed_root_transform.TransformPoint(&p);
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  location_ = p.AsPointF();
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  root_location_ = location_;
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(const base::NativeEvent& native_event)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(native_event),
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      changed_button_flags_(
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetChangedMouseButtonFlagsFromNative(native_event)) {
258d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() == ET_MOUSE_PRESSED || type() == ET_MOUSE_RELEASED)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetClickCount(GetRepeatCount(*this));
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(EventType type,
2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& location,
2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& root_location,
2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       int flags,
2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       int changed_button_flags)
2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LocatedEvent(type, location, root_location, EventTimeForNow(), flags),
2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      changed_button_flags_(changed_button_flags) {
2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (this->type() == ET_MOUSE_MOVED && IsAnyButton())
2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetType(ET_MOUSE_DRAGGED);
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MouseEvent::IsRepeatedClickEvent(
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MouseEvent& event1,
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MouseEvent& event2) {
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These values match the Windows defaults.
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickTimeMS = 500;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickWidth = 4;
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickHeight = 4;
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event1.type() != ET_MOUSE_PRESSED ||
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event2.type() != ET_MOUSE_PRESSED)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compare flags, but ignore EF_IS_DOUBLE_CLICK to allow triple clicks.
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((event1.flags() & ~EF_IS_DOUBLE_CLICK) !=
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (event2.flags() & ~EF_IS_DOUBLE_CLICK))
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta time_difference = event2.time_stamp() - event1.time_stamp();
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (time_difference.InMilliseconds() > kDoubleClickTimeMS)
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (std::abs(event2.x() - event1.x()) > kDoubleClickWidth / 2)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (std::abs(event2.y() - event1.y()) > kDoubleClickHeight / 2)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetRepeatCount(const MouseEvent& event) {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int click_count = 1;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_click_event_) {
3099a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu    if (event.type() == ui::ET_MOUSE_RELEASED) {
3109a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu      if (event.changed_button_flags() ==
3119a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu              last_click_event_->changed_button_flags()) {
3129a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu        last_click_complete_ = true;
3139a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu        return last_click_event_->GetClickCount();
3149a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu      } else {
3159a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu        // If last_click_event_ has changed since this button was pressed
3169a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu        // return a click count of 1.
3179a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu        return click_count;
3189a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu      }
3199a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu    }
3209a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu    if (event.time_stamp() != last_click_event_->time_stamp())
3219a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu      last_click_complete_ = true;
3229a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu    if (!last_click_complete_ ||
3239a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu        IsX11SendEventTrue(event.native_event())) {
3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      click_count = last_click_event_->GetClickCount();
3259a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu    } else if (IsRepeatedClickEvent(*last_click_event_, event)) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      click_count = last_click_event_->GetClickCount() + 1;
3279a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu    }
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete last_click_event_;
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_click_event_ = new MouseEvent(event);
3319a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu  last_click_complete_ = false;
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (click_count > 3)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    click_count = 3;
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_click_event_->SetClickCount(click_count);
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return click_count;
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3389a3a4bc965704498ea9f22876627cda96ff9a77eBo Liuvoid MouseEvent::ResetLastClickForTest() {
3399a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu  if (last_click_event_) {
3409a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu    delete last_click_event_;
3419a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu    last_click_event_ = NULL;
3429a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu    last_click_complete_ = false;
3439a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu  }
3449a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu}
3459a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent* MouseEvent::last_click_event_ = NULL;
3489a3a4bc965704498ea9f22876627cda96ff9a77eBo Liubool MouseEvent::last_click_complete_ = false;
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetClickCount() const {
351d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags() & EF_IS_TRIPLE_CLICK)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 3;
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (flags() & EF_IS_DOUBLE_CLICK)
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 2;
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MouseEvent::SetClickCount(int click_count) {
363d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(click_count > 0);
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(click_count <= 3);
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int f = flags();
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (click_count) {
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1:
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_DOUBLE_CLICK;
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_TRIPLE_CLICK;
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2:
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f |= EF_IS_DOUBLE_CLICK;
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_TRIPLE_CLICK;
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 3:
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_DOUBLE_CLICK;
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f |= EF_IS_TRIPLE_CLICK;
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_flags(f);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseWheelEvent
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const base::NativeEvent& native_event)
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(native_event),
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset_(GetMouseWheelOffset(native_event)) {
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const ScrollEvent& scroll_event)
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(scroll_event),
397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      offset_(scroll_event.x_offset(), scroll_event.y_offset()){
3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetType(ET_MOUSEWHEEL);
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const MouseEvent& mouse_event,
402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int x_offset,
403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int y_offset)
404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : MouseEvent(mouse_event), offset_(x_offset, y_offset) {
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type() == ET_MOUSEWHEEL);
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMouseWheelEvent::MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event)
409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : MouseEvent(mouse_wheel_event),
410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      offset_(mouse_wheel_event.offset()) {
411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(type() == ET_MOUSEWHEEL);
412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches windows WHEEL_DELTA.
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 120;
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches GTK+ wheel scroll amount.
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 53;
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MouseWheelEvent::UpdateForRootTransform(
424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const gfx::Transform& inverted_root_transform) {
425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LocatedEvent::UpdateForRootTransform(inverted_root_transform);
426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::DecomposedTransform decomp;
427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform);
428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(success);
429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (decomp.scale[0])
430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    offset_.set_x(offset_.x() * decomp.scale[0]);
431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (decomp.scale[1])
432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    offset_.set_y(offset_.y() * decomp.scale[1]);
433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent
4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(const base::NativeEvent& native_event)
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(native_event),
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(GetTouchId(native_event)),
4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(GetTouchRadiusX(native_event)),
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(GetTouchRadiusY(native_event)),
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(GetTouchAngle(native_event)),
4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      force_(GetTouchForce(native_event)),
4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_device_id_(-1) {
4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumberWithTimestamp(
4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT,
4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      0,
4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      0,
4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::TimeTicks::FromInternalValue(time_stamp().ToInternalValue()),
4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      1);
4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_X11)
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(native_event->xcookie.data);
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  source_device_id_ = xiev->deviceid;
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type,
4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& location,
4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int touch_id,
4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::TimeDelta time_stamp)
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(type, location, location, time_stamp, 0),
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(touch_id),
4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(0.0f),
4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(0.0f),
4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(0.0f),
4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      force_(0.0f),
4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_device_id_(-1) {
4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type,
4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& location,
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int flags,
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int touch_id,
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::TimeDelta time_stamp,
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float radius_x,
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float radius_y,
4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float angle,
4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float force)
4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(type, location, location, time_stamp, flags),
4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(touch_id),
4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(radius_x),
4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(radius_y),
4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(angle),
4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      force_(force),
4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_device_id_(-1) {
4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::~TouchEvent() {
495a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // In ctor TouchEvent(native_event) we call GetTouchId() which in X11
496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // platform setups the tracking_id to slot mapping. So in dtor here,
497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // if this touch event is a release event, we clear the mapping accordingly.
498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (HasNativeEvent())
499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ClearTouchIdIfReleased(native_event());
5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEvent::UpdateForRootTransform(
503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Transform& inverted_root_transform) {
504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LocatedEvent::UpdateForRootTransform(inverted_root_transform);
5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::DecomposedTransform decomp;
506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform);
5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(success);
5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (decomp.scale[0])
509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    radius_x_ *= decomp.scale[0];
5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (decomp.scale[1])
511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    radius_y_ *= decomp.scale[1];
5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeyEvent
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
51746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
51846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)KeyEvent* KeyEvent::last_key_event_ = NULL;
51946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
52046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
52146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool KeyEvent::IsRepeated(const KeyEvent& event) {
52246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // A safe guard in case if there were continous key pressed events that are
52346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // not auto repeat.
52446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int kMaxAutoRepeatTimeMs = 2000;
52508fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu  // Ignore key events that have non standard state masks as it may be
52608fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu  // reposted by an IME. IBUS-GTK uses this field to detect the
52708fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu  // re-posted event for example. crbug.com/385873.
52808fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu  if (X11EventHasNonStandardState(event.native_event()))
52908fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu    return false;
53046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (event.is_char())
53146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (event.type() == ui::ET_KEY_RELEASED) {
53346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    delete last_key_event_;
53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    last_key_event_ = NULL;
53546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
53746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CHECK_EQ(ui::ET_KEY_PRESSED, event.type());
53846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!last_key_event_) {
53946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    last_key_event_ = new KeyEvent(event);
54046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
54146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
54246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (event.key_code() == last_key_event_->key_code() &&
54346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      event.flags() == last_key_event_->flags() &&
54446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (event.time_stamp() - last_key_event_->time_stamp()).InMilliseconds() <
54546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kMaxAutoRepeatTimeMs) {
54646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return true;
54746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
54846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  delete last_key_event_;
54946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  last_key_event_ = new KeyEvent(event);
55046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return false;
55146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
55246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(const base::NativeEvent& native_event, bool is_char)
5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(native_event,
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventTypeFromNative(native_event),
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventFlagsFromNative(native_event)),
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_code_(KeyboardCodeFromNative(native_event)),
558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      code_(CodeFromNative(native_event)),
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_char_(is_char),
560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      platform_keycode_(PlatformKeycodeFromNative(native_event)),
5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      character_(0) {
56246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (IsRepeated(*this))
56346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    set_flags(flags() | ui::EF_IS_REPEAT);
56446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NormalizeFlags();
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(EventType type,
5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KeyboardCode key_code,
5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int flags,
5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   bool is_char)
5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Event(type, EventTimeForNow(), flags),
5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_code_(key_code),
5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_char_(is_char),
577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      platform_keycode_(0),
5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      character_(GetCharacterFromKeyCode(key_code, flags)) {
5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)KeyEvent::KeyEvent(EventType type,
582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   KeyboardCode key_code,
583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   const std::string& code,
584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   int flags,
585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   bool is_char)
586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : Event(type, EventTimeForNow(), flags),
587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      key_code_(key_code),
588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      code_(code),
589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      is_char_(is_char),
590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      platform_keycode_(0),
591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      character_(GetCharacterFromKeyCode(key_code, flags)) {
592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 KeyEvent::GetCharacter() const {
5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (character_)
5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return character_;
5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (native_event().message == WM_CHAR) ? key_code_ :
6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCharacterFromKeyCode(key_code_, flags());
6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11)
6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!native_event())
6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetCharacterFromKeyCode(key_code_, flags());
6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(native_event()->type == KeyPress ||
6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         native_event()->type == KeyRelease);
6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // When a control key is held, prefer ASCII characters to non ASCII
6096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // characters in order to use it for shortcut keys.  GetCharacterFromKeyCode
6106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11.
6116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // GetCharacterFromXEvent returns 'à' in that case.
6126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return IsControlDown() ?
6136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      GetCharacterFromKeyCode(key_code_, flags()) :
6146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      GetCharacterFromXEvent(native_event());
6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (native_event()) {
617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED ||
618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)           EventTypeFromNative(native_event()) == ET_KEY_RELEASED);
619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  }
6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return GetCharacterFromKeyCode(key_code_, flags());
6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool KeyEvent::IsUnicodeKeyCode() const {
626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_WIN)
6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!IsAltDown())
6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return false;
6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const int key = key_code();
6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (key >= VKEY_NUMPAD0 && key <= VKEY_NUMPAD9)
6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Check whether the user is using the numeric keypad with num-lock off.
6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In that case, EF_EXTENDED will not be set; if it is set, the key event
6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // originated from the relevant non-numpad dedicated key, e.g. [Insert].
6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return (!(flags() & EF_EXTENDED) &&
6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          (key == VKEY_INSERT || key == VKEY_END  || key == VKEY_DOWN ||
6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           key == VKEY_NEXT   || key == VKEY_LEFT || key == VKEY_CLEAR ||
6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           key == VKEY_RIGHT  || key == VKEY_HOME || key == VKEY_UP ||
6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)           key == VKEY_PRIOR));
640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else
641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  return false;
642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif
6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEvent::NormalizeFlags() {
6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int mask = 0;
6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (key_code()) {
6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_CONTROL:
6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_CONTROL_DOWN;
6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_SHIFT:
6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_SHIFT_DOWN;
6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_MENU:
6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_ALT_DOWN;
6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case VKEY_CAPITAL:
6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      mask = EF_CAPS_LOCK_DOWN;
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return;
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type() == ET_KEY_PRESSED)
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_flags(flags() | mask);
6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    set_flags(flags() & ~mask);
6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool KeyEvent::IsTranslated() const {
670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (type()) {
671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_PRESSED:
672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_RELEASED:
673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return false;
674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_PRESS:
675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_RELEASE:
676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return false;
680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void KeyEvent::SetTranslated(bool translated) {
684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (type()) {
685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_PRESSED:
686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_PRESS:
687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      SetType(translated ? ET_TRANSLATED_KEY_PRESS : ET_KEY_PRESSED);
688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_RELEASED:
690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_RELEASE:
691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      SetType(translated ? ET_TRANSLATED_KEY_RELEASE : ET_KEY_RELEASED);
692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollEvent
7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollEvent::ScrollEvent(const base::NativeEvent& native_event)
7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(native_event) {
7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type() == ET_SCROLL) {
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetScrollOffsets(native_event,
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &x_offset_, &y_offset_,
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &x_offset_ordinal_, &y_offset_ordinal_,
7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &finger_count_);
7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (type() == ET_SCROLL_FLING_START ||
7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             type() == ET_SCROLL_FLING_CANCEL) {
7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetFlingData(native_event,
7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &x_offset_, &y_offset_,
7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &x_offset_ordinal_, &y_offset_ordinal_,
7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 NULL);
7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Unexpected event type " << type()
7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << " when constructing a ScrollEvent.";
7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollEvent::ScrollEvent(EventType type,
7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const gfx::PointF& location,
7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         base::TimeDelta time_stamp,
7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int flags,
7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float x_offset,
7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float y_offset,
7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float x_offset_ordinal,
7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float y_offset_ordinal,
7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int finger_count)
7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : MouseEvent(type, location, location, flags, 0),
7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      x_offset_(x_offset),
7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      y_offset_(y_offset),
7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      x_offset_ordinal_(x_offset_ordinal),
7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      y_offset_ordinal_(y_offset_ordinal),
7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      finger_count_(finger_count) {
7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_time_stamp(time_stamp);
7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(IsScrollEvent());
7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollEvent::Scale(const float factor) {
7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  x_offset_ *= factor;
7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  y_offset_ *= factor;
7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  x_offset_ordinal_ *= factor;
7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  y_offset_ordinal_ *= factor;
7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GestureEvent
7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::GestureEvent(EventType type,
7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           float x,
7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           float y,
7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int flags,
7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::TimeDelta time_stamp,
7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const GestureEventDetails& details,
7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           unsigned int touch_ids_bitfield)
7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LocatedEvent(type,
7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   gfx::PointF(x, y),
7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   gfx::PointF(x, y),
7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   time_stamp,
7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   flags | EF_FROM_TOUCH),
7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      details_(details),
7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_ids_bitfield_(touch_ids_bitfield) {
7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::~GestureEvent() {
7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GestureEvent::GetLowestTouchId() const {
7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (touch_ids_bitfield_ == 0)
7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i = -1;
7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the index of the least significant 1 bit
7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!(1 << ++i & touch_ids_bitfield_));
7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i;
7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
778