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