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> 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <X11/keysym.h> 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 175e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point3_f.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point_conversions.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h" 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform_util.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 26d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion_x.h" 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(USE_OZONE) 28a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string EventTypeName(ui::EventType type) { 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define RETURN_IF_TYPE(t) if (type == ui::t) return #t 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CASE_TYPE(t) case ui::t: return #t 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (type) { 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_UNKNOWN); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_PRESSED); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_DRAGGED); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_RELEASED); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_MOVED); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_ENTERED); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_EXITED); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_KEY_PRESSED); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_KEY_RELEASED); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSEWHEEL); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_CAPTURE_CHANGED); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_RELEASED); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_PRESSED); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_MOVED); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_CANCELLED); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_DROP_TARGET_EVENT); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TRANSLATED_KEY_PRESS); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TRANSLATED_KEY_RELEASE); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_SCROLL_BEGIN); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_SCROLL_END); 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_SCROLL_UPDATE); 581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CASE_TYPE(ET_GESTURE_SHOW_PRESS); 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CASE_TYPE(ET_GESTURE_WIN8_EDGE_SWIPE); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP_DOWN); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP_CANCEL); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_BEGIN); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_END); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TWO_FINGER_TAP); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_PINCH_BEGIN); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_PINCH_END); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_PINCH_UPDATE); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_LONG_PRESS); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_LONG_TAP); 71cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CASE_TYPE(ET_GESTURE_SWIPE); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP_UNCONFIRMED); 73a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CASE_TYPE(ET_GESTURE_DOUBLE_TAP); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_SCROLL); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_SCROLL_FLING_START); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_SCROLL_FLING_CANCEL); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_CANCEL_MODE); 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CASE_TYPE(ET_UMA_DATA); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ui::ET_LAST: NOTREACHED(); return std::string(); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't include default, so that we get an error when new type is added. 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#undef CASE_TYPE 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::string(); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsX11SendEventTrue(const base::NativeEvent& event) { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_X11) 90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return event && event->xany.send_event; 91116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 92116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 94116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 95116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 96116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool X11EventHasNonStandardState(const base::NativeEvent& event) { 97116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(USE_X11) 98116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const unsigned int kAllStateMask = 99116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask | 100116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask | 101116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LockMask | ControlMask | AnyModifier; 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return event && (event->xkey.state & ~kAllStateMask) != 0; 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#else 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// static 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciscoped_ptr<Event> Event::Clone(const Event& event) { 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event.IsKeyEvent()) { 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<Event>(new KeyEvent(static_cast<const KeyEvent&>(event))); 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event.IsMouseEvent()) { 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event.IsMouseWheelEvent()) { 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<Event>( 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new MouseWheelEvent(static_cast<const MouseWheelEvent&>(event))); 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<Event>( 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new MouseEvent(static_cast<const MouseEvent&>(event))); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event.IsTouchEvent()) { 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<Event>( 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new TouchEvent(static_cast<const TouchEvent&>(event))); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event.IsGestureEvent()) { 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<Event>( 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new GestureEvent(static_cast<const GestureEvent&>(event))); 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (event.IsScrollEvent()) { 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<Event>( 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new ScrollEvent(static_cast<const ScrollEvent&>(event))); 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return scoped_ptr<Event>(new Event(event)); 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::~Event() { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_native_event_) 1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ReleaseCopiedNativeEvent(native_event_); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 154116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGestureEvent* Event::AsGestureEvent() { 155116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(IsGestureEvent()); 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return static_cast<GestureEvent*>(this); 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst GestureEvent* Event::AsGestureEvent() const { 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK(IsGestureEvent()); 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return static_cast<const GestureEvent*>(this); 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Event::HasNativeEvent() const { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::NativeEvent null_event; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::memset(&null_event, 0, sizeof(null_event)); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!std::memcmp(&native_event_, &null_event, sizeof(null_event)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::StopPropagation() { 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events. 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(cancelable_); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_ = static_cast<EventResult>(result_ | ER_CONSUMED); 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetHandled() { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events. 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(cancelable_); 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_ = static_cast<EventResult>(result_ | ER_HANDLED); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(EventType type, base::TimeDelta time_stamp, int flags) 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(time_stamp), 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(flags), 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_event_(base::NativeEvent()), 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_native_event_(false), 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result_(ER_UNHANDLED), 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch source_device_id_(ED_UNKNOWN_DEVICE) { 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const base::NativeEvent& native_event, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventType type, 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(EventTimeFromNative(native_event)), 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(flags), 2075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_event_(native_event), 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_native_event_(false), 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result_(ER_UNHANDLED), 213116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch source_device_id_(ED_UNKNOWN_DEVICE) { 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta delta = EventTimeForNow() - time_stamp_; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser", 2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delta.InMicroseconds(), 1, 1000000, 100); 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name_for_event = 2202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("Event.Latency.Browser.%s", name_.c_str()); 2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase* counter_for_type = 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Histogram::FactoryGet( 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_for_event, 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1000000, 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100, 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase::kUmaTargetedHistogramFlag); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) counter_for_type->Add(delta.InMicroseconds()); 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 230116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#if defined(USE_X11) 231116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (native_event->type == GenericEvent) { 232116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XIDeviceEvent* xiev = 233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static_cast<XIDeviceEvent*>(native_event->xcookie.data); 2341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci source_device_id_ = xiev->sourceid; 235116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 236116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const Event& copy) 240c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : type_(copy.type_), 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(copy.time_stamp_), 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) latency_(copy.latency_), 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(copy.flags_), 2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_event_(CopyNativeEvent(copy.native_event_)), 2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete_native_event_(true), 2462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch result_(ER_UNHANDLED), 250116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch source_device_id_(copy.source_device_id_) { 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetType(EventType type) { 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = std::string(); 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = type; 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 2612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CancelModeEvent 2652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::CancelModeEvent() 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Event(ET_CANCEL_MODE, base::TimeDelta(), 0) { 2682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_cancelable(false); 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::~CancelModeEvent() { 2722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocatedEvent 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::~LocatedEvent() { 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(const base::NativeEvent& native_event) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(native_event, 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTypeFromNative(native_event), 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventFlagsFromNative(native_event)), 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_(EventLocationFromNative(native_event)), 285c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_location_(location_) { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(EventType type, 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 2905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& root_location, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(type, time_stamp, flags), 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_(location), 295c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_location_(root_location) { 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocatedEvent::UpdateForRootTransform( 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& reversed_root_transform) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transform has to be done at root level. 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point3F p(location_); 302d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) reversed_root_transform.TransformPoint(&p); 3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) location_ = p.AsPointF(); 3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_location_ = location_; 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(const base::NativeEvent& native_event) 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(native_event), 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changed_button_flags_( 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetChangedMouseButtonFlagsFromNative(native_event)) { 314d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() == ET_MOUSE_PRESSED || type() == ET_MOUSE_RELEASED) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetClickCount(GetRepeatCount(*this)); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(EventType type, 3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 3205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& root_location, 3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int flags, 3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int changed_button_flags) 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LocatedEvent(type, location, root_location, EventTimeForNow(), flags), 3245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) changed_button_flags_(changed_button_flags) { 3252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (this->type() == ET_MOUSE_MOVED && IsAnyButton()) 3262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(ET_MOUSE_DRAGGED); 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MouseEvent::IsRepeatedClickEvent( 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MouseEvent& event1, 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MouseEvent& event2) { 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These values match the Windows defaults. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickTimeMS = 500; 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickWidth = 4; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickHeight = 4; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event1.type() != ET_MOUSE_PRESSED || 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event2.type() != ET_MOUSE_PRESSED) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compare flags, but ignore EF_IS_DOUBLE_CLICK to allow triple clicks. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((event1.flags() & ~EF_IS_DOUBLE_CLICK) != 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event2.flags() & ~EF_IS_DOUBLE_CLICK)) 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_difference = event2.time_stamp() - event1.time_stamp(); 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (time_difference.InMilliseconds() > kDoubleClickTimeMS) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (std::abs(event2.x() - event1.x()) > kDoubleClickWidth / 2) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (std::abs(event2.y() - event1.y()) > kDoubleClickHeight / 2) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetRepeatCount(const MouseEvent& event) { 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int click_count = 1; 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_click_event_) { 3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (event.type() == ui::ET_MOUSE_RELEASED) { 3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (event.changed_button_flags() == 3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) last_click_event_->changed_button_flags()) { 3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) last_click_complete_ = true; 3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return last_click_event_->GetClickCount(); 3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else { 3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // If last_click_event_ has changed since this button was pressed 3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // return a click count of 1. 3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) return click_count; 3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (event.time_stamp() != last_click_event_->time_stamp()) 3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) last_click_complete_ = true; 3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (!last_click_complete_ || 3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IsX11SendEventTrue(event.native_event())) { 3802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) click_count = last_click_event_->GetClickCount(); 3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } else if (IsRepeatedClickEvent(*last_click_event_, event)) { 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) click_count = last_click_event_->GetClickCount() + 1; 3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete last_click_event_; 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_event_ = new MouseEvent(event); 3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) last_click_complete_ = false; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (click_count > 3) 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) click_count = 3; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_event_->SetClickCount(click_count); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return click_count; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)void MouseEvent::ResetLastClickForTest() { 3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (last_click_event_) { 3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) delete last_click_event_; 3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) last_click_event_ = NULL; 3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) last_click_complete_ = false; 3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent* MouseEvent::last_click_event_ = NULL; 4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bool MouseEvent::last_click_complete_ = false; 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetClickCount() const { 407d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags() & EF_IS_TRIPLE_CLICK) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 3; 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (flags() & EF_IS_DOUBLE_CLICK) 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MouseEvent::SetClickCount(int click_count) { 419d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(click_count > 0); 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(click_count <= 3); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int f = flags(); 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (click_count) { 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_DOUBLE_CLICK; 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_TRIPLE_CLICK; 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f |= EF_IS_DOUBLE_CLICK; 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_TRIPLE_CLICK; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_DOUBLE_CLICK; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f |= EF_IS_TRIPLE_CLICK; 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(f); 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseWheelEvent 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const base::NativeEvent& native_event) 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(native_event), 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_(GetMouseWheelOffset(native_event)) { 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const ScrollEvent& scroll_event) 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(scroll_event), 453c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) offset_(scroll_event.x_offset(), scroll_event.y_offset()){ 4542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(ET_MOUSEWHEEL); 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 457c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const MouseEvent& mouse_event, 458c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int x_offset, 459c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int y_offset) 460c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : MouseEvent(mouse_event), offset_(x_offset, y_offset) { 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type() == ET_MOUSEWHEEL); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 464eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMouseWheelEvent::MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event) 465eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : MouseEvent(mouse_wheel_event), 466eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_(mouse_wheel_event.offset()) { 467eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(type() == ET_MOUSEWHEEL); 468eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 469eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 470116680a4aac90f2aa7413d9095a592090648e557Ben MurdochMouseWheelEvent::MouseWheelEvent(const gfx::Vector2d& offset, 471116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::PointF& location, 472116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const gfx::PointF& root_location, 473116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int flags, 474116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int changed_button_flags) 475116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : MouseEvent(ui::ET_MOUSEWHEEL, location, root_location, flags, 476116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch changed_button_flags), 477116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch offset_(offset) { 478116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 479116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches windows WHEEL_DELTA. 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 120; 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches GTK+ wheel scroll amount. 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 53; 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 489eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MouseWheelEvent::UpdateForRootTransform( 490eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Transform& inverted_root_transform) { 491eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LocatedEvent::UpdateForRootTransform(inverted_root_transform); 492eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::DecomposedTransform decomp; 493eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform); 494eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(success); 495eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decomp.scale[0]) 496eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_.set_x(offset_.x() * decomp.scale[0]); 497eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decomp.scale[1]) 498eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_.set_y(offset_.y() * decomp.scale[1]); 499eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 500eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 5025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent 5035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(const base::NativeEvent& native_event) 5055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(native_event), 5065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(GetTouchId(native_event)), 5075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(GetTouchRadiusX(native_event)), 5085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(GetTouchRadiusY(native_event)), 5095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(GetTouchAngle(native_event)), 510116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch force_(GetTouchForce(native_event)) { 5115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumberWithTimestamp( 5125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 5135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 5145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 5155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks::FromInternalValue(time_stamp().ToInternalValue()), 5165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 5175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 5185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) if (type() == ET_TOUCH_PRESSED) 5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) IncrementTouchIdRefCount(native_event); 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type, 5255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int touch_id, 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp) 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(type, location, location, time_stamp, 0), 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(touch_id), 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(0.0f), 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(0.0f), 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(0.0f), 533116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch force_(0.0f) { 5345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type, 5385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int touch_id, 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 5425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float radius_x, 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float radius_y, 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float angle, 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float force) 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(type, location, location, time_stamp, flags), 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(touch_id), 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(radius_x), 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(radius_y), 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(angle), 551116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch force_(force) { 5525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::~TouchEvent() { 556a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // In ctor TouchEvent(native_event) we call GetTouchId() which in X11 557a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // platform setups the tracking_id to slot mapping. So in dtor here, 558a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // if this touch event is a release event, we clear the mapping accordingly. 559a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (HasNativeEvent()) 560a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ClearTouchIdIfReleased(native_event()); 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 563c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEvent::UpdateForRootTransform( 564c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Transform& inverted_root_transform) { 565c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LocatedEvent::UpdateForRootTransform(inverted_root_transform); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::DecomposedTransform decomp; 567c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform); 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(success); 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decomp.scale[0]) 570c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) radius_x_ *= decomp.scale[0]; 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decomp.scale[1]) 572c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) radius_y_ *= decomp.scale[1]; 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeyEvent 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static 57946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)KeyEvent* KeyEvent::last_key_event_ = NULL; 58046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 58146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static 58246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool KeyEvent::IsRepeated(const KeyEvent& event) { 58346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // A safe guard in case if there were continous key pressed events that are 58446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // not auto repeat. 58546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const int kMaxAutoRepeatTimeMs = 2000; 586116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Ignore key events that have non standard state masks as it may be 587116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // reposted by an IME. IBUS-GTK uses this field to detect the 588116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // re-posted event for example. crbug.com/385873. 589116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (X11EventHasNonStandardState(event.native_event())) 590116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return false; 59146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (event.is_char()) 59246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 59346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (event.type() == ui::ET_KEY_RELEASED) { 59446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delete last_key_event_; 59546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_key_event_ = NULL; 59646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 59746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 59846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CHECK_EQ(ui::ET_KEY_PRESSED, event.type()); 59946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!last_key_event_) { 60046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_key_event_ = new KeyEvent(event); 60146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 60246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 60346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (event.key_code() == last_key_event_->key_code() && 60446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) event.flags() == last_key_event_->flags() && 60546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) (event.time_stamp() - last_key_event_->time_stamp()).InMilliseconds() < 60646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kMaxAutoRepeatTimeMs) { 60746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 60846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 60946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delete last_key_event_; 61046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_key_event_ = new KeyEvent(event); 61146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 61246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 61346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)KeyEvent::KeyEvent(const base::NativeEvent& native_event) 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(native_event, 6165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTypeFromNative(native_event), 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventFlagsFromNative(native_event)), 6185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code_(KeyboardCodeFromNative(native_event)), 619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) code_(CodeFromNative(native_event)), 6205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) is_char_(IsCharFromNative(native_event)), 621f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) platform_keycode_(PlatformKeycodeFromNative(native_event)), 6224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) character_(0) { 62346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (IsRepeated(*this)) 62446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) set_flags(flags() | ui::EF_IS_REPEAT); 62546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NormalizeFlags(); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(OS_WIN) 6301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Only Windows has native character events. 6311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (is_char_) 6321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci character_ = native_event.wParam; 6331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(EventType type, 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyboardCode key_code, 6385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int flags) 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Event(type, EventTimeForNow(), flags), 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code_(key_code), 6415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) is_char_(false), 642f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) platform_keycode_(0), 6431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci character_() { 6445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 646a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)KeyEvent::KeyEvent(EventType type, 647a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) KeyboardCode key_code, 648a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& code, 6495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int flags) 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : Event(type, EventTimeForNow(), flags), 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) key_code_(key_code), 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) code_(code), 6535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) is_char_(false), 654f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) platform_keycode_(0), 6551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci character_(0) { 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 6585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags) 6595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : Event(ET_KEY_PRESSED, EventTimeForNow(), flags), 6605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) key_code_(key_code), 6615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) code_(""), 6625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) is_char_(true), 66303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) platform_keycode_(0), 6645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) character_(character) { 6655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 6665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 66703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)KeyEvent::KeyEvent(const KeyEvent& rhs) 66803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) : Event(rhs), 66903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) key_code_(rhs.key_code_), 67003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) code_(rhs.code_), 67103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_char_(rhs.is_char_), 67203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) platform_keycode_(rhs.platform_keycode_), 67303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) character_(rhs.character_) { 67403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (rhs.extended_key_event_data_) 67503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); 67603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 67703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 67803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)KeyEvent& KeyEvent::operator=(const KeyEvent& rhs) { 67903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (this != &rhs) { 68003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) Event::operator=(rhs); 68103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) key_code_ = rhs.key_code_; 68203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) code_ = rhs.code_; 68303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) is_char_ = rhs.is_char_; 68403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) platform_keycode_ = rhs.platform_keycode_; 68503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) character_ = rhs.character_; 68603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 68703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) if (rhs.extended_key_event_data_) 68803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); 68903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) } 69003b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) return *this; 69103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 69203b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 69303b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)KeyEvent::~KeyEvent() {} 69403b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 69503b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)void KeyEvent::SetExtendedKeyEventData(scoped_ptr<ExtendedKeyEventData> data) { 69603b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) extended_key_event_data_ = data.Pass(); 69703b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)} 69803b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) 6995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)base::char16 KeyEvent::GetCharacter() const { 7001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (is_char_ || character_) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return character_; 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(kpschoedel): streamline these cases after settling Ozone 7041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // positional coding. 7055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 7061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Native Windows character events always have is_char_ == true, 7071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // so this is a synthetic or native keystroke event. 7081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci character_ = GetCharacterFromKeyCode(key_code_, flags()); 7091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return character_; 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11) 7111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!native_event()) { 7121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci character_ = GetCharacterFromKeyCode(key_code_, flags()); 7131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return character_; 7141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(native_event()->type == KeyPress || 717116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_event()->type == KeyRelease || 718116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (native_event()->type == GenericEvent && 719116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch (native_event()->xgeneric.evtype == XI_KeyPress || 720116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch native_event()->xgeneric.evtype == XI_KeyRelease))); 7215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // When a control key is held, prefer ASCII characters to non ASCII 7236d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // characters in order to use it for shortcut keys. GetCharacterFromKeyCode 7246d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11. 7256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // GetCharacterFromXEvent returns 'à' in that case. 7266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return IsControlDown() ? 7276d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GetCharacterFromKeyCode(key_code_, flags()) : 7286d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GetCharacterFromXEvent(native_event()); 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 730a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (native_event()) { 731a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED || 732a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EventTypeFromNative(native_event()) == ET_KEY_RELEASED); 733a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetCharacterFromKeyCode(key_code_, flags()); 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::char16 KeyEvent::GetText() const { 7401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if ((flags() & EF_CONTROL_DOWN) != 0) { 7411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return GetControlCharacterForKeycode(key_code_, 7421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (flags() & EF_SHIFT_DOWN) != 0); 7431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 7441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return GetUnmodifiedText(); 7451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 7461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibase::char16 KeyEvent::GetUnmodifiedText() const { 7481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!is_char_ && (key_code_ == VKEY_RETURN)) 7491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return '\r'; 7501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return GetCharacter(); 7511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 7521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 7532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool KeyEvent::IsUnicodeKeyCode() const { 754a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_WIN) 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsAltDown()) 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 7572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int key = key_code(); 7582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key >= VKEY_NUMPAD0 && key <= VKEY_NUMPAD9) 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check whether the user is using the numeric keypad with num-lock off. 7612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In that case, EF_EXTENDED will not be set; if it is set, the key event 7622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // originated from the relevant non-numpad dedicated key, e.g. [Insert]. 7632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (!(flags() & EF_EXTENDED) && 7642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (key == VKEY_INSERT || key == VKEY_END || key == VKEY_DOWN || 7652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_NEXT || key == VKEY_LEFT || key == VKEY_CLEAR || 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_RIGHT || key == VKEY_HOME || key == VKEY_UP || 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_PRIOR)); 768a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else 769a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 770a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 7712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEvent::NormalizeFlags() { 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mask = 0; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (key_code()) { 7762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_CONTROL: 7772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_CONTROL_DOWN; 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_SHIFT: 7802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_SHIFT_DOWN; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_MENU: 7832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_ALT_DOWN; 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_CAPITAL: 7862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_CAPS_LOCK_DOWN; 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 7885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 7895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 7905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type() == ET_KEY_PRESSED) 7925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(flags() | mask); 7935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 7945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(flags() & ~mask); 7955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 797cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool KeyEvent::IsTranslated() const { 798cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (type()) { 799cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_PRESSED: 800cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_RELEASED: 801cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 802cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_PRESS: 803cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_RELEASE: 804cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 805cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 806cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 807cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 808cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 8095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 8105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 811cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void KeyEvent::SetTranslated(bool translated) { 812cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (type()) { 813cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_PRESSED: 814cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_PRESS: 815cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetType(translated ? ET_TRANSLATED_KEY_PRESS : ET_KEY_PRESSED); 816cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 817cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_RELEASED: 818cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_RELEASE: 819cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetType(translated ? ET_TRANSLATED_KEY_RELEASE : ET_KEY_RELEASED); 820cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 821cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 822cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 823cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 8245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccibool KeyEvent::IsRightSideKey() const { 8271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (key_code_) { 8281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_CONTROL: 8291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_SHIFT: 8301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_MENU: 8311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_LWIN: 8321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#if defined(USE_X11) 8331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Under X11, setting code_ requires platform-dependent information, and 8341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // currently assumes that X keycodes are based on Linux evdev keycodes. 8351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // In certain test environments this is not the case, and code_ is not 8361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // set accurately, so we need a different mechanism. Fortunately X11 key 8371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // mapping preserves the left-right distinction, so testing keysyms works 8381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // if the value is available (as it is for all X11 native-based events). 8391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (platform_keycode_) { 8401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (platform_keycode_ == XK_Shift_R) || 8411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (platform_keycode_ == XK_Control_R) || 8421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (platform_keycode_ == XK_Alt_R) || 8431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (platform_keycode_ == XK_Meta_R) || 8441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (platform_keycode_ == XK_Super_R) || 8451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (platform_keycode_ == XK_Hyper_R); 8461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Fall through to the generic code if we have no platform_keycode_. 8481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Under X11, this must be a synthetic event, so we can require that 8491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // code_ be set correctly. 8501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#endif 8511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return ((code_.size() > 5) && 8521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci (code_.compare(code_.size() - 5, 5, "Right", 5)) == 0); 8531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 8541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return false; 8551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciKeyboardCode KeyEvent::GetLocatedWindowsKeyboardCode() const { 8591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci switch (key_code_) { 8601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_SHIFT: 8611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return IsRightSideKey() ? VKEY_RSHIFT : VKEY_LSHIFT; 8621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_CONTROL: 8631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return IsRightSideKey() ? VKEY_RCONTROL : VKEY_LCONTROL; 8641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_MENU: 8651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return IsRightSideKey() ? VKEY_RMENU : VKEY_LMENU; 8661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_LWIN: 8671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return IsRightSideKey() ? VKEY_RWIN : VKEY_LWIN; 8681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // TODO(kpschoedel): EF_NUMPAD_KEY is present only on X11. Currently this 8691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // function is only called on X11. Likely the tests here will be replaced 8701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // with a DOM-based code enumeration test in the course of Ozone 8711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // platform-indpendent key event work. 8721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_0: 8731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD0 : VKEY_0; 8741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_1: 8751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD1 : VKEY_1; 8761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_2: 8771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD2 : VKEY_2; 8781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_3: 8791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD3 : VKEY_3; 8801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_4: 8811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD4 : VKEY_4; 8821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_5: 8831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD5 : VKEY_5; 8841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_6: 8851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD6 : VKEY_6; 8861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_7: 8871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD7 : VKEY_7; 8881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_8: 8891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD8 : VKEY_8; 8901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci case VKEY_9: 8911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD9 : VKEY_9; 8921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci default: 8931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return key_code_; 8941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 8951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 8961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 8971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciuint16 KeyEvent::GetConflatedWindowsKeyCode() const { 8981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (is_char_) 8991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return character_; 9001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return key_code_; 9011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 9021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 9035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollEvent 9055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollEvent::ScrollEvent(const base::NativeEvent& native_event) 9075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(native_event) { 9085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type() == ET_SCROLL) { 9092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetScrollOffsets(native_event, 9102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_, &y_offset_, 9112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_ordinal_, &y_offset_ordinal_, 9122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &finger_count_); 9132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type() == ET_SCROLL_FLING_START || 9142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type() == ET_SCROLL_FLING_CANCEL) { 9152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFlingData(native_event, 9162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_, &y_offset_, 9172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_ordinal_, &y_offset_ordinal_, 9182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL); 9192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 9202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unexpected event type " << type() 9212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " when constructing a ScrollEvent."; 9225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 9235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollEvent::ScrollEvent(EventType type, 9265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 9272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta time_stamp, 9282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int flags, 9292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float x_offset, 9302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float y_offset, 9312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float x_offset_ordinal, 9322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float y_offset_ordinal, 9332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int finger_count) 9345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : MouseEvent(type, location, location, flags, 0), 9352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_(x_offset), 9362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_(y_offset), 9372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ordinal_(x_offset_ordinal), 9382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ordinal_(y_offset_ordinal), 9392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) finger_count_(finger_count) { 9402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_time_stamp(time_stamp); 9412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(IsScrollEvent()); 9422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollEvent::Scale(const float factor) { 9452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ *= factor; 9462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ *= factor; 9472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ordinal_ *= factor; 9482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ordinal_ *= factor; 9492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 9502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 9515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 9525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GestureEvent 9535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 954116680a4aac90f2aa7413d9095a592090648e557Ben MurdochGestureEvent::GestureEvent(float x, 9555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float y, 9565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 9575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 958116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const GestureEventDetails& details) 959116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch : LocatedEvent(details.type(), 9605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::PointF(x, y), 9615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::PointF(x, y), 9622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_stamp, 9632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flags | EF_FROM_TOUCH), 964116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch details_(details) { 9655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::~GestureEvent() { 9685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 9695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 9705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 971