event.cc revision d0247b1b59f9c528cb6df88b4f2b9afaf80d181e
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) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 155e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 16d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point3_f.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point_conversions.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform_util.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 24d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion_x.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::NativeEvent CopyNativeEvent(const base::NativeEvent& event) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!event || event->type == GenericEvent) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XEvent* copy = new XEvent; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *copy = *event; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(OS_WIN) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return event; 38eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#elif defined(USE_OZONE) 39d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return NULL; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTREACHED() << 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "Don't know how to copy base::NativeEvent for this platform"; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return NULL; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Point CalibratePoint(const gfx::Point& point, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& from, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& to) { 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float calibrated_x = 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<float>(point.x()) * to.width() / from.width(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float calibrated_y = 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<float>(point.y()) * to.height() / from.height(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return gfx::Point(static_cast<int>(floorf(calibrated_x + 0.5f)), 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<int>(floorf(calibrated_y + 0.5f))); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string EventTypeName(ui::EventType type) { 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define RETURN_IF_TYPE(t) if (type == ui::t) return #t 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CASE_TYPE(t) case ui::t: return #t 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (type) { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_UNKNOWN); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_PRESSED); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_DRAGGED); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_RELEASED); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_MOVED); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_ENTERED); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_EXITED); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_KEY_PRESSED); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_KEY_RELEASED); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSEWHEEL); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_CAPTURE_CHANGED); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_RELEASED); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_PRESSED); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_MOVED); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_STATIONARY); 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_CANCELLED); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_DROP_TARGET_EVENT); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TRANSLATED_KEY_PRESS); 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TRANSLATED_KEY_RELEASE); 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_SCROLL_BEGIN); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_SCROLL_END); 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_SCROLL_UPDATE); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP_DOWN); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP_CANCEL); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_BEGIN); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_END); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TWO_FINGER_TAP); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_PINCH_BEGIN); 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_PINCH_END); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_PINCH_UPDATE); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_LONG_PRESS); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_LONG_TAP); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_MULTIFINGER_SWIPE); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_SCROLL); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_SCROLL_FLING_START); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_SCROLL_FLING_CANCEL); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_CANCEL_MODE); 100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CASE_TYPE(ET_UMA_DATA); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ui::ET_LAST: NOTREACHED(); return std::string(); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't include default, so that we get an error when new type is added. 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#undef CASE_TYPE 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::string(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsX11SendEventTrue(const base::NativeEvent& event) { 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_X11) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event && event->xany.send_event) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::~Event() { 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_native_event_) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete native_event_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Event::HasNativeEvent() const { 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::NativeEvent null_event; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::memset(&null_event, 0, sizeof(null_event)); 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!std::memcmp(&native_event_, &null_event, sizeof(null_event)); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::StopPropagation() { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events. 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH); 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(cancelable_); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_ = static_cast<EventResult>(result_ | ER_CONSUMED); 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetHandled() { 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events. 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH); 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(cancelable_); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_ = static_cast<EventResult>(result_ | ER_HANDLED); 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(EventType type, base::TimeDelta time_stamp, int flags) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(time_stamp), 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(flags), 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dispatch_to_hidden_targets_(false), 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(USE_X11) 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) native_event_(NULL), 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_native_event_(false), 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(ER_UNHANDLED) { 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const base::NativeEvent& native_event, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventType type, 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(EventTimeFromNative(native_event)), 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(flags), 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dispatch_to_hidden_targets_(false), 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_native_event_(false), 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(ER_UNHANDLED) { 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta delta = EventTimeForNow() - time_stamp_; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser", 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) delta.InMicroseconds(), 0, 1000000, 100); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name_for_event = 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("Event.Latency.Browser.%s", name_.c_str()); 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase* counter_for_type = 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Histogram::FactoryGet( 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_for_event, 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0, 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1000000, 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100, 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase::kUmaTargetedHistogramFlag); 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) counter_for_type->Add(delta.InMicroseconds()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitWithNativeEvent(native_event); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const Event& copy) 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : type_(copy.type_), 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(copy.time_stamp_), 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) latency_(copy.latency_), 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(copy.flags_), 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dispatch_to_hidden_targets_(false), 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) native_event_(::CopyNativeEvent(copy.native_event_)), 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_native_event_(false), 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(ER_UNHANDLED) { 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (native_event_) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_native_event_ = true; 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetType(EventType type) { 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 2242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = std::string(); 2252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = type; 2262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 2272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 2282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Event::Init() { 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::memset(&native_event_, 0, sizeof(native_event_)); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Event::InitWithNativeEvent(const base::NativeEvent& native_event) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event_ = native_event; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)void Event::InitLatencyInfo() { 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) latency_.AddLatencyNumberWithTimestamp(INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 0, 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) base::TimeTicks::FromInternalValue( 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) time_stamp_.ToInternalValue()), 2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1); 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) latency_.AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CancelModeEvent 2502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::CancelModeEvent() 2522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Event(ET_CANCEL_MODE, base::TimeDelta(), 0) { 2532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_cancelable(false); 2542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::~CancelModeEvent() { 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocatedEvent 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::~LocatedEvent() { 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(const base::NativeEvent& native_event) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(native_event, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTypeFromNative(native_event), 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventFlagsFromNative(native_event)), 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_(EventLocationFromNative(native_event)), 270c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_location_(location_) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(EventType type, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& root_location, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(type, time_stamp, flags), 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_(location), 280c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_location_(root_location) { 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocatedEvent::UpdateForRootTransform( 2842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& reversed_root_transform) { 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transform has to be done at root level. 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point3F p(location_); 287d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) reversed_root_transform.TransformPoint(&p); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) root_location_ = location_ = gfx::ToFlooredPoint(p.AsPointF()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(const base::NativeEvent& native_event) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(native_event), 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changed_button_flags_( 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetChangedMouseButtonFlagsFromNative(native_event)) { 298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() == ET_MOUSE_PRESSED || type() == ET_MOUSE_RELEASED) 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetClickCount(GetRepeatCount(*this)); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(EventType type, 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location, 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& root_location, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LocatedEvent(type, location, root_location, EventTimeForNow(), flags), 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changed_button_flags_(0) { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (this->type() == ET_MOUSE_MOVED && IsAnyButton()) 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(ET_MOUSE_DRAGGED); 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MouseEvent::IsRepeatedClickEvent( 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MouseEvent& event1, 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MouseEvent& event2) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These values match the Windows defaults. 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickTimeMS = 500; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickWidth = 4; 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickHeight = 4; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event1.type() != ET_MOUSE_PRESSED || 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event2.type() != ET_MOUSE_PRESSED) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compare flags, but ignore EF_IS_DOUBLE_CLICK to allow triple clicks. 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((event1.flags() & ~EF_IS_DOUBLE_CLICK) != 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event2.flags() & ~EF_IS_DOUBLE_CLICK)) 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_difference = event2.time_stamp() - event1.time_stamp(); 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (time_difference.InMilliseconds() > kDoubleClickTimeMS) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abs(event2.x() - event1.x()) > kDoubleClickWidth / 2) 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (abs(event2.y() - event1.y()) > kDoubleClickHeight / 2) 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetRepeatCount(const MouseEvent& event) { 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int click_count = 1; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_click_event_) { 348d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (event.type() == ui::ET_MOUSE_RELEASED) 349d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return last_click_event_->GetClickCount(); 3502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsX11SendEventTrue(event.native_event())) 3512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) click_count = last_click_event_->GetClickCount(); 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (IsRepeatedClickEvent(*last_click_event_, event)) 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) click_count = last_click_event_->GetClickCount() + 1; 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete last_click_event_; 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_event_ = new MouseEvent(event); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (click_count > 3) 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) click_count = 3; 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_event_->SetClickCount(click_count); 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return click_count; 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent* MouseEvent::last_click_event_ = NULL; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetClickCount() const { 367d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags() & EF_IS_TRIPLE_CLICK) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 3; 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (flags() & EF_IS_DOUBLE_CLICK) 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MouseEvent::SetClickCount(int click_count) { 379d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(click_count > 0); 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(click_count <= 3); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int f = flags(); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (click_count) { 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_DOUBLE_CLICK; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_TRIPLE_CLICK; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f |= EF_IS_DOUBLE_CLICK; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_TRIPLE_CLICK; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_DOUBLE_CLICK; 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f |= EF_IS_TRIPLE_CLICK; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(f); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseWheelEvent 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const base::NativeEvent& native_event) 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(native_event), 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_(GetMouseWheelOffset(native_event)) { 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const ScrollEvent& scroll_event) 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(scroll_event), 413c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) offset_(scroll_event.x_offset(), scroll_event.y_offset()){ 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(ET_MOUSEWHEEL); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 417c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const MouseEvent& mouse_event, 418c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int x_offset, 419c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int y_offset) 420c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : MouseEvent(mouse_event), offset_(x_offset, y_offset) { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type() == ET_MOUSEWHEEL); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMouseWheelEvent::MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event) 425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : MouseEvent(mouse_wheel_event), 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_(mouse_wheel_event.offset()) { 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(type() == ET_MOUSEWHEEL); 428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches windows WHEEL_DELTA. 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 120; 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches GTK+ wheel scroll amount. 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 53; 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MouseWheelEvent::UpdateForRootTransform( 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Transform& inverted_root_transform) { 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LocatedEvent::UpdateForRootTransform(inverted_root_transform); 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::DecomposedTransform decomp; 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform); 444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(success); 445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decomp.scale[0]) 446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_.set_x(offset_.x() * decomp.scale[0]); 447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decomp.scale[1]) 448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_.set_y(offset_.y() * decomp.scale[1]); 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 450eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(const base::NativeEvent& native_event) 4555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(native_event), 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(GetTouchId(native_event)), 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(GetTouchRadiusX(native_event)), 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(GetTouchRadiusY(native_event)), 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(GetTouchAngle(native_event)), 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_(GetTouchForce(native_event)) { 4617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitLatencyInfo(); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location, 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int touch_id, 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp) 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(type, location, location, time_stamp, 0), 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(touch_id), 4705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(0.0f), 4715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(0.0f), 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(0.0f), 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_(0.0f) { 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitLatencyInfo(); 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type, 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int touch_id, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float radius_x, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float radius_y, 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float angle, 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float force) 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(type, location, location, time_stamp, flags), 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(touch_id), 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(radius_x), 4895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(radius_y), 4905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(angle), 4915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) force_(force) { 4927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) InitLatencyInfo(); 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)), 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_char_(is_char), 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) character_(0), 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unmodified_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), 5435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) character_(GetCharacterFromKeyCode(key_code, flags)), 5445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unmodified_character_(0) { 5455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 KeyEvent::GetCharacter() const { 5485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (character_) 5495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return character_; 5505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 5525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (native_event().message == WM_CHAR) ? key_code_ : 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCharacterFromKeyCode(key_code_, flags()); 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!native_event()) 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetCharacterFromKeyCode(key_code_, flags()); 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(native_event()->type == KeyPress || 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event()->type == KeyRelease); 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16 ch = 0; 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsControlDown()) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ch = GetCharacterFromXEvent(native_event()); 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ch ? ch : GetCharacterFromKeyCode(key_code_, flags()); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 KeyEvent::GetUnmodifiedCharacter() const { 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (unmodified_character_) 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return unmodified_character_; 5745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Looks like there is no way to get unmodified character on Windows. 5775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (native_event().message == WM_CHAR) ? key_code_ : 5785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCharacterFromKeyCode(key_code_, flags() & EF_SHIFT_DOWN); 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11) 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!native_event()) 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetCharacterFromKeyCode(key_code_, flags() & EF_SHIFT_DOWN); 5825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(native_event()->type == KeyPress || 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event()->type == KeyRelease); 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const unsigned int kIgnoredModifiers = ControlMask | LockMask | 5875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask; 5885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) XKeyEvent copy = native_event()->xkey; // bit-wise copy is safe. 5905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We can't use things like (native_event()->xkey.state & ShiftMask), as it 5915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // may mask out bits used by X11 internally. 5925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy.state &= ~kIgnoredModifiers; 5935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint16 ch = GetCharacterFromXEvent(reinterpret_cast<XEvent*>(©)); 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ch ? ch : GetCharacterFromKeyCode(key_code_, flags() & EF_SHIFT_DOWN); 595868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#elif defined(USE_OZONE) 596868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return is_char() ? key_code_ : GetCharacterFromKeyCode( 597868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) key_code_, flags() & EF_SHIFT_DOWN); 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NOTIMPLEMENTED(); 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KeyEvent* KeyEvent::Copy() const { 605d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(USE_OZONE) 606d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) KeyEvent* copy = new KeyEvent(*this); 607d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#else 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyEvent* copy = new KeyEvent(::CopyNativeEvent(native_event()), is_char()); 609d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif 6105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) copy->set_delete_native_event(true); 6125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return copy; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool KeyEvent::IsUnicodeKeyCode() const { 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsAltDown()) 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int key = key_code(); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key >= VKEY_NUMPAD0 && key <= VKEY_NUMPAD9) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check whether the user is using the numeric keypad with num-lock off. 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In that case, EF_EXTENDED will not be set; if it is set, the key event 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // originated from the relevant non-numpad dedicated key, e.g. [Insert]. 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (!(flags() & EF_EXTENDED) && 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (key == VKEY_INSERT || key == VKEY_END || key == VKEY_DOWN || 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_NEXT || key == VKEY_LEFT || key == VKEY_CLEAR || 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_RIGHT || key == VKEY_HOME || key == VKEY_UP || 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_PRIOR)); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEvent::NormalizeFlags() { 6335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mask = 0; 6345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (key_code()) { 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_CONTROL: 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_CONTROL_DOWN; 6375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_SHIFT: 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_SHIFT_DOWN; 6405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_MENU: 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_ALT_DOWN; 6435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_CAPITAL: 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_CAPS_LOCK_DOWN; 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 6485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type() == ET_KEY_PRESSED) 6515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(flags() | mask); 6525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(flags() & ~mask); 6545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TranslatedKeyEvent 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TranslatedKeyEvent::TranslatedKeyEvent(const base::NativeEvent& native_event, 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_char) 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : KeyEvent(native_event, is_char) { 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(type() == ET_KEY_PRESSED ? 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ET_TRANSLATED_KEY_PRESS : ET_TRANSLATED_KEY_RELEASE); 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TranslatedKeyEvent::TranslatedKeyEvent(bool is_press, 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyboardCode key_code, 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 6695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : KeyEvent((is_press ? ET_TRANSLATED_KEY_PRESS : ET_TRANSLATED_KEY_RELEASE), 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code, 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags, 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) false) { 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TranslatedKeyEvent::ConvertToKeyEvent() { 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(type() == ET_TRANSLATED_KEY_PRESS ? 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ET_KEY_PRESSED : ET_KEY_RELEASED); 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// DropTargetEvent 6825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)DropTargetEvent::DropTargetEvent(const OSExchangeData& data, 6845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& location, 6855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Point& root_location, 6865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int source_operations) 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LocatedEvent(ET_DROP_TARGET_EVENT, 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) location, 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) root_location, 6902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EventTimeForNow(), 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 0), 6925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) data_(data), 6935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) source_operations_(source_operations) { 6945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollEvent 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollEvent::ScrollEvent(const base::NativeEvent& native_event) 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(native_event) { 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type() == ET_SCROLL) { 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetScrollOffsets(native_event, 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_, &y_offset_, 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_ordinal_, &y_offset_ordinal_, 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &finger_count_); 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type() == ET_SCROLL_FLING_START || 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type() == ET_SCROLL_FLING_CANCEL) { 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFlingData(native_event, 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_, &y_offset_, 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_ordinal_, &y_offset_ordinal_, 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL); 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unexpected event type " << type() 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " when constructing a ScrollEvent."; 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollEvent::ScrollEvent(EventType type, 7192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Point& location, 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta time_stamp, 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int flags, 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float x_offset, 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float y_offset, 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float x_offset_ordinal, 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float y_offset_ordinal, 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int finger_count) 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : MouseEvent(type, location, location, flags), 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_(x_offset), 7292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_(y_offset), 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ordinal_(x_offset_ordinal), 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ordinal_(y_offset_ordinal), 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) finger_count_(finger_count) { 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_time_stamp(time_stamp); 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(IsScrollEvent()); 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollEvent::Scale(const float factor) { 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ *= factor; 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ *= factor; 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ordinal_ *= factor; 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ordinal_ *= factor; 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void ScrollEvent::UpdateForRootTransform( 745c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Transform& inverted_root_transform) { 746c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LocatedEvent::UpdateForRootTransform(inverted_root_transform); 7472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::DecomposedTransform decomp; 748c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform); 7492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(success); 7502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decomp.scale[0]) 751c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) x_offset_ordinal_ *= decomp.scale[0]; 7522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decomp.scale[1]) 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) y_offset_ordinal_ *= decomp.scale[1]; 7542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GestureEvent 7585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::GestureEvent(EventType type, 7605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int x, 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int y, 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GestureEventDetails& details, 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int touch_ids_bitfield) 7662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LocatedEvent(type, 7672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(x, y), 7682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Point(x, y), 7692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_stamp, 7702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flags | EF_FROM_TOUCH), 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details_(details), 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_ids_bitfield_(touch_ids_bitfield) { 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::~GestureEvent() { 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GestureEvent::GetLowestTouchId() const { 7795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch_ids_bitfield_ == 0) 7805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 7815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = -1; 7825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the index of the least significant 1 bit 7835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!(1 << ++i & touch_ids_bitfield_)); 7845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 7855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 788