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