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