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) 8908fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu return event && event->xany.send_event; 9008fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu#else 9108fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu return false; 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif 9308fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu} 9408fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu 9508fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liubool X11EventHasNonStandardState(const base::NativeEvent& event) { 9608fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu#if defined(USE_X11) 9708fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu const unsigned int kAllStateMask = 9808fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask | 9908fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask | ShiftMask | 10008fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu LockMask | ControlMask | AnyModifier; 10108fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu return event && (event->xkey.state & ~kAllStateMask) != 0; 10208fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu#else 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 10408fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu#endif 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Event 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::~Event() { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delete_native_event_) 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu ReleaseCopiedNativeEvent(native_event_); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Event::HasNativeEvent() const { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::NativeEvent null_event; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::memset(&null_event, 0, sizeof(null_event)); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return !!std::memcmp(&native_event_, &null_event, sizeof(null_event)); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::StopPropagation() { 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events. 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH); 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(cancelable_); 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_ = static_cast<EventResult>(result_ | ER_CONSUMED); 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetHandled() { 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // TODO(sad): Re-enable these checks once View uses dispatcher to dispatch 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // events. 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // CHECK(phase_ != EP_PREDISPATCH && phase_ != EP_POSTDISPATCH); 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(cancelable_); 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) result_ = static_cast<EventResult>(result_ | ER_HANDLED); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(EventType type, base::TimeDelta time_stamp, int flags) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(time_stamp), 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(flags), 1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_event_(base::NativeEvent()), 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete_native_event_(false), 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(ER_UNHANDLED) { 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const base::NativeEvent& native_event, 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventType type, 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : type_(type), 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(EventTimeFromNative(native_event)), 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(flags), 1615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_event_(native_event), 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) base::TimeDelta delta = EventTimeForNow() - time_stamp_; 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) UMA_HISTOGRAM_CUSTOM_COUNTS("Event.Latency.Browser", 1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delta.InMicroseconds(), 1, 1000000, 100); 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string name_for_event = 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::StringPrintf("Event.Latency.Browser.%s", name_.c_str()); 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase* counter_for_type = 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Histogram::FactoryGet( 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_for_event, 1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1000000, 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 100, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::HistogramBase::kUmaTargetedHistogramFlag); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) counter_for_type->Add(delta.InMicroseconds()); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Event::Event(const Event& copy) 185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : type_(copy.type_), 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) time_stamp_(copy.time_stamp_), 1877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) latency_(copy.latency_), 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) flags_(copy.flags_), 1895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu native_event_(CopyNativeEvent(copy.native_event_)), 1905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu delete_native_event_(true), 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) cancelable_(true), 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_(NULL), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) phase_(EP_PREDISPATCH), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_(ER_UNHANDLED) { 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void Event::SetType(EventType type) { 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = std::string(); 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type_ = type; 2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type_ < ET_LAST) 2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) name_ = EventTypeName(type_); 2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// CancelModeEvent 2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::CancelModeEvent() 2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Event(ET_CANCEL_MODE, base::TimeDelta(), 0) { 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_cancelable(false); 2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)CancelModeEvent::~CancelModeEvent() { 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 2172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// LocatedEvent 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::~LocatedEvent() { 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(const base::NativeEvent& native_event) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(native_event, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTypeFromNative(native_event), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventFlagsFromNative(native_event)), 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_(EventLocationFromNative(native_event)), 229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_location_(location_) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LocatedEvent::LocatedEvent(EventType type, 2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& root_location, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(type, time_stamp, flags), 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) location_(location), 239c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) root_location_(root_location) { 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LocatedEvent::UpdateForRootTransform( 2432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const gfx::Transform& reversed_root_transform) { 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Transform has to be done at root level. 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point3F p(location_); 246d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) reversed_root_transform.TransformPoint(&p); 2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) location_ = p.AsPointF(); 2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) root_location_ = location_; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseEvent 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(const base::NativeEvent& native_event) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(native_event), 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) changed_button_flags_( 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetChangedMouseButtonFlagsFromNative(native_event)) { 258d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() == ET_MOUSE_PRESSED || type() == ET_MOUSE_RELEASED) 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetClickCount(GetRepeatCount(*this)); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent::MouseEvent(EventType type, 2635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 2645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& root_location, 2655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int flags, 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int changed_button_flags) 2672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LocatedEvent(type, location, root_location, EventTimeForNow(), flags), 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) changed_button_flags_(changed_button_flags) { 2692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (this->type() == ET_MOUSE_MOVED && IsAnyButton()) 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(ET_MOUSE_DRAGGED); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MouseEvent::IsRepeatedClickEvent( 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MouseEvent& event1, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const MouseEvent& event2) { 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // These values match the Windows defaults. 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickTimeMS = 500; 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickWidth = 4; 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const int kDoubleClickHeight = 4; 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (event1.type() != ET_MOUSE_PRESSED || 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) event2.type() != ET_MOUSE_PRESSED) 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Compare flags, but ignore EF_IS_DOUBLE_CLICK to allow triple clicks. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if ((event1.flags() & ~EF_IS_DOUBLE_CLICK) != 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (event2.flags() & ~EF_IS_DOUBLE_CLICK)) 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_difference = event2.time_stamp() - event1.time_stamp(); 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (time_difference.InMilliseconds() > kDoubleClickTimeMS) 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 296a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (std::abs(event2.x() - event1.x()) > kDoubleClickWidth / 2) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 299a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) if (std::abs(event2.y() - event1.y()) > kDoubleClickHeight / 2) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return false; 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetRepeatCount(const MouseEvent& event) { 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int click_count = 1; 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_click_event_) { 3099a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu if (event.type() == ui::ET_MOUSE_RELEASED) { 3109a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu if (event.changed_button_flags() == 3119a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu last_click_event_->changed_button_flags()) { 3129a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu last_click_complete_ = true; 3139a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu return last_click_event_->GetClickCount(); 3149a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu } else { 3159a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu // If last_click_event_ has changed since this button was pressed 3169a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu // return a click count of 1. 3179a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu return click_count; 3189a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu } 3199a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu } 3209a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu if (event.time_stamp() != last_click_event_->time_stamp()) 3219a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu last_click_complete_ = true; 3229a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu if (!last_click_complete_ || 3239a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu IsX11SendEventTrue(event.native_event())) { 3242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) click_count = last_click_event_->GetClickCount(); 3259a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu } else if (IsRepeatedClickEvent(*last_click_event_, event)) { 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) click_count = last_click_event_->GetClickCount() + 1; 3279a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu } 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete last_click_event_; 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_event_ = new MouseEvent(event); 3319a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu last_click_complete_ = false; 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (click_count > 3) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) click_count = 3; 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_click_event_->SetClickCount(click_count); 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return click_count; 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3389a3a4bc965704498ea9f22876627cda96ff9a77eBo Liuvoid MouseEvent::ResetLastClickForTest() { 3399a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu if (last_click_event_) { 3409a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu delete last_click_event_; 3419a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu last_click_event_ = NULL; 3429a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu last_click_complete_ = false; 3439a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu } 3449a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu} 3459a3a4bc965704498ea9f22876627cda96ff9a77eBo Liu 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseEvent* MouseEvent::last_click_event_ = NULL; 3489a3a4bc965704498ea9f22876627cda96ff9a77eBo Liubool MouseEvent::last_click_complete_ = false; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int MouseEvent::GetClickCount() const { 351d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 0; 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (flags() & EF_IS_TRIPLE_CLICK) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 3; 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (flags() & EF_IS_DOUBLE_CLICK) 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 2; 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MouseEvent::SetClickCount(int click_count) { 363d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) if (type() != ET_MOUSE_PRESSED && type() != ET_MOUSE_RELEASED) 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(click_count > 0); 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(click_count <= 3); 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int f = flags(); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (click_count) { 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 1: 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_DOUBLE_CLICK; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_TRIPLE_CLICK; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 2: 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f |= EF_IS_DOUBLE_CLICK; 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_TRIPLE_CLICK; 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 3: 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f &= ~EF_IS_DOUBLE_CLICK; 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) f |= EF_IS_TRIPLE_CLICK; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(f); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// MouseWheelEvent 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const base::NativeEvent& native_event) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(native_event), 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) offset_(GetMouseWheelOffset(native_event)) { 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const ScrollEvent& scroll_event) 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(scroll_event), 397c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) offset_(scroll_event.x_offset(), scroll_event.y_offset()){ 3982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SetType(ET_MOUSEWHEEL); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 401c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MouseWheelEvent::MouseWheelEvent(const MouseEvent& mouse_event, 402c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int x_offset, 403c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) int y_offset) 404c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : MouseEvent(mouse_event), offset_(x_offset, y_offset) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(type() == ET_MOUSEWHEEL); 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 408eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochMouseWheelEvent::MouseWheelEvent(const MouseWheelEvent& mouse_wheel_event) 409eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch : MouseEvent(mouse_wheel_event), 410eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_(mouse_wheel_event.offset()) { 411eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(type() == ET_MOUSEWHEEL); 412eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 413eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches windows WHEEL_DELTA. 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 120; 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This value matches GTK+ wheel scroll amount. 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const int MouseWheelEvent::kWheelDelta = 53; 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 423eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochvoid MouseWheelEvent::UpdateForRootTransform( 424eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const gfx::Transform& inverted_root_transform) { 425eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch LocatedEvent::UpdateForRootTransform(inverted_root_transform); 426eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch gfx::DecomposedTransform decomp; 427eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform); 428eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch DCHECK(success); 429eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decomp.scale[0]) 430eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_.set_x(offset_.x() * decomp.scale[0]); 431eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (decomp.scale[1]) 432eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch offset_.set_y(offset_.y() * decomp.scale[1]); 433eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 434eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 4355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 4365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TouchEvent 4375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(const base::NativeEvent& native_event) 4395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(native_event), 4405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(GetTouchId(native_event)), 4415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(GetTouchRadiusX(native_event)), 4425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(GetTouchRadiusY(native_event)), 4435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(GetTouchAngle(native_event)), 4445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_(GetTouchForce(native_event)), 4455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_device_id_(-1) { 4465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumberWithTimestamp( 4475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) INPUT_EVENT_LATENCY_ORIGINAL_COMPONENT, 4485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 4495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 0, 4505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks::FromInternalValue(time_stamp().ToInternalValue()), 4515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1); 4525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(USE_X11) 4545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(native_event->xcookie.data); 4555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_device_id_ = xiev->deviceid; 4565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif 4575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 4585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type, 4625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int touch_id, 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp) 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(type, location, location, time_stamp, 0), 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(touch_id), 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(0.0f), 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(0.0f), 4695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(0.0f), 4705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_(0.0f), 4715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_device_id_(-1) { 4725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::TouchEvent(EventType type, 4765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 4775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int touch_id, 4795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float radius_x, 4815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float radius_y, 4825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float angle, 4835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float force) 4845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : LocatedEvent(type, location, location, time_stamp, flags), 4855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_id_(touch_id), 4865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_x_(radius_x), 4875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) radius_y_(radius_y), 4885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_angle_(angle), 4895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) force_(force), 4905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) source_device_id_(-1) { 4915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) latency()->AddLatencyNumber(INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); 4925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TouchEvent::~TouchEvent() { 495a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // In ctor TouchEvent(native_event) we call GetTouchId() which in X11 496a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // platform setups the tracking_id to slot mapping. So in dtor here, 497a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // if this touch event is a release event, we clear the mapping accordingly. 498a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (HasNativeEvent()) 499a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ClearTouchIdIfReleased(native_event()); 5005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 502c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void TouchEvent::UpdateForRootTransform( 503c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Transform& inverted_root_transform) { 504c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) LocatedEvent::UpdateForRootTransform(inverted_root_transform); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::DecomposedTransform decomp; 506c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool success = gfx::DecomposeTransform(&decomp, inverted_root_transform); 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(success); 5082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decomp.scale[0]) 509c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) radius_x_ *= decomp.scale[0]; 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (decomp.scale[1]) 511c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) radius_y_ *= decomp.scale[1]; 5125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// KeyEvent 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 51746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static 51846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)KeyEvent* KeyEvent::last_key_event_ = NULL; 51946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 52046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// static 52146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)bool KeyEvent::IsRepeated(const KeyEvent& event) { 52246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // A safe guard in case if there were continous key pressed events that are 52346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // not auto repeat. 52446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) const int kMaxAutoRepeatTimeMs = 2000; 52508fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu // Ignore key events that have non standard state masks as it may be 52608fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu // reposted by an IME. IBUS-GTK uses this field to detect the 52708fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu // re-posted event for example. crbug.com/385873. 52808fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu if (X11EventHasNonStandardState(event.native_event())) 52908fd22434aed8d58d4e04bbbc0df2a942440bcc5Bo Liu return false; 53046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (event.is_char()) 53146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 53246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (event.type() == ui::ET_KEY_RELEASED) { 53346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delete last_key_event_; 53446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_key_event_ = NULL; 53546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 53646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 53746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) CHECK_EQ(ui::ET_KEY_PRESSED, event.type()); 53846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!last_key_event_) { 53946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_key_event_ = new KeyEvent(event); 54046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 54146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 54246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (event.key_code() == last_key_event_->key_code() && 54346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) event.flags() == last_key_event_->flags() && 54446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) (event.time_stamp() - last_key_event_->time_stamp()).InMilliseconds() < 54546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) kMaxAutoRepeatTimeMs) { 54646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return true; 54746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 54846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) delete last_key_event_; 54946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) last_key_event_ = new KeyEvent(event); 55046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return false; 55146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)} 55246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(const base::NativeEvent& native_event, bool is_char) 5545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : Event(native_event, 5555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventTypeFromNative(native_event), 5565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EventFlagsFromNative(native_event)), 5575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code_(KeyboardCodeFromNative(native_event)), 558a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) code_(CodeFromNative(native_event)), 5595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_char_(is_char), 560f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) platform_keycode_(PlatformKeycodeFromNative(native_event)), 5614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) character_(0) { 56246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (IsRepeated(*this)) 56346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) set_flags(flags() | ui::EF_IS_REPEAT); 56446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 5655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(USE_X11) 5665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NormalizeFlags(); 5675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 5685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)KeyEvent::KeyEvent(EventType type, 5715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KeyboardCode key_code, 5725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 5735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool is_char) 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : Event(type, EventTimeForNow(), flags), 5755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) key_code_(key_code), 5765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) is_char_(is_char), 577f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) platform_keycode_(0), 5784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) character_(GetCharacterFromKeyCode(key_code, flags)) { 5795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 5805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 581a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)KeyEvent::KeyEvent(EventType type, 582a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) KeyboardCode key_code, 583a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::string& code, 584a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int flags, 585a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_char) 586a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : Event(type, EventTimeForNow(), flags), 587a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) key_code_(key_code), 588a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) code_(code), 589a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) is_char_(is_char), 590f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) platform_keycode_(0), 591a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) character_(GetCharacterFromKeyCode(key_code, flags)) { 592a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 593a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 5945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint16 KeyEvent::GetCharacter() const { 5955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (character_) 5965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return character_; 5975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 5995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (native_event().message == WM_CHAR) ? key_code_ : 6005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetCharacterFromKeyCode(key_code_, flags()); 6015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#elif defined(USE_X11) 6025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!native_event()) 6035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return GetCharacterFromKeyCode(key_code_, flags()); 6045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(native_event()->type == KeyPress || 6065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) native_event()->type == KeyRelease); 6075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6086d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // When a control key is held, prefer ASCII characters to non ASCII 6096d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // characters in order to use it for shortcut keys. GetCharacterFromKeyCode 6106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11. 6116d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) // GetCharacterFromXEvent returns 'à' in that case. 6126d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) return IsControlDown() ? 6136d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GetCharacterFromKeyCode(key_code_, flags()) : 6146d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) GetCharacterFromXEvent(native_event()); 6155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#else 616a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (native_event()) { 617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED || 618a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) EventTypeFromNative(native_event()) == ET_KEY_RELEASED); 619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 6205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return GetCharacterFromKeyCode(key_code_, flags()); 6225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 6235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool KeyEvent::IsUnicodeKeyCode() const { 626a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#if defined(OS_WIN) 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!IsAltDown()) 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return false; 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const int key = key_code(); 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (key >= VKEY_NUMPAD0 && key <= VKEY_NUMPAD9) 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return true; 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check whether the user is using the numeric keypad with num-lock off. 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // In that case, EF_EXTENDED will not be set; if it is set, the key event 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // originated from the relevant non-numpad dedicated key, e.g. [Insert]. 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return (!(flags() & EF_EXTENDED) && 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (key == VKEY_INSERT || key == VKEY_END || key == VKEY_DOWN || 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_NEXT || key == VKEY_LEFT || key == VKEY_CLEAR || 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_RIGHT || key == VKEY_HOME || key == VKEY_UP || 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) key == VKEY_PRIOR)); 640a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#else 641a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return false; 642a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void KeyEvent::NormalizeFlags() { 6465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int mask = 0; 6475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (key_code()) { 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_CONTROL: 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_CONTROL_DOWN; 6505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_SHIFT: 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_SHIFT_DOWN; 6535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_MENU: 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_ALT_DOWN; 6565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) case VKEY_CAPITAL: 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mask = EF_CAPS_LOCK_DOWN; 6595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 6605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) default: 6615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 6625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (type() == ET_KEY_PRESSED) 6645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(flags() | mask); 6655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 6665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_flags(flags() & ~mask); 6675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)bool KeyEvent::IsTranslated() const { 670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (type()) { 671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_PRESSED: 672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_RELEASED: 673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_PRESS: 675cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_RELEASE: 676cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 677cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 678cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 679cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 6825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 683cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void KeyEvent::SetTranslated(bool translated) { 684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) switch (type()) { 685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_PRESSED: 686cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_PRESS: 687cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetType(translated ? ET_TRANSLATED_KEY_PRESS : ET_KEY_PRESSED); 688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_KEY_RELEASED: 690cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) case ET_TRANSLATED_KEY_RELEASE: 691cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) SetType(translated ? ET_TRANSLATED_KEY_RELEASE : ET_KEY_RELEASED); 692cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) break; 693cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) default: 694cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NOTREACHED(); 695cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 6965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollEvent 7005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollEvent::ScrollEvent(const base::NativeEvent& native_event) 7025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : MouseEvent(native_event) { 7035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type() == ET_SCROLL) { 7042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetScrollOffsets(native_event, 7052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_, &y_offset_, 7062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_ordinal_, &y_offset_ordinal_, 7072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &finger_count_); 7082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else if (type() == ET_SCROLL_FLING_START || 7092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) type() == ET_SCROLL_FLING_CANCEL) { 7102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetFlingData(native_event, 7112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_, &y_offset_, 7122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &x_offset_ordinal_, &y_offset_ordinal_, 7132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NULL); 7142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 7152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) NOTREACHED() << "Unexpected event type " << type() 7162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) << " when constructing a ScrollEvent."; 7175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 7185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ScrollEvent::ScrollEvent(EventType type, 7215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const gfx::PointF& location, 7222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta time_stamp, 7232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int flags, 7242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float x_offset, 7252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float y_offset, 7262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float x_offset_ordinal, 7272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) float y_offset_ordinal, 7282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int finger_count) 7295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : MouseEvent(type, location, location, flags, 0), 7302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_(x_offset), 7312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_(y_offset), 7322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ordinal_(x_offset_ordinal), 7332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ordinal_(y_offset_ordinal), 7342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) finger_count_(finger_count) { 7352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_time_stamp(time_stamp); 7362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CHECK(IsScrollEvent()); 7372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void ScrollEvent::Scale(const float factor) { 7402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ *= factor; 7412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ *= factor; 7422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) x_offset_ordinal_ *= factor; 7432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y_offset_ordinal_ *= factor; 7442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 7452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 7465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 7475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// GestureEvent 7485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::GestureEvent(EventType type, 7505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float x, 7515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) float y, 7525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int flags, 7535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TimeDelta time_stamp, 7545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GestureEventDetails& details, 7555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) unsigned int touch_ids_bitfield) 7562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : LocatedEvent(type, 7575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::PointF(x, y), 7585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) gfx::PointF(x, y), 7592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) time_stamp, 7602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flags | EF_FROM_TOUCH), 7615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) details_(details), 7625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) touch_ids_bitfield_(touch_ids_bitfield) { 7635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GestureEvent::~GestureEvent() { 7665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int GestureEvent::GetLowestTouchId() const { 7695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (touch_ids_bitfield_ == 0) 7705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return -1; 7715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int i = -1; 7725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Find the index of the least significant 1 bit 7735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (!(1 << ++i & touch_ids_bitfield_)); 7745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return i; 7755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 7765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ui 778