event.cc revision 6d86b77056ed63eb6871182f42a9fd5f07550f90
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include <X11/extensions/XInput2.h> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <X11/Xlib.h> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cmath> 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <cstring> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/metrics/histogram.h" 165e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)#include "base/strings/stringprintf.h" 17d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_utils.h" 18d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point3_f.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point_conversions.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/transform.h" 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/transform_util.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 25d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion_x.h" 26a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#elif defined(USE_OZONE) 27a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)std::string EventTypeName(ui::EventType type) { 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define RETURN_IF_TYPE(t) if (type == ui::t) return #t 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CASE_TYPE(t) case ui::t: return #t 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) switch (type) { 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_UNKNOWN); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_PRESSED); 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_DRAGGED); 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_RELEASED); 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_MOVED); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_ENTERED); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_EXITED); 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_KEY_PRESSED); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_KEY_RELEASED); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSEWHEEL); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_MOUSE_CAPTURE_CHANGED); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_RELEASED); 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_PRESSED); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_MOVED); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TOUCH_CANCELLED); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_DROP_TARGET_EVENT); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TRANSLATED_KEY_PRESS); 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_TRANSLATED_KEY_RELEASE); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_SCROLL_BEGIN); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_SCROLL_END); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_SCROLL_UPDATE); 571e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) CASE_TYPE(ET_GESTURE_SHOW_PRESS); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) CASE_TYPE(ET_GESTURE_WIN8_EDGE_SWIPE); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP); 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP_DOWN); 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP_CANCEL); 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_BEGIN); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_END); 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_TWO_FINGER_TAP); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_PINCH_BEGIN); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_PINCH_END); 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_PINCH_UPDATE); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_LONG_PRESS); 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_GESTURE_LONG_TAP); 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) CASE_TYPE(ET_GESTURE_SWIPE); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CASE_TYPE(ET_GESTURE_TAP_UNCONFIRMED); 72a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CASE_TYPE(ET_GESTURE_DOUBLE_TAP); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_SCROLL); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_SCROLL_FLING_START); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_SCROLL_FLING_CANCEL); 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CASE_TYPE(ET_CANCEL_MODE); 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch CASE_TYPE(ET_UMA_DATA); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case ui::ET_LAST: NOTREACHED(); return std::string(); 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Don't include default, so that we get an error when new type is added. 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#undef CASE_TYPE 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED(); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return std::string(); 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool IsX11SendEventTrue(const base::NativeEvent& event) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#if defined(USE_X11) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event && event->xany.send_event) 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::~Event() { 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_native_event_) 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ReleaseCopiedNativeEvent(native_event_); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Event::HasNativeEvent() const { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::NativeEvent null_event; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::memset(&null_event, 0, sizeof(null_event)); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!std::memcmp(&native_event_, &null_event, sizeof(null_event)); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::StopPropagation() { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH); 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(cancelable_); 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_ = static_cast<EventResult>(result_ | ER_CONSUMED); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetHandled() { 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events. 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH); 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(cancelable_); 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_ = static_cast<EventResult>(result_ | ER_HANDLED); 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(EventType type, base::TimeDelta time_stamp, int flags) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(time_stamp), 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(flags), 1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_event_(base::NativeEvent()), 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_native_event_(false), 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(ER_UNHANDLED) { 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const base::NativeEvent& native_event, 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventType type, 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(EventTimeFromNative(native_event)), 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(flags), 1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_event_(native_event), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_native_event_(false), 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(ER_UNHANDLED) { 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta delta = EventTimeForNow() - time_stamp_; 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser", 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delta.InMicroseconds(), 1, 1000000, 100); 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name_for_event = 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("Event.Latency.Browser.%s", name_.c_str()); 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase* counter_for_type = 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Histogram::FactoryGet( 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_for_event, 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1000000, 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100, 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase::kUmaTargetedHistogramFlag); 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) counter_for_type->Add(delta.InMicroseconds()); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const Event& copy) 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : type_(copy.type_), 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(copy.time_stamp_), 1757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) latency_(copy.latency_), 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(copy.flags_), 1775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_event_(CopyNativeEvent(copy.native_event_)), 1785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete_native_event_(true), 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(ER_UNHANDLED) { 1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetType(EventType type) { 1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = std::string(); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = type; 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CancelModeEvent 1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::CancelModeEvent() 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Event(ET_CANCEL_MODE, base::TimeDelta(), 0) { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_cancelable(false); 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::~CancelModeEvent() { 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocatedEvent 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::~LocatedEvent() { 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(const base::NativeEvent& native_event) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(native_event, 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTypeFromNative(native_event), 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventFlagsFromNative(native_event)), 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_(EventLocationFromNative(native_event)), 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_location_(location_) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(EventType type, 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& root_location, 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(type, time_stamp, flags), 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_(location), 227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_location_(root_location) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocatedEvent::UpdateForRootTransform( 2312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& reversed_root_transform) { 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transform has to be done at root level. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point3F p(location_); 234d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) reversed_root_transform.TransformPoint(&p); 2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) location_ = p.AsPointF(); 2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_location_ = location_; 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(const base::NativeEvent& native_event) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(native_event), 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changed_button_flags_( 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetChangedMouseButtonFlagsFromNative(native_event)) { 246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() == ET_MOUSE_PRESSED || type() == ET_MOUSE_RELEASED) 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetClickCount(GetRepeatCount(*this)); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(EventType type, 2515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& root_location, 2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int flags, 2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int changed_button_flags) 2552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LocatedEvent(type, location, root_location, EventTimeForNow(), flags), 2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) changed_button_flags_(changed_button_flags) { 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (this->type() == ET_MOUSE_MOVED && IsAnyButton()) 2582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(ET_MOUSE_DRAGGED); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MouseEvent::IsRepeatedClickEvent( 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MouseEvent& event1, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MouseEvent& event2) { 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These values match the Windows defaults. 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickTimeMS = 500; 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickWidth = 4; 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickHeight = 4; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event1.type() != ET_MOUSE_PRESSED || 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event2.type() != ET_MOUSE_PRESSED) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compare flags, but ignore EF_IS_DOUBLE_CLICK to allow triple clicks. 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((event1.flags() & ~EF_IS_DOUBLE_CLICK) != 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event2.flags() & ~EF_IS_DOUBLE_CLICK)) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_difference = event2.time_stamp() - event1.time_stamp(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (time_difference.InMilliseconds() > kDoubleClickTimeMS) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 284a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (std::abs(event2.x() - event1.x()) > kDoubleClickWidth / 2) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 287a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (std::abs(event2.y() - event1.y()) > kDoubleClickHeight / 2) 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetRepeatCount(const MouseEvent& event) { 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int click_count = 1; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_click_event_) { 297d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (event.type() == ui::ET_MOUSE_RELEASED) 298d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) return last_click_event_->GetClickCount(); 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsX11SendEventTrue(event.native_event())) 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) click_count = last_click_event_->GetClickCount(); 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) else if (IsRepeatedClickEvent(*last_click_event_, event)) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) click_count = last_click_event_->GetClickCount() + 1; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete last_click_event_; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_event_ = new MouseEvent(event); 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (click_count > 3) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) click_count = 3; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_event_->SetClickCount(click_count); 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return click_count; 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent* MouseEvent::last_click_event_ = NULL; 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetClickCount() const { 316d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED) 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags() & EF_IS_TRIPLE_CLICK) 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 3; 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (flags() & EF_IS_DOUBLE_CLICK) 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MouseEvent::SetClickCount(int click_count) { 328d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED) 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(click_count > 0); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(click_count <= 3); 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int f = flags(); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (click_count) { 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_DOUBLE_CLICK; 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_TRIPLE_CLICK; 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f |= EF_IS_DOUBLE_CLICK; 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_TRIPLE_CLICK; 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_DOUBLE_CLICK; 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f |= EF_IS_TRIPLE_CLICK; 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(f); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseWheelEvent 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const base::NativeEvent& native_event) 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(native_event), 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_(GetMouseWheelOffset(native_event)) { 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const ScrollEvent& scroll_event) 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(scroll_event), 362c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) offset_(scroll_event.x_offset(), scroll_event.y_offset()){ 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(ET_MOUSEWHEEL); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 366c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const MouseEvent& mouse_event, 367c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int x_offset, 368c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int y_offset) 369c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : MouseEvent(mouse_event), offset_(x_offset, y_offset) { 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type() == ET_MOUSEWHEEL); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 373eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMouseWheelEvent::MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event) 374eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : MouseEvent(mouse_wheel_event), 375eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_(mouse_wheel_event.offset()) { 376eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(type() == ET_MOUSEWHEEL); 377eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 378eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches windows WHEEL_DELTA. 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 120; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches GTK+ wheel scroll amount. 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 53; 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 388eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MouseWheelEvent::UpdateForRootTransform( 389eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Transform& inverted_root_transform) { 390eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LocatedEvent::UpdateForRootTransform(inverted_root_transform); 391eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::DecomposedTransform decomp; 392eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform); 393eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(success); 394eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decomp.scale[0]) 395eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_.set_x(offset_.x() * decomp.scale[0]); 396eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decomp.scale[1]) 397eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_.set_y(offset_.y() * decomp.scale[1]); 398eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 399eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(const base::NativeEvent& native_event) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(native_event), 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(GetTouchId(native_event)), 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(GetTouchRadiusX(native_event)), 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(GetTouchRadiusY(native_event)), 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(GetTouchAngle(native_event)), 4095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_(GetTouchForce(native_event)), 4105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_device_id_(-1) { 4115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumberWithTimestamp( 4125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 4135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 4145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 4155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks::FromInternalValue(time_stamp().ToInternalValue()), 4165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 4175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_X11) 4195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(native_event->xcookie.data); 4205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_device_id_ = xiev->deviceid; 4215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 4225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type, 4275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int touch_id, 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp) 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(type, location, location, time_stamp, 0), 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(touch_id), 4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(0.0f), 4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(0.0f), 4345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(0.0f), 4355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_(0.0f), 4365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_device_id_(-1) { 4375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type, 4415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int touch_id, 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float radius_x, 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float radius_y, 4475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float angle, 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float force) 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(type, location, location, time_stamp, flags), 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(touch_id), 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(radius_x), 4525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(radius_y), 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(angle), 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_(force), 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_device_id_(-1) { 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::~TouchEvent() { 460a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // In ctor TouchEvent(native_event) we call GetTouchId() which in X11 461a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // platform setups the tracking_id to slot mapping. So in dtor here, 462a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // if this touch event is a release event, we clear the mapping accordingly. 463a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (HasNativeEvent()) 464a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ClearTouchIdIfReleased(native_event()); 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 467c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEvent::UpdateForRootTransform( 468c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Transform& inverted_root_transform) { 469c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LocatedEvent::UpdateForRootTransform(inverted_root_transform); 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::DecomposedTransform decomp; 471c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform); 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(success); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decomp.scale[0]) 474c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) radius_x_ *= decomp.scale[0]; 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decomp.scale[1]) 476c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) radius_y_ *= decomp.scale[1]; 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeyEvent 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static 48346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)KeyEvent* KeyEvent::last_key_event_ = NULL; 48446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 48546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static 48646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool KeyEvent::IsRepeated(const KeyEvent& event) { 48746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // A safe guard in case if there were continous key pressed events that are 48846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // not auto repeat. 48946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const int kMaxAutoRepeatTimeMs = 2000; 49046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 49146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (event.is_char()) 49246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 49346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (event.type() == ui::ET_KEY_RELEASED) { 49446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delete last_key_event_; 49546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_key_event_ = NULL; 49646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 49746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 49846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CHECK_EQ(ui::ET_KEY_PRESSED, event.type()); 49946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!last_key_event_) { 50046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_key_event_ = new KeyEvent(event); 50146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 50246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 50346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (event.key_code() == last_key_event_->key_code() && 50446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) event.flags() == last_key_event_->flags() && 50546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) (event.time_stamp() - last_key_event_->time_stamp()).InMilliseconds() < 50646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kMaxAutoRepeatTimeMs) { 50746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 50846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 50946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delete last_key_event_; 51046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_key_event_ = new KeyEvent(event); 51146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 51246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 51346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(const base::NativeEvent& native_event, bool is_char) 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(native_event, 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTypeFromNative(native_event), 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventFlagsFromNative(native_event)), 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code_(KeyboardCodeFromNative(native_event)), 519a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) code_(CodeFromNative(native_event)), 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_char_(is_char), 521f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) platform_keycode_(PlatformKeycodeFromNative(native_event)), 5224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) character_(0) { 52346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (IsRepeated(*this)) 52446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) set_flags(flags() | ui::EF_IS_REPEAT); 52546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 5275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NormalizeFlags(); 5285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(EventType type, 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyboardCode key_code, 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_char) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Event(type, EventTimeForNow(), flags), 5365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code_(key_code), 5375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_char_(is_char), 538f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) platform_keycode_(0), 5394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) character_(GetCharacterFromKeyCode(key_code, flags)) { 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 542a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)KeyEvent::KeyEvent(EventType type, 543a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) KeyboardCode key_code, 544a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& code, 545a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int flags, 546a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_char) 547a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : Event(type, EventTimeForNow(), flags), 548a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) key_code_(key_code), 549a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) code_(code), 550a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_char_(is_char), 551f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) platform_keycode_(0), 552a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) character_(GetCharacterFromKeyCode(key_code, flags)) { 553a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 554a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 KeyEvent::GetCharacter() const { 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (character_) 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return character_; 5585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 5605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (native_event().message == WM_CHAR) ? key_code_ : 5615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCharacterFromKeyCode(key_code_, flags()); 5625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11) 5635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!native_event()) 5645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetCharacterFromKeyCode(key_code_, flags()); 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(native_event()->type == KeyPress || 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event()->type == KeyRelease); 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5696d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // When a control key is held, prefer ASCII characters to non ASCII 5706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // characters in order to use it for shortcut keys. GetCharacterFromKeyCode 5716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11. 5726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // GetCharacterFromXEvent returns 'à' in that case. 5736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return IsControlDown() ? 5746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GetCharacterFromKeyCode(key_code_, flags()) : 5756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GetCharacterFromXEvent(native_event()); 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 577a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (native_event()) { 578a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED || 579a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EventTypeFromNative(native_event()) == ET_KEY_RELEASED); 580a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 5815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetCharacterFromKeyCode(key_code_, flags()); 5835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool KeyEvent::IsUnicodeKeyCode() const { 587a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_WIN) 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsAltDown()) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int key = key_code(); 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key >= VKEY_NUMPAD0 && key <= VKEY_NUMPAD9) 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check whether the user is using the numeric keypad with num-lock off. 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In that case, EF_EXTENDED will not be set; if it is set, the key event 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // originated from the relevant non-numpad dedicated key, e.g. [Insert]. 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (!(flags() & EF_EXTENDED) && 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (key == VKEY_INSERT || key == VKEY_END || key == VKEY_DOWN || 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_NEXT || key == VKEY_LEFT || key == VKEY_CLEAR || 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_RIGHT || key == VKEY_HOME || key == VKEY_UP || 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_PRIOR)); 601a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else 602a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 603a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEvent::NormalizeFlags() { 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mask = 0; 6085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (key_code()) { 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_CONTROL: 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_CONTROL_DOWN; 6115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_SHIFT: 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_SHIFT_DOWN; 6145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_MENU: 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_ALT_DOWN; 6175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_CAPITAL: 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_CAPS_LOCK_DOWN; 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type() == ET_KEY_PRESSED) 6255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(flags() | mask); 6265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(flags() & ~mask); 6285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 630cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool KeyEvent::IsTranslated() const { 631cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (type()) { 632cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_PRESSED: 633cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_RELEASED: 634cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 635cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_PRESS: 636cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_RELEASE: 637cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 638cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 639cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 640cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 641cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 6425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 644cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void KeyEvent::SetTranslated(bool translated) { 645cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (type()) { 646cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_PRESSED: 647cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_PRESS: 648cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetType(translated ? ET_TRANSLATED_KEY_PRESS : ET_KEY_PRESSED); 649cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 650cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_RELEASED: 651cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_RELEASE: 652cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetType(translated ? ET_TRANSLATED_KEY_RELEASE : ET_KEY_RELEASED); 653cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 654cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 655cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 656cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 6575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollEvent 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollEvent::ScrollEvent(const base::NativeEvent& native_event) 6635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(native_event) { 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type() == ET_SCROLL) { 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetScrollOffsets(native_event, 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_, &y_offset_, 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_ordinal_, &y_offset_ordinal_, 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &finger_count_); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type() == ET_SCROLL_FLING_START || 6702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type() == ET_SCROLL_FLING_CANCEL) { 6712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFlingData(native_event, 6722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_, &y_offset_, 6732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_ordinal_, &y_offset_ordinal_, 6742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL); 6752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 6762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unexpected event type " << type() 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " when constructing a ScrollEvent."; 6785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollEvent::ScrollEvent(EventType type, 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta time_stamp, 6842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int flags, 6852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float x_offset, 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float y_offset, 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float x_offset_ordinal, 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float y_offset_ordinal, 6892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int finger_count) 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : MouseEvent(type, location, location, flags, 0), 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_(x_offset), 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_(y_offset), 6932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ordinal_(x_offset_ordinal), 6942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ordinal_(y_offset_ordinal), 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) finger_count_(finger_count) { 6962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_time_stamp(time_stamp); 6972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(IsScrollEvent()); 6982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollEvent::Scale(const float factor) { 7012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ *= factor; 7022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ *= factor; 7032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ordinal_ *= factor; 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ordinal_ *= factor; 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GestureEvent 7095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::GestureEvent(EventType type, 7115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float x, 7125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float y, 7135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 7145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 7155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GestureEventDetails& details, 7165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int touch_ids_bitfield) 7172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LocatedEvent(type, 7185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::PointF(x, y), 7195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::PointF(x, y), 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_stamp, 7212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flags | EF_FROM_TOUCH), 7225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details_(details), 7235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_ids_bitfield_(touch_ids_bitfield) { 7245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::~GestureEvent() { 7275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GestureEvent::GetLowestTouchId() const { 7305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch_ids_bitfield_ == 0) 7315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 7325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = -1; 7335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the index of the least significant 1 bit 7345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!(1 << ++i & touch_ids_bitfield_)); 7355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 7365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 739