1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/test/events_test_utils_x11.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <X11/extensions/XI2.h> 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <X11/keysym.h> 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <X11/X.h> 10f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include <X11/Xlib.h> 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/logging.h" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/event_constants.h" 1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "ui/events/event_utils.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/keycodes/keyboard_code_conversion_x.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "ui/events/x/touch_factory_x11.h" 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace { 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Converts ui::EventType to state for X*Events. 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)unsigned int XEventState(int flags) { 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ((flags & ui::EF_SHIFT_DOWN) ? ShiftMask : 0) | 24f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ((flags & ui::EF_CONTROL_DOWN) ? ControlMask : 0) | 25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ((flags & ui::EF_ALT_DOWN) ? Mod1Mask : 0) | 26f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ((flags & ui::EF_CAPS_LOCK_DOWN) ? LockMask : 0) | 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ((flags & ui::EF_ALTGR_DOWN) ? Mod5Mask : 0) | 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ((flags & ui::EF_COMMAND_DOWN) ? Mod4Mask : 0) | 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ((flags & ui::EF_MOD3_DOWN) ? Mod3Mask : 0) | 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) ((flags & ui::EF_NUMPAD_KEY) ? Mod2Mask : 0) | 31f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ((flags & ui::EF_LEFT_MOUSE_BUTTON) ? Button1Mask: 0) | 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ((flags & ui::EF_MIDDLE_MOUSE_BUTTON) ? Button2Mask: 0) | 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ((flags & ui::EF_RIGHT_MOUSE_BUTTON) ? Button3Mask: 0); 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Converts EventType to XKeyEvent type. 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)int XKeyEventType(ui::EventType type) { 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) switch (type) { 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case ui::ET_KEY_PRESSED: 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return KeyPress; 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) case ui::ET_KEY_RELEASED: 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return KeyRelease; 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) default: 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return 0; 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) } 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 48116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Converts EventType to XI2 event type. 49116680a4aac90f2aa7413d9095a592090648e557Ben Murdochint XIKeyEventType(ui::EventType type) { 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch switch (type) { 51116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_KEY_PRESSED: 52116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return XI_KeyPress; 53116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch case ui::ET_KEY_RELEASED: 54116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return XI_KeyRelease; 55116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch default: 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch return 0; 57116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch } 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 59116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)int XIButtonEventType(ui::EventType type) { 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) switch (type) { 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_MOUSEWHEEL: 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_MOUSE_PRESSED: 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // The button release X events for mouse wheels are dropped by Aura. 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return XI_ButtonPress; 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) case ui::ET_MOUSE_RELEASED: 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return XI_ButtonRelease; 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) default: 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) NOTREACHED(); 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return 0; 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Converts Aura event type and flag to X button event. 75f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)unsigned int XButtonEventButton(ui::EventType type, 76f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int flags) { 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Aura events don't keep track of mouse wheel button, so just return 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the first mouse wheel button. 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) if (type == ui::ET_MOUSEWHEEL) 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return Button4; 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (flags & ui::EF_LEFT_MOUSE_BUTTON) 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Button1; 845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (flags & ui::EF_MIDDLE_MOUSE_BUTTON) 855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Button2; 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (flags & ui::EF_RIGHT_MOUSE_BUTTON) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return Button3; 88f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 89f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return 0; 90f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void InitValuatorsForXIDeviceEvent(XIDeviceEvent* xiev) { 93116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int valuator_count = ui::DeviceDataManagerX11::DT_LAST_ENTRY; 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xiev->valuators.mask_len = (valuator_count / 8) + 1; 95f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xiev->valuators.mask = new unsigned char[xiev->valuators.mask_len]; 96f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) memset(xiev->valuators.mask, 0, xiev->valuators.mask_len); 97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xiev->valuators.values = new double[valuator_count]; 98f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 99f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 100f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)XEvent* CreateXInput2Event(int deviceid, 101f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int evtype, 102f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int tracking_id, 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point& location) { 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) XEvent* event = new XEvent; 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) memset(event, 0, sizeof(*event)); 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event->type = GenericEvent; 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event->xcookie.data = new XIDeviceEvent; 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) XIDeviceEvent* xiev = 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static_cast<XIDeviceEvent*>(event->xcookie.data); 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) memset(xiev, 0, sizeof(XIDeviceEvent)); 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xiev->deviceid = deviceid; 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xiev->sourceid = deviceid; 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xiev->evtype = evtype; 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xiev->detail = tracking_id; 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xiev->event_x = location.x(); 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) xiev->event_y = location.y(); 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) xiev->event = DefaultRootWindow(gfx::GetXDisplay()); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (evtype == XI_ButtonPress || evtype == XI_ButtonRelease) { 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) xiev->buttons.mask_len = 8; 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) xiev->buttons.mask = new unsigned char[xiev->buttons.mask_len]; 1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) memset(xiev->buttons.mask, 0, xiev->buttons.mask_len); 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return event; 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace ui { 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// XInput2 events contain additional data that need to be explicitly freed (see 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// |CreateXInput2Event()|. 1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void XEventDeleter::operator()(XEvent* event) { 1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (event->type == GenericEvent) { 1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) XIDeviceEvent* xiev = 1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static_cast<XIDeviceEvent*>(event->xcookie.data); 1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (xiev) { 1375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete[] xiev->valuators.mask; 1385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete[] xiev->valuators.values; 1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete[] xiev->buttons.mask; 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete xiev; 1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) delete event; 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ScopedXI2Event::ScopedXI2Event() {} 1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ScopedXI2Event::~ScopedXI2Event() {} 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ScopedXI2Event::InitKeyEvent(EventType type, 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) KeyboardCode key_code, 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int flags) { 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) XDisplay* display = gfx::GetXDisplay(); 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_.reset(new XEvent); 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) memset(event_.get(), 0, sizeof(XEvent)); 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->type = XKeyEventType(type); 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) CHECK_NE(0, event_->type); 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.serial = 0; 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.send_event = 0; 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.display = display; 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.time = 0; 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.window = 0; 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.root = 0; 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.subwindow = 0; 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.x = 0; 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.y = 0; 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.x_root = 0; 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.y_root = 0; 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.state = XEventState(flags); 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event_->xkey.keycode = XKeyCodeForWindowsKeyCode(key_code, flags, display); 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_->xkey.same_screen = 1; 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid ScopedXI2Event::InitGenericKeyEvent(int deviceid, 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci int sourceid, 175116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EventType type, 176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch KeyboardCode key_code, 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch int flags) { 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event_.reset( 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CreateXInput2Event(deviceid, XIKeyEventType(type), 0, gfx::Point())); 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(event_->xcookie.data); 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch CHECK_NE(0, xievent->evtype); 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch XDisplay* display = gfx::GetXDisplay(); 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch event_->xgeneric.display = display; 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch xievent->display = display; 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch xievent->mods.effective = XEventState(flags); 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch xievent->detail = XKeyCodeForWindowsKeyCode(key_code, flags, display); 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci xievent->sourceid = sourceid; 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void ScopedXI2Event::InitGenericButtonEvent(int deviceid, 1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EventType type, 19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) const gfx::Point& location, 1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int flags) { 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event_.reset(CreateXInput2Event(deviceid, 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) XIButtonEventType(type), 0, gfx::Point())); 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(event_->xcookie.data); 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) xievent->mods.effective = XEventState(flags); 1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) xievent->detail = XButtonEventButton(type, flags); 19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) xievent->event_x = location.x(); 20023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) xievent->event_y = location.y(); 2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) XISetMask(xievent->buttons.mask, xievent->detail); 20223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Setup an empty valuator list for generic button events. 20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) SetUpValuators(std::vector<Valuator>()); 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 20623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void ScopedXI2Event::InitGenericMouseWheelEvent(int deviceid, 20723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int wheel_delta, 20823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int flags) { 20923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) InitGenericButtonEvent(deviceid, ui::ET_MOUSEWHEEL, gfx::Point(), flags); 21023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(event_->xcookie.data); 21123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) xievent->detail = wheel_delta > 0 ? Button4 : Button5; 212f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ScopedXI2Event::InitScrollEvent(int deviceid, 215f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int x_offset, 216f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int y_offset, 217f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int x_offset_ordinal, 218f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int y_offset_ordinal, 219f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int finger_count) { 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event_.reset(CreateXInput2Event(deviceid, XI_Motion, 0, gfx::Point())); 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Valuator valuators[] = { 223116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_SCROLL_X, x_offset), 224116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_SCROLL_Y, y_offset), 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_ORDINAL_X, x_offset_ordinal), 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_ORDINAL_Y, y_offset_ordinal), 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_FINGER_COUNT, finger_count) 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetUpValuators( 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<Valuator>(valuators, valuators + arraysize(valuators))); 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ScopedXI2Event::InitFlingScrollEvent(int deviceid, 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int x_velocity, 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int y_velocity, 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int x_velocity_ordinal, 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int y_velocity_ordinal, 238a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool is_cancel) { 239f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) event_.reset(CreateXInput2Event(deviceid, XI_Motion, deviceid, gfx::Point())); 240f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 241a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Valuator valuators[] = { 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_FLING_STATE, is_cancel ? 1 : 0), 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_FLING_Y, y_velocity), 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_ORDINAL_Y, y_velocity_ordinal), 245116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_FLING_X, x_velocity), 246116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_CMT_ORDINAL_X, x_velocity_ordinal) 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) }; 248f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SetUpValuators( 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::vector<Valuator>(valuators, valuators + arraysize(valuators))); 251f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 252f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 253f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)void ScopedXI2Event::InitTouchEvent(int deviceid, 254f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int evtype, 255f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int tracking_id, 256f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const gfx::Point& location, 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const std::vector<Valuator>& valuators) { 258a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) event_.reset(CreateXInput2Event(deviceid, evtype, tracking_id, location)); 25946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // If a timestamp was specified, setup the event. 26146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) for (size_t i = 0; i < valuators.size(); ++i) { 262116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch if (valuators[i].data_type == 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DeviceDataManagerX11::DT_TOUCH_RAW_TIMESTAMP) { 26446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetUpValuators(valuators); 26546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) return; 26646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 26746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) } 26846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 26946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) // No timestamp was specified. Use |ui::EventTimeForNow()|. 27046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<Valuator> valuators_with_time = valuators; 27146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) valuators_with_time.push_back( 272116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Valuator(DeviceDataManagerX11::DT_TOUCH_RAW_TIMESTAMP, 27346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) (ui::EventTimeForNow()).InMicroseconds())); 27446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) SetUpValuators(valuators_with_time); 275f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 276f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 277a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void ScopedXI2Event::SetUpValuators(const std::vector<Valuator>& valuators) { 278a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK(event_.get()); 279a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) CHECK_EQ(GenericEvent, event_->type); 280a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) XIDeviceEvent* xiev = static_cast<XIDeviceEvent*>(event_->xcookie.data); 281a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) InitValuatorsForXIDeviceEvent(xiev); 282116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); 283a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) for (size_t i = 0; i < valuators.size(); ++i) { 284a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager->SetValuatorDataForTest(xiev, valuators[i].data_type, 285a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) valuators[i].value); 286a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 287a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 288a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 28923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)void SetUpTouchPadForTest(unsigned int deviceid) { 290f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) std::vector<unsigned int> device_list; 291f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) device_list.push_back(deviceid); 292f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 293f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TouchFactory::GetInstance()->SetPointerDeviceForTest(device_list); 294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); 295a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager->SetDeviceListForTest(std::vector<unsigned int>(), device_list); 296f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 297f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 298a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)void SetUpTouchDevicesForTest(const std::vector<unsigned int>& devices) { 299f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) TouchFactory::GetInstance()->SetTouchDeviceForTest(devices); 300116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ui::DeviceDataManagerX11* manager = ui::DeviceDataManagerX11::GetInstance(); 301a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) manager->SetDeviceListForTest(devices, std::vector<unsigned int>()); 302f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 303f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 304f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace ui 305