event.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
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)
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (event && event->xany.send_event)
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return true;
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return false;
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::~Event() {
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (delete_native_event_)
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    ReleaseCopiedNativeEvent(native_event_);
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Event::HasNativeEvent() const {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::NativeEvent null_event;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::memset(&null_event, 0, sizeof(null_event));
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!std::memcmp(&native_event_, &null_event, sizeof(null_event));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::StopPropagation() {
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch
1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events.
1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH);
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(cancelable_);
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_ = static_cast<EventResult>(result_ | ER_CONSUMED);
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetHandled() {
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // events.
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH);
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(cancelable_);
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  result_ = static_cast<EventResult>(result_ | ER_HANDLED);
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(EventType type, base::TimeDelta time_stamp, int flags)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(time_stamp),
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(flags),
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      native_event_(base::NativeEvent()),
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_native_event_(false),
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const base::NativeEvent& native_event,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             EventType type,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             int flags)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : type_(type),
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(EventTimeFromNative(native_event)),
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(flags),
1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      native_event_(native_event),
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      delete_native_event_(false),
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::TimeDelta delta = EventTimeForNow() - time_stamp_;
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser",
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                              delta.InMicroseconds(), 1, 1000000, 100);
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::string name_for_event =
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::StringPrintf("Event.Latency.Browser.%s", name_.c_str());
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::HistogramBase* counter_for_type =
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Histogram::FactoryGet(
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          name_for_event,
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)          1,
1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          1000000,
1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          100,
1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)          base::HistogramBase::kUmaTargetedHistogramFlag);
1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  counter_for_type->Add(delta.InMicroseconds());
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const Event& copy)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : type_(copy.type_),
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      time_stamp_(copy.time_stamp_),
1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      latency_(copy.latency_),
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      flags_(copy.flags_),
1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      native_event_(CopyNativeEvent(copy.native_event_)),
1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      delete_native_event_(true),
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      cancelable_(true),
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      target_(NULL),
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      phase_(EP_PREDISPATCH),
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      result_(ER_UNHANDLED) {
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetType(EventType type) {
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = std::string();
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  type_ = type;
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (type_ < ET_LAST)
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    name_ = EventTypeName(type_);
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CancelModeEvent
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::CancelModeEvent()
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Event(ET_CANCEL_MODE, base::TimeDelta(), 0) {
2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_cancelable(false);
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::~CancelModeEvent() {
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocatedEvent
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::~LocatedEvent() {
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(const base::NativeEvent& native_event)
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(native_event,
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventTypeFromNative(native_event),
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventFlagsFromNative(native_event)),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(EventLocationFromNative(native_event)),
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_location_(location_) {
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(EventType type,
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const gfx::PointF& location,
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const gfx::PointF& root_location,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::TimeDelta time_stamp,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int flags)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(type, time_stamp, flags),
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      location_(location),
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      root_location_(root_location) {
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocatedEvent::UpdateForRootTransform(
2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    const gfx::Transform& reversed_root_transform) {
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Transform has to be done at root level.
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point3F p(location_);
234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  reversed_root_transform.TransformPoint(&p);
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  location_ = p.AsPointF();
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  root_location_ = location_;
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(const base::NativeEvent& native_event)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(native_event),
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      changed_button_flags_(
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          GetChangedMouseButtonFlagsFromNative(native_event)) {
246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() == ET_MOUSE_PRESSED || type() == ET_MOUSE_RELEASED)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetClickCount(GetRepeatCount(*this));
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(EventType type,
2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& location,
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& root_location,
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       int flags,
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       int changed_button_flags)
2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LocatedEvent(type, location, root_location, EventTimeForNow(), flags),
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      changed_button_flags_(changed_button_flags) {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (this->type() == ET_MOUSE_MOVED && IsAnyButton())
2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    SetType(ET_MOUSE_DRAGGED);
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MouseEvent::IsRepeatedClickEvent(
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MouseEvent& event1,
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const MouseEvent& event2) {
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // These values match the Windows defaults.
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickTimeMS = 500;
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickWidth = 4;
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const int kDoubleClickHeight = 4;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (event1.type() != ET_MOUSE_PRESSED ||
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      event2.type() != ET_MOUSE_PRESSED)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Compare flags, but ignore EF_IS_DOUBLE_CLICK to allow triple clicks.
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if ((event1.flags() & ~EF_IS_DOUBLE_CLICK) !=
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (event2.flags() & ~EF_IS_DOUBLE_CLICK))
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::TimeDelta time_difference = event2.time_stamp() - event1.time_stamp();
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (time_difference.InMilliseconds() > kDoubleClickTimeMS)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (std::abs(event2.x() - event1.x()) > kDoubleClickWidth / 2)
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (std::abs(event2.y() - event1.y()) > kDoubleClickHeight / 2)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetRepeatCount(const MouseEvent& event) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int click_count = 1;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (last_click_event_) {
297d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    if (event.type() == ui::ET_MOUSE_RELEASED)
298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)      return last_click_event_->GetClickCount();
2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    if (IsX11SendEventTrue(event.native_event()))
3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      click_count = last_click_event_->GetClickCount();
3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    else if (IsRepeatedClickEvent(*last_click_event_, event))
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      click_count = last_click_event_->GetClickCount() + 1;
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    delete last_click_event_;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_click_event_ = new MouseEvent(event);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (click_count > 3)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    click_count = 3;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  last_click_event_->SetClickCount(click_count);
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return click_count;
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent* MouseEvent::last_click_event_ = NULL;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetClickCount() const {
316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (flags() & EF_IS_TRIPLE_CLICK)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 3;
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else if (flags() & EF_IS_DOUBLE_CLICK)
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 2;
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MouseEvent::SetClickCount(int click_count) {
328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(click_count > 0);
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(click_count <= 3);
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int f = flags();
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (click_count) {
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1:
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_DOUBLE_CLICK;
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_TRIPLE_CLICK;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2:
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f |= EF_IS_DOUBLE_CLICK;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_TRIPLE_CLICK;
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 3:
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f &= ~EF_IS_DOUBLE_CLICK;
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      f |= EF_IS_TRIPLE_CLICK;
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_flags(f);
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseWheelEvent
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const base::NativeEvent& native_event)
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(native_event),
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      offset_(GetMouseWheelOffset(native_event)) {
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const ScrollEvent& scroll_event)
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(scroll_event),
362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      offset_(scroll_event.x_offset(), scroll_event.y_offset()){
3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  SetType(ET_MOUSEWHEEL);
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const MouseEvent& mouse_event,
367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int x_offset,
368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                 int y_offset)
369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    : MouseEvent(mouse_event), offset_(x_offset, y_offset) {
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(type() == ET_MOUSEWHEEL);
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMouseWheelEvent::MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event)
374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    : MouseEvent(mouse_wheel_event),
375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      offset_(mouse_wheel_event.offset()) {
376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(type() == ET_MOUSEWHEEL);
377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches windows WHEEL_DELTA.
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 120;
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches GTK+ wheel scroll amount.
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 53;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MouseWheelEvent::UpdateForRootTransform(
389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    const gfx::Transform& inverted_root_transform) {
390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  LocatedEvent::UpdateForRootTransform(inverted_root_transform);
391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  gfx::DecomposedTransform decomp;
392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform);
393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DCHECK(success);
394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (decomp.scale[0])
395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    offset_.set_x(offset_.x() * decomp.scale[0]);
396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  if (decomp.scale[1])
397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    offset_.set_y(offset_.y() * decomp.scale[1]);
398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(const base::NativeEvent& native_event)
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(native_event),
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(GetTouchId(native_event)),
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(GetTouchRadiusX(native_event)),
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(GetTouchRadiusY(native_event)),
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(GetTouchAngle(native_event)),
4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      force_(GetTouchForce(native_event)),
4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_device_id_(-1) {
4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumberWithTimestamp(
4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT,
4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      0,
4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      0,
4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::TimeTicks::FromInternalValue(time_stamp().ToInternalValue()),
4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      1);
4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_X11)
4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(native_event->xcookie.data);
4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  source_device_id_ = xiev->deviceid;
4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type,
4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& location,
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int touch_id,
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::TimeDelta time_stamp)
4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(type, location, location, time_stamp, 0),
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(touch_id),
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(0.0f),
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(0.0f),
4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(0.0f),
4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      force_(0.0f),
4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_device_id_(-1) {
4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type,
4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const gfx::PointF& location,
4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int flags,
4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       int touch_id,
4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       base::TimeDelta time_stamp,
4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float radius_x,
4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float radius_y,
4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float angle,
4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       float force)
4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : LocatedEvent(type, location, location, time_stamp, flags),
4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_id_(touch_id),
4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_x_(radius_x),
4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      radius_y_(radius_y),
4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      rotation_angle_(angle),
4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      force_(force),
4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      source_device_id_(-1) {
4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0);
4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::~TouchEvent() {
460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // In ctor TouchEvent(native_event) we call GetTouchId() which in X11
461a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // platform setups the tracking_id to slot mapping. So in dtor here,
462a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // if this touch event is a release event, we clear the mapping accordingly.
463a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  if (HasNativeEvent())
464a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ClearTouchIdIfReleased(native_event());
4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEvent::UpdateForRootTransform(
468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    const gfx::Transform& inverted_root_transform) {
469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  LocatedEvent::UpdateForRootTransform(inverted_root_transform);
4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::DecomposedTransform decomp;
471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform);
4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DCHECK(success);
4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (decomp.scale[0])
474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    radius_x_ *= decomp.scale[0];
4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (decomp.scale[1])
476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    radius_y_ *= decomp.scale[1];
4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeyEvent
4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
48246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
48346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)KeyEvent* KeyEvent::last_key_event_ = NULL;
48446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
48546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static
48646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool KeyEvent::IsRepeated(const KeyEvent& event) {
48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // A safe guard in case if there were continous key pressed events that are
48846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  // not auto repeat.
48946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  const int kMaxAutoRepeatTimeMs = 2000;
49046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
49146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (event.is_char())
49246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
49346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (event.type() == ui::ET_KEY_RELEASED) {
49446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    delete last_key_event_;
49546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    last_key_event_ = NULL;
49646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
49746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
49846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  CHECK_EQ(ui::ET_KEY_PRESSED, event.type());
49946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (!last_key_event_) {
50046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    last_key_event_ = new KeyEvent(event);
50146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return false;
50246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
50346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (event.key_code() == last_key_event_->key_code() &&
50446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      event.flags() == last_key_event_->flags() &&
50546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      (event.time_stamp() - last_key_event_->time_stamp()).InMilliseconds() <
50646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      kMaxAutoRepeatTimeMs) {
50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    return true;
50846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  }
50946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  delete last_key_event_;
51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  last_key_event_ = new KeyEvent(event);
51146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  return false;
51246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)}
51346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(const base::NativeEvent& native_event, bool is_char)
5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : Event(native_event,
5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventTypeFromNative(native_event),
5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)            EventFlagsFromNative(native_event)),
5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_code_(KeyboardCodeFromNative(native_event)),
519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      code_(CodeFromNative(native_event)),
5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_char_(is_char),
521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      platform_keycode_(PlatformKeycodeFromNative(native_event)),
5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      character_(0) {
52346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)  if (IsRepeated(*this))
52446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    set_flags(flags() | ui::EF_IS_REPEAT);
52546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11)
5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NormalizeFlags();
5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(EventType type,
5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   KeyboardCode key_code,
5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   int flags,
5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                   bool is_char)
5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : Event(type, EventTimeForNow(), flags),
5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      key_code_(key_code),
5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      is_char_(is_char),
538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      platform_keycode_(0),
5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      character_(GetCharacterFromKeyCode(key_code, flags)) {
5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)KeyEvent::KeyEvent(EventType type,
543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   KeyboardCode key_code,
544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   const std::string& code,
545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   int flags,
546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                   bool is_char)
547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : Event(type, EventTimeForNow(), flags),
548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      key_code_(key_code),
549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      code_(code),
550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      is_char_(is_char),
551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      platform_keycode_(0),
552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      character_(GetCharacterFromKeyCode(key_code, flags)) {
553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}
554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 KeyEvent::GetCharacter() const {
5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (character_)
5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return character_;
5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN)
5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return (native_event().message == WM_CHAR) ? key_code_ :
5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetCharacterFromKeyCode(key_code_, flags());
5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11)
5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!native_event())
5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return GetCharacterFromKeyCode(key_code_, flags());
5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(native_event()->type == KeyPress ||
5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         native_event()->type == KeyRelease);
5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // When a control key is held, prefer ASCII characters to non ASCII
5706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // characters in order to use it for shortcut keys.  GetCharacterFromKeyCode
5716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11.
5726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // GetCharacterFromXEvent returns 'à' in that case.
5736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return IsControlDown() ?
5746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      GetCharacterFromKeyCode(key_code_, flags()) :
5756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      GetCharacterFromXEvent(native_event());
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)
630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool KeyEvent::IsTranslated() const {
631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (type()) {
632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_PRESSED:
633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_RELEASED:
634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return false;
635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_PRESS:
636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_RELEASE:
637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return true;
638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      return false;
641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void KeyEvent::SetTranslated(bool translated) {
645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  switch (type()) {
646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_PRESSED:
647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_PRESS:
648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      SetType(translated ? ET_TRANSLATED_KEY_PRESS : ET_KEY_PRESSED);
649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_KEY_RELEASED:
651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    case ET_TRANSLATED_KEY_RELEASE:
652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      SetType(translated ? ET_TRANSLATED_KEY_RELEASE : ET_KEY_RELEASED);
653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      break;
654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    default:
655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      NOTREACHED();
656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  }
6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollEvent
6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollEvent::ScrollEvent(const base::NativeEvent& native_event)
6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : MouseEvent(native_event) {
6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (type() == ET_SCROLL) {
6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetScrollOffsets(native_event,
6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &x_offset_, &y_offset_,
6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &x_offset_ordinal_, &y_offset_ordinal_,
6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                     &finger_count_);
6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else if (type() == ET_SCROLL_FLING_START ||
6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)             type() == ET_SCROLL_FLING_CANCEL) {
6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    GetFlingData(native_event,
6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &x_offset_, &y_offset_,
6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 &x_offset_ordinal_, &y_offset_ordinal_,
6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                 NULL);
6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  } else {
6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    NOTREACHED() << "Unexpected event type " << type()
6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)        << " when constructing a ScrollEvent.";
6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollEvent::ScrollEvent(EventType type,
6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                         const gfx::PointF& location,
6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         base::TimeDelta time_stamp,
6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int flags,
6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float x_offset,
6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float y_offset,
6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float x_offset_ordinal,
6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         float y_offset_ordinal,
6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         int finger_count)
6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : MouseEvent(type, location, location, flags, 0),
6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      x_offset_(x_offset),
6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      y_offset_(y_offset),
6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      x_offset_ordinal_(x_offset_ordinal),
6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      y_offset_ordinal_(y_offset_ordinal),
6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      finger_count_(finger_count) {
6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  set_time_stamp(time_stamp);
6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  CHECK(IsScrollEvent());
6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollEvent::Scale(const float factor) {
7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  x_offset_ *= factor;
7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  y_offset_ *= factor;
7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  x_offset_ordinal_ *= factor;
7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  y_offset_ordinal_ *= factor;
7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GestureEvent
7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::GestureEvent(EventType type,
7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           float x,
7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           float y,
7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           int flags,
7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           base::TimeDelta time_stamp,
7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           const GestureEventDetails& details,
7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           unsigned int touch_ids_bitfield)
7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : LocatedEvent(type,
7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   gfx::PointF(x, y),
7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                   gfx::PointF(x, y),
7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   time_stamp,
7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                   flags | EF_FROM_TOUCH),
7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      details_(details),
7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      touch_ids_bitfield_(touch_ids_bitfield) {
7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::~GestureEvent() {
7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GestureEvent::GetLowestTouchId() const {
7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (touch_ids_bitfield_ == 0)
7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return -1;
7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int i = -1;
7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Find the index of the least significant 1 bit
7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (!(1 << ++i & touch_ids_bitfield_));
7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return i;
7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
739