1116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Copyright 2014 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/x/device_data_manager_x11.h" 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <X11/extensions/XInput.h> 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <X11/extensions/XInput2.h> 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <X11/Xlib.h> 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/logging.h" 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/memory/singleton.h" 13cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/sys_info.h" 14d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/events/event_switches.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/events/keycodes/keyboard_code_conversion_x.h" 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/x/device_list_cache_x.h" 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/events/x/touch_factory_x11.h" 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/display.h" 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "ui/gfx/point3_f.h" 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_types.h" 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// XIScrollClass was introduced in XI 2.1 so we need to define it here 247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// for backward-compatibility with older versions of XInput. 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#if !defined(XIScrollClass) 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define XIScrollClass 3 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// Multi-touch support was introduced in XI 2.2. Add XI event types here 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch// for backward-compatibility with older versions of XInput. 317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if !defined(XI_TouchBegin) 327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define XI_TouchBegin 18 337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define XI_TouchUpdate 19 347dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#define XI_TouchEnd 20 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copied from xserver-properties.h 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_REL_HWHEEL "Rel Horiz Wheel" 397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_REL_WHEEL "Rel Vert Wheel" 407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// CMT specific timings 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_ABS_DBL_START_TIME "Abs Dbl Start Timestamp" 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_ABS_DBL_END_TIME "Abs Dbl End Timestamp" 447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Ordinal values 467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X "Abs Dbl Ordinal X" 477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y "Abs Dbl Ordinal Y" 487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Fling properties 507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_ABS_DBL_FLING_VX "Abs Dbl Fling X Velocity" 517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_ABS_DBL_FLING_VY "Abs Dbl Fling Y Velocity" 527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_ABS_FLING_STATE "Abs Fling State" 537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_PROP_ABS_FINGER_COUNT "Abs Finger Count" 557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 56eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Cros metrics gesture from touchpad 57eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define AXIS_LABEL_PROP_ABS_METRICS_TYPE "Abs Metrics Type" 58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define AXIS_LABEL_PROP_ABS_DBL_METRICS_DATA1 "Abs Dbl Metrics Data 1" 59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#define AXIS_LABEL_PROP_ABS_DBL_METRICS_DATA2 "Abs Dbl Metrics Data 2" 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Touchscreen multi-touch 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_ABS_MT_TOUCH_MAJOR "Abs MT Touch Major" 637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_ABS_MT_TOUCH_MINOR "Abs MT Touch Minor" 647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_ABS_MT_ORIENTATION "Abs MT Orientation" 657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_ABS_MT_PRESSURE "Abs MT Pressure" 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define AXIS_LABEL_ABS_MT_POSITION_X "Abs MT Position X" 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define AXIS_LABEL_ABS_MT_POSITION_Y "Abs MT Position Y" 687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_ABS_MT_TRACKING_ID "Abs MT Tracking ID" 697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define AXIS_LABEL_TOUCH_TIMESTAMP "Touch Timestamp" 707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// When you add new data types, please make sure the order here is aligned 727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// with the order in the DataType enum in the header file because we assume 737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// they are in sync when updating the device list (see UpdateDeviceList). 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)const char* kCachedAtoms[] = { 757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_REL_HWHEEL, 767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_REL_WHEEL, 777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_ABS_DBL_ORDINAL_X, 787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_ABS_DBL_ORDINAL_Y, 797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_ABS_DBL_START_TIME, 807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_ABS_DBL_END_TIME, 817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_ABS_DBL_FLING_VX, 827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_ABS_DBL_FLING_VY, 837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_ABS_FLING_STATE, 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AXIS_LABEL_PROP_ABS_METRICS_TYPE, 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AXIS_LABEL_PROP_ABS_DBL_METRICS_DATA1, 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch AXIS_LABEL_PROP_ABS_DBL_METRICS_DATA2, 877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_PROP_ABS_FINGER_COUNT, 887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_ABS_MT_TOUCH_MAJOR, 897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_ABS_MT_TOUCH_MINOR, 907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_ABS_MT_ORIENTATION, 917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_ABS_MT_PRESSURE, 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AXIS_LABEL_ABS_MT_POSITION_X, 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AXIS_LABEL_ABS_MT_POSITION_Y, 947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_ABS_MT_TRACKING_ID, 957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) AXIS_LABEL_TOUCH_TIMESTAMP, 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) NULL 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Constants for checking if a data type lies in the range of CMT/Touch data 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// types. 102116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kCMTDataTypeStart = ui::DeviceDataManagerX11::DT_CMT_SCROLL_X; 103116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kCMTDataTypeEnd = ui::DeviceDataManagerX11::DT_CMT_FINGER_COUNT; 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kTouchDataTypeStart = ui::DeviceDataManagerX11::DT_TOUCH_MAJOR; 105116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst int kTouchDataTypeEnd = ui::DeviceDataManagerX11::DT_TOUCH_RAW_TIMESTAMP; 1067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace ui { 1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 109116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsCMTDataType(const int type) { 1107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (type >= kCMTDataTypeStart) && (type <= kCMTDataTypeEnd); 1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsTouchDataType(const int type) { 1147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (type >= kTouchDataTypeStart) && (type <= kTouchDataTypeEnd); 1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::CreateInstance() { 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (instance()) 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return; 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new DeviceDataManagerX11(); 1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 126116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDeviceDataManagerX11* DeviceDataManagerX11::GetInstance() { 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return static_cast<DeviceDataManagerX11*>(DeviceDataManager::GetInstance()); 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 129116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 130116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDeviceDataManagerX11::DeviceDataManagerX11() 131c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : xi_opcode_(-1), 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) atom_cache_(gfx::GetXDisplay(), kCachedAtoms), 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) button_map_count_(0) { 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK(gfx::GetXDisplay()); 1357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch InitializeXInputInternal(); 1367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Make sure the sizes of enum and kCachedAtoms are aligned. 1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) CHECK(arraysize(kCachedAtoms) == static_cast<size_t>(DT_LAST_ENTRY) + 1); 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UpdateDeviceList(gfx::GetXDisplay()); 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) UpdateButtonMap(); 1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 143116680a4aac90f2aa7413d9095a592090648e557Ben MurdochDeviceDataManagerX11::~DeviceDataManagerX11() { 1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::InitializeXInputInternal() { 1477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Check if XInput is available on the system. 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xi_opcode_ = -1; 1497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int opcode, event, error; 1507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (!XQueryExtension( 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) gfx::GetXDisplay(), "XInputExtension", &opcode, &event, &error)) { 1527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch VLOG(1) << "X Input extension not available: error=" << error; 1537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 1547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Check the XInput version. 1577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#if defined(USE_XI2_MT) 1587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int major = 2, minor = USE_XI2_MT; 1597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#else 1607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int major = 2, minor = 0; 1617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#endif 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (XIQueryVersion(gfx::GetXDisplay(), &major, &minor) == BadRequest) { 1637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch VLOG(1) << "XInput2 not supported in the server."; 1647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 1657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(USE_XI2_MT) 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (major < 2 || (major == 2 && minor < USE_XI2_MT)) { 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) DVLOG(1) << "XI version on server is " << major << "." << minor << ". " 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) << "But 2." << USE_XI2_MT << " is required."; 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return false; 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#endif 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xi_opcode_ = opcode; 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK_NE(-1, xi_opcode_); 1767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 1777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Possible XI event types for XIDeviceEvent. See the XI2 protocol 1787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // specification. 1797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xi_device_event_types_[XI_KeyPress] = true; 1807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xi_device_event_types_[XI_KeyRelease] = true; 1817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xi_device_event_types_[XI_ButtonPress] = true; 1827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xi_device_event_types_[XI_ButtonRelease] = true; 1837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xi_device_event_types_[XI_Motion] = true; 1847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Multi-touch support was introduced in XI 2.2. 1857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (minor >= 2) { 1867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xi_device_event_types_[XI_TouchBegin] = true; 1877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xi_device_event_types_[XI_TouchUpdate] = true; 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch xi_device_event_types_[XI_TouchEnd] = true; 1897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch } 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return true; 1917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 1927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsXInput2Available() const { 194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return xi_opcode_ != -1; 195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::UpdateDeviceList(Display* display) { 1987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cmt_devices_.reset(); 1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touchpads_.reset(); 2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (int i = 0; i < kMaxDeviceNum; ++i) { 2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_count_[i] = 0; 2027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_lookup_[i].clear(); 2037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) data_type_lookup_[i].clear(); 2047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_min_[i].clear(); 2057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_max_[i].clear(); 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (int j = 0; j < kMaxSlotNum; j++) 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) last_seen_valuator_[i][j].clear(); 2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Find all the touchpad devices. 2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XDeviceList dev_list = 2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::DeviceListCacheX::GetInstance()->GetXDeviceList(display); 2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Atom xi_touchpad = XInternAtom(display, XI_TOUCHPAD, false); 2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (int i = 0; i < dev_list.count; ++i) 2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (dev_list[i].type == xi_touchpad) 2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) touchpads_[dev_list[i].id] = true; 2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (!IsXInput2Available()) 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return; 220f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 2217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Update the structs with new valuator information 2227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIDeviceList info_list = 2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ui::DeviceListCacheX::GetInstance()->GetXI2DeviceList(display); 2247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) Atom atoms[DT_LAST_ENTRY]; 2257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (int data_type = 0; data_type < DT_LAST_ENTRY; ++data_type) 2267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) atoms[data_type] = atom_cache_.GetAtom(kCachedAtoms[data_type]); 2277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (int i = 0; i < info_list.count; ++i) { 2297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIDeviceInfo* info = info_list.devices + i; 2307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // We currently handle only slave, non-keyboard devices 2327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (info->use != XISlavePointer && info->use != XIFloatingSlave) 2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue; 2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool possible_cmt = false; 2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) bool not_cmt = false; 2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const int deviceid = info->deviceid; 2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (int j = 0; j < info->num_classes; ++j) { 2407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (info->classes[j]->type == XIValuatorClass) 2417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ++valuator_count_[deviceid]; 2427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) else if (info->classes[j]->type == XIScrollClass) 2437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) not_cmt = true; 2447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // Skip devices that don't use any valuator 2477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!valuator_count_[deviceid]) 2487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue; 2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_lookup_[deviceid].resize(DT_LAST_ENTRY, -1); 2517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) data_type_lookup_[deviceid].resize( 2527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_count_[deviceid], DT_LAST_ENTRY); 2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_min_[deviceid].resize(DT_LAST_ENTRY, 0); 2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_max_[deviceid].resize(DT_LAST_ENTRY, 0); 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (int j = 0; j < kMaxSlotNum; j++) 256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) last_seen_valuator_[deviceid][j].resize(DT_LAST_ENTRY, 0); 2577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (int j = 0; j < info->num_classes; ++j) { 2587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (info->classes[j]->type != XIValuatorClass) 2597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) continue; 2607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIValuatorClassInfo* v = 2627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) reinterpret_cast<XIValuatorClassInfo*>(info->classes[j]); 2637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (int data_type = 0; data_type < DT_LAST_ENTRY; ++data_type) { 2647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (v->label == atoms[data_type]) { 2657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_lookup_[deviceid][data_type] = v->number; 2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) data_type_lookup_[deviceid][v->number] = data_type; 2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_min_[deviceid][data_type] = v->min; 2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuator_max_[deviceid][data_type] = v->max; 2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (IsCMTDataType(data_type)) 2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) possible_cmt = true; 2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) break; 2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (possible_cmt && !not_cmt) 2777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) cmt_devices_[deviceid] = true; 2787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 2797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 2807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 281116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::GetSlotNumber(const XIDeviceEvent* xiev, int* slot) { 282a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#if defined(USE_XI2_MT) 283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ui::TouchFactory* factory = ui::TouchFactory::GetInstance(); 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (!factory->IsMultiTouchDevice(xiev->sourceid)) { 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *slot = 0; 286a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return factory->QuerySlotForTrackingID(xiev->detail, slot); 289a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#else 290a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *slot = 0; 291a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 292a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#endif 293a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 294a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 295116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::GetEventRawData(const XEvent& xev, EventData* data) { 2967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (xev.type != GenericEvent) 2977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 2987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 2997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data); 3007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (xiev->sourceid >= kMaxDeviceNum || xiev->deviceid >= kMaxDeviceNum) 3017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return; 3027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) data->clear(); 3037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const int sourceid = xiev->sourceid; 3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) double* valuators = xiev->valuators.values; 3057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) for (int i = 0; i <= valuator_count_[sourceid]; ++i) { 3067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (XIMaskIsSet(xiev->valuators.mask, i)) { 3077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int type = data_type_lookup_[sourceid][i]; 3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (type != DT_LAST_ENTRY) { 3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) (*data)[type] = *valuators; 310a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (IsTouchDataType(type)) { 311a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int slot = -1; 312a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (GetSlotNumber(xiev, &slot) && slot >= 0 && slot < kMaxSlotNum) 313a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) last_seen_valuator_[sourceid][slot][type] = *valuators; 314a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) valuators++; 3177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 321116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::GetEventData(const XEvent& xev, 3227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const DataType type, double* value) { 3237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (xev.type != GenericEvent) 3247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(xev.xcookie.data); 3277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (xiev->sourceid >= kMaxDeviceNum || xiev->deviceid >= kMaxDeviceNum) 3287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const int sourceid = xiev->sourceid; 3307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (valuator_lookup_[sourceid].empty()) 3317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 333a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (type == DT_TOUCH_TRACKING_ID) { 3344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // With XInput2 MT, Tracking ID is provided in the detail field for touch 3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) // events. 3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) if (xiev->evtype == XI_TouchBegin || 3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) xiev->evtype == XI_TouchEnd || 3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) xiev->evtype == XI_TouchUpdate) { 3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *value = xiev->detail; 3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } else { 3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *value = 0; 3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 343a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) return true; 344a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 345a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 3467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) int val_index = valuator_lookup_[sourceid][type]; 347a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) int slot = 0; 3487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (val_index >= 0) { 3497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (XIMaskIsSet(xiev->valuators.mask, val_index)) { 3507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) double* valuators = xiev->valuators.values; 3517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) while (val_index--) { 3527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (XIMaskIsSet(xiev->valuators.mask, val_index)) 3537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ++valuators; 3547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *value = *valuators; 356a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (IsTouchDataType(type)) { 357a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (GetSlotNumber(xiev, &slot) && slot >= 0 && slot < kMaxSlotNum) 358a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) last_seen_valuator_[sourceid][slot][type] = *value; 359a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 3607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 3617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } else if (IsTouchDataType(type)) { 362a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) if (GetSlotNumber(xiev, &slot) && slot >= 0 && slot < kMaxSlotNum) 363a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) *value = last_seen_valuator_[sourceid][slot][type]; 3647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 3667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 370116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsXIDeviceEvent( 3717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const base::NativeEvent& native_event) const { 3727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if (native_event->type != GenericEvent || 3737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch native_event->xcookie.extension != xi_opcode_) 3747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return false; 3757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return xi_device_event_types_[native_event->xcookie.evtype]; 3767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 3777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 378116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsTouchpadXInputEvent( 3797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::NativeEvent& native_event) const { 3807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (native_event->type != GenericEvent) 3817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIDeviceEvent* xievent = 3847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 3857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (xievent->sourceid >= kMaxDeviceNum) 3867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return touchpads_[xievent->sourceid]; 3887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 3897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 390116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsCMTDeviceEvent( 3917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::NativeEvent& native_event) const { 3927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (native_event->type != GenericEvent) 3937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 3957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIDeviceEvent* xievent = 3967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 3977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (xievent->sourceid >= kMaxDeviceNum) 3987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 3997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return cmt_devices_[xievent->sourceid]; 4007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 402116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsCMTGestureEvent( 4037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::NativeEvent& native_event) const { 4047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (IsScrollEvent(native_event) || 405eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IsFlingEvent(native_event) || 406eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch IsCMTMetricsEvent(native_event)); 4077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::HasEventData( 4107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const XIDeviceEvent* xiev, const DataType type) const { 4117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const int idx = valuator_lookup_[xiev->sourceid][type]; 4127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (idx >= 0) && XIMaskIsSet(xiev->valuators.mask, idx); 4137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsScrollEvent( 4167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::NativeEvent& native_event) const { 4177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!IsCMTDeviceEvent(native_event)) 4187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 4197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIDeviceEvent* xiev = 4217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 4227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (HasEventData(xiev, DT_CMT_SCROLL_X) || 4237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) HasEventData(xiev, DT_CMT_SCROLL_Y)); 4247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 426116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsFlingEvent( 4277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::NativeEvent& native_event) const { 4287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!IsCMTDeviceEvent(native_event)) 4297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 4307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIDeviceEvent* xiev = 4327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 4337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (HasEventData(xiev, DT_CMT_FLING_X) && 4347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) HasEventData(xiev, DT_CMT_FLING_Y) && 4357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) HasEventData(xiev, DT_CMT_FLING_STATE)); 4367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 438116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsCMTMetricsEvent( 439eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const base::NativeEvent& native_event) const { 440eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (!IsCMTDeviceEvent(native_event)) 441eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return false; 442eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 443eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch XIDeviceEvent* xiev = 444eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch static_cast<XIDeviceEvent*>(native_event->xcookie.data); 445eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch return (HasEventData(xiev, DT_CMT_METRICS_TYPE) && 446eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HasEventData(xiev, DT_CMT_METRICS_DATA1) && 447eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch HasEventData(xiev, DT_CMT_METRICS_DATA2)); 448eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 449eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 450116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::HasGestureTimes( 4517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) const base::NativeEvent& native_event) const { 4527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (!IsCMTDeviceEvent(native_event)) 4537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 4547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) XIDeviceEvent* xiev = 4567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 4577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return (HasEventData(xiev, DT_CMT_START_TIME) && 4587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) HasEventData(xiev, DT_CMT_END_TIME)); 4597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 461116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::GetScrollOffsets( 462116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::NativeEvent& native_event, 463116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* x_offset, 464116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* y_offset, 465116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* x_offset_ordinal, 466116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* y_offset_ordinal, 467116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int* finger_count) { 4687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *x_offset = 0; 4697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *y_offset = 0; 4707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *x_offset_ordinal = 0; 4717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *y_offset_ordinal = 0; 4727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *finger_count = 2; 4737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EventData data; 4757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetEventRawData(*native_event, &data); 4767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 4777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_SCROLL_X) != data.end()) 478c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *x_offset = data[DT_CMT_SCROLL_X]; 4797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_SCROLL_Y) != data.end()) 480c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *y_offset = data[DT_CMT_SCROLL_Y]; 4817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_ORDINAL_X) != data.end()) 482c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *x_offset_ordinal = data[DT_CMT_ORDINAL_X]; 4837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_ORDINAL_Y) != data.end()) 484c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *y_offset_ordinal = data[DT_CMT_ORDINAL_Y]; 4857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_FINGER_COUNT) != data.end()) 4867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *finger_count = static_cast<int>(data[DT_CMT_FINGER_COUNT]); 4877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 4887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 489116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::GetFlingData( 490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::NativeEvent& native_event, 491116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* vx, 492116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* vy, 493116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* vx_ordinal, 494116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* vy_ordinal, 495116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool* is_cancel) { 4967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *vx = 0; 4977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *vy = 0; 4987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *vx_ordinal = 0; 4997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *vy_ordinal = 0; 5007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *is_cancel = false; 5017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5027d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EventData data; 5037d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetEventRawData(*native_event, &data); 5047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5057d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_FLING_X) != data.end()) 506c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *vx = data[DT_CMT_FLING_X]; 5077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_FLING_Y) != data.end()) 508c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *vy = data[DT_CMT_FLING_Y]; 5097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_FLING_STATE) != data.end()) 5107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *is_cancel = !!static_cast<unsigned int>(data[DT_CMT_FLING_STATE]); 5117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_ORDINAL_X) != data.end()) 512c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *vx_ordinal = data[DT_CMT_ORDINAL_X]; 5137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_ORDINAL_Y) != data.end()) 514c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch *vy_ordinal = data[DT_CMT_ORDINAL_Y]; 5157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 517116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::GetMetricsData( 518116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::NativeEvent& native_event, 519116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GestureMetricsType* type, 520116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* data1, 521116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch float* data2) { 522eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *type = kGestureMetricsTypeUnknown; 523eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *data1 = 0; 524eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *data2 = 0; 525eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 526eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch EventData data; 527eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch GetEventRawData(*native_event, &data); 528eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 529eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (data.find(DT_CMT_METRICS_TYPE) != data.end()) { 530eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch int val = static_cast<int>(data[DT_CMT_METRICS_TYPE]); 531eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (val == 0) 532eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *type = kGestureMetricsTypeNoisyGround; 533eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else 534eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *type = kGestureMetricsTypeUnknown; 535eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 536eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (data.find(DT_CMT_METRICS_DATA1) != data.end()) 537eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *data1 = data[DT_CMT_METRICS_DATA1]; 538eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if (data.find(DT_CMT_METRICS_DATA2) != data.end()) 539eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch *data2 = data[DT_CMT_METRICS_DATA2]; 540eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 541eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 542116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint DeviceDataManagerX11::GetMappedButton(int button) { 54368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return button > 0 && button <= button_map_count_ ? button_map_[button - 1] : 54468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) button; 54568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 54668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 547116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::UpdateButtonMap() { 54868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) button_map_count_ = XGetPointerMapping(gfx::GetXDisplay(), 54968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) button_map_, 55068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) arraysize(button_map_)); 55168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 55268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 553116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::GetGestureTimes( 554116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::NativeEvent& native_event, 555116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double* start_time, 556116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double* end_time) { 5577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *start_time = 0; 5587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *end_time = 0; 5597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EventData data; 5617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) GetEventRawData(*native_event, &data); 5627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 5637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_START_TIME) != data.end()) 5647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *start_time = data[DT_CMT_START_TIME]; 5657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (data.find(DT_CMT_END_TIME) != data.end()) 5667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *end_time = data[DT_CMT_END_TIME]; 5677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 569116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::NormalizeData(unsigned int deviceid, 570116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const DataType type, 571116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double* value) { 5727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) double max_value; 5737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) double min_value; 5747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (GetDataRange(deviceid, type, &min_value, &max_value)) { 5757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *value = (*value - min_value) / (max_value - min_value); 5767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DCHECK(*value >= 0.0 && *value <= 1.0); 5777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 5787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 5807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 582116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::GetDataRange(unsigned int deviceid, 583116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const DataType type, 584116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double* min, 585116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double* max) { 5867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (deviceid >= static_cast<unsigned int>(kMaxDeviceNum)) 5877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 5887d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if (valuator_lookup_[deviceid][type] >= 0) { 5897d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *min = valuator_min_[deviceid][type]; 5907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) *max = valuator_max_[deviceid][type]; 5917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return true; 5927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) } 5937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) return false; 5947d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} 5957d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 596116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::SetDeviceListForTest( 597a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<unsigned int>& touchscreen, 598a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<unsigned int>& cmt_devices) { 599a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (int i = 0; i < kMaxDeviceNum; ++i) { 600a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) valuator_count_[i] = 0; 601a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) valuator_lookup_[i].clear(); 602a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) data_type_lookup_[i].clear(); 603a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) valuator_min_[i].clear(); 604a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) valuator_max_[i].clear(); 605a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) for (int j = 0; j < kMaxSlotNum; j++) 606a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) last_seen_valuator_[i][j].clear(); 607a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 608a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 609a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < touchscreen.size(); i++) { 610a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) unsigned int deviceid = touchscreen[i]; 611a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InitializeValuatorsForTest(deviceid, kTouchDataTypeStart, kTouchDataTypeEnd, 612a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 0, 1000); 613a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) } 614f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 615f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cmt_devices_.reset(); 616f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) for (size_t i = 0; i < cmt_devices.size(); ++i) { 617a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) unsigned int deviceid = cmt_devices[i]; 618f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) cmt_devices_[deviceid] = true; 619a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) touchpads_[deviceid] = true; 620a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InitializeValuatorsForTest(deviceid, kCMTDataTypeStart, kCMTDataTypeEnd, 621a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) -1000, 1000); 622f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 623a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 624f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 625116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::SetValuatorDataForTest(XIDeviceEvent* xievent, 626116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DataType type, 627116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double value) { 628a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int index = valuator_lookup_[xievent->deviceid][type]; 629a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK(!XIMaskIsSet(xievent->valuators.mask, index)); 630a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK(index >= 0 && index < valuator_count_[xievent->deviceid]); 631a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) XISetMask(xievent->valuators.mask, index); 632a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 633a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) double* valuators = xievent->valuators.values; 634a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = 0; i < index; ++i) { 635a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (XIMaskIsSet(xievent->valuators.mask, i)) 636a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) valuators++; 637f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 638a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int i = DT_LAST_ENTRY - 1; i > valuators - xievent->valuators.values; 639a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) --i) 640a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) xievent->valuators.values[i] = xievent->valuators.values[i - 1]; 641a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) *valuators = value; 642a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 643a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 644116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::InitializeValuatorsForTest(int deviceid, 645116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int start_valuator, 646116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int end_valuator, 647116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double min_value, 648116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch double max_value) { 649a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) valuator_lookup_[deviceid].resize(DT_LAST_ENTRY, -1); 650a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) data_type_lookup_[deviceid].resize(DT_LAST_ENTRY, DT_LAST_ENTRY); 651a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) valuator_min_[deviceid].resize(DT_LAST_ENTRY, 0); 652a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) valuator_max_[deviceid].resize(DT_LAST_ENTRY, 0); 653a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int j = 0; j < kMaxSlotNum; j++) 654a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) last_seen_valuator_[deviceid][j].resize(DT_LAST_ENTRY, 0); 655a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (int j = start_valuator; j <= end_valuator; ++j) { 656a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) valuator_lookup_[deviceid][j] = valuator_count_[deviceid]; 657a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) data_type_lookup_[deviceid][valuator_count_[deviceid]] = j; 658a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) valuator_min_[deviceid][j] = min_value; 659a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) valuator_max_[deviceid][j] = max_value; 660a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) valuator_count_[deviceid]++; 661f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 662a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 663a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 664116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::TouchEventNeedsCalibrate(int touch_device_id) const { 665cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#if defined(OS_CHROMEOS) && defined(USE_XI2_MT) 666cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int64 touch_display_id = GetDisplayForTouchDevice(touch_device_id); 667cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if (base::SysInfo::IsRunningOnChromeOS() && 668cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) touch_display_id == gfx::Display::InternalDisplayId()) { 669cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return true; 670cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) } 671cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // defined(OS_CHROMEOS) && defined(USE_XI2_MT) 672cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) return false; 673cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 674cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 6756e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void DeviceDataManagerX11::SetDisabledKeyboardAllowedKeys( 676116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<std::set<KeyboardCode> > excepted_keys) { 6776e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) DCHECK(!excepted_keys.get() || 6786e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) !blocked_keyboard_allowed_keys_.get()); 679116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blocked_keyboard_allowed_keys_ = excepted_keys.Pass(); 680cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 681cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 682116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::DisableDevice(unsigned int deviceid) { 683116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blocked_devices_.set(deviceid, true); 684cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 685cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 686116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DeviceDataManagerX11::EnableDevice(unsigned int deviceid) { 687116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch blocked_devices_.set(deviceid, false); 688cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 689cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 690116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool DeviceDataManagerX11::IsEventBlocked( 691116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const base::NativeEvent& native_event) { 6926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Only check XI2 events which have a source device id. 6936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (native_event->type != GenericEvent) 6946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 6956e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 6966e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) XIDeviceEvent* xievent = 6976e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static_cast<XIDeviceEvent*>(native_event->xcookie.data); 6986e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Allow any key events from blocked_keyboard_allowed_keys_. 6996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (blocked_keyboard_allowed_keys_ && 7006e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) (xievent->evtype == XI_KeyPress || xievent->evtype == XI_KeyRelease) && 7016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) blocked_keyboard_allowed_keys_->find( 7026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) KeyboardCodeFromXKeyEvent(native_event)) != 7036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) blocked_keyboard_allowed_keys_->end()) { 7046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return false; 705116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 7066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 7076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) return blocked_devices_.test(xievent->sourceid); 708cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 709cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 7107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace ui 711