summaryrefslogtreecommitdiffstats
path: root/ui/events
diff options
context:
space:
mode:
Diffstat (limited to 'ui/events')
-rw-r--r--ui/events/x/device_data_manager.h7
-rw-r--r--ui/events/x/events_x_unittest.cc172
-rw-r--r--ui/events/x/events_x_utils.cc77
-rw-r--r--ui/events/x/events_x_utils.h35
4 files changed, 161 insertions, 130 deletions
diff --git a/ui/events/x/device_data_manager.h b/ui/events/x/device_data_manager.h
index 7e20122..8ca2983 100644
--- a/ui/events/x/device_data_manager.h
+++ b/ui/events/x/device_data_manager.h
@@ -5,6 +5,13 @@
#ifndef UI_EVENTS_X_DEVICE_DATA_MANAGER_H_
#define UI_EVENTS_X_DEVICE_DATA_MANAGER_H_
+// Generically-named #defines from Xlib is conflicting with symbols in GTest.
+// So many tests .cc file #undef Bool before including device_data_manager.h,
+// which makes Bool unrecognized in XInput2.h.
+#ifndef Bool
+#define Bool int
+#endif
+
#include <X11/extensions/XInput2.h>
#include <bitset>
diff --git a/ui/events/x/events_x_unittest.cc b/ui/events/x/events_x_unittest.cc
index ed8f47a..c27e6ca 100644
--- a/ui/events/x/events_x_unittest.cc
+++ b/ui/events/x/events_x_unittest.cc
@@ -15,8 +15,7 @@
#include "ui/events/event.h"
#include "ui/events/event_constants.h"
#include "ui/events/event_utils.h"
-#include "ui/events/x/device_data_manager.h"
-#include "ui/events/x/touch_factory_x11.h"
+#include "ui/events/x/events_x_utils.h"
#include "ui/gfx/point.h"
namespace ui {
@@ -41,90 +40,6 @@ void InitButtonEvent(XEvent* event,
button_event->state = state;
}
-#if defined(USE_XI2_MT)
-const int kValuatorNum = 3;
-const int kTouchValuatorMap[kValuatorNum][4] = {
- // { valuator_index, valuator_type, min_val, max_val }
- { 0, DeviceDataManager::DT_TOUCH_MAJOR, 0, 1000},
- { 1, DeviceDataManager::DT_TOUCH_ORIENTATION, 0, 1},
- { 2, DeviceDataManager::DT_TOUCH_PRESSURE, 0, 1000},
-};
-
-struct Valuator {
- Valuator(DeviceDataManager::DataType type, double v)
- : data_type(type), value(v) {}
-
- DeviceDataManager::DataType data_type;
- double value;
-};
-
-XEvent* CreateTouchEvent(int deviceid,
- int evtype,
- int tracking_id,
- const gfx::Point& location,
- const std::vector<Valuator>& valuators) {
- XEvent* event = new XEvent;
- memset(event, 0, sizeof(*event));
- event->type = GenericEvent;
- event->xcookie.data = new XIDeviceEvent;
- XIDeviceEvent* xiev =
- static_cast<XIDeviceEvent*>(event->xcookie.data);
- xiev->deviceid = deviceid;
- xiev->sourceid = deviceid;
- xiev->evtype = evtype;
- xiev->detail = tracking_id;
- xiev->event_x = location.x();
- xiev->event_y = location.y();
-
- xiev->valuators.mask_len = (valuators.size() / 8) + 1;
- xiev->valuators.mask = new unsigned char[xiev->valuators.mask_len];
- memset(xiev->valuators.mask, 0, xiev->valuators.mask_len);
- xiev->valuators.values = new double[valuators.size()];
-
- int val_count = 0;
- for (int i = 0; i < kValuatorNum; i++) {
- for(size_t j = 0; j < valuators.size(); j++) {
- if (valuators[j].data_type == kTouchValuatorMap[i][1]) {
- XISetMask(xiev->valuators.mask, kTouchValuatorMap[i][0]);
- xiev->valuators.values[val_count++] = valuators[j].value;
- }
- }
- }
-
- return event;
-}
-
-void DestroyTouchEvent(XEvent* event) {
- XIDeviceEvent* xiev =
- static_cast<XIDeviceEvent*>(event->xcookie.data);
- if (xiev) {
- delete[] xiev->valuators.mask;
- delete[] xiev->valuators.values;
- delete xiev;
- }
- delete event;
-}
-
-void SetupTouchFactory(const std::vector<unsigned int>& devices) {
- TouchFactory* factory = TouchFactory::GetInstance();
- factory->SetTouchDeviceForTest(devices);
-}
-
-void SetupDeviceDataManager(const std::vector<unsigned int>& devices) {
- ui::DeviceDataManager* manager = ui::DeviceDataManager::GetInstance();
- manager->SetDeviceListForTest(devices);
- for (size_t i = 0; i < devices.size(); i++) {
- for (int j = 0; j < kValuatorNum; j++) {
- manager->SetDeviceValuatorForTest(
- devices[i],
- kTouchValuatorMap[j][0],
- static_cast<DeviceDataManager::DataType>(kTouchValuatorMap[j][1]),
- kTouchValuatorMap[j][2],
- kTouchValuatorMap[j][3]);
- }
- }
-}
-#endif
} // namespace
TEST(EventsXTest, ButtonEvents) {
@@ -260,76 +175,73 @@ TEST(EventsXTest, ClickCount) {
TEST(EventsXTest, TouchEventBasic) {
std::vector<unsigned int> devices;
devices.push_back(0);
- SetupTouchFactory(devices);
- SetupDeviceDataManager(devices);
- XEvent* event = NULL;
+ ui::SetupTouchDevicesForTest(devices);
std::vector<Valuator> valuators;
// Init touch begin with tracking id 5, touch id 0.
valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_MAJOR, 20));
valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_ORIENTATION, 0.3f));
valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_PRESSURE, 100));
- event = CreateTouchEvent(0, XI_TouchBegin, 5, gfx::Point(10, 10), valuators);
- EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event));
- EXPECT_EQ("10,10", ui::EventLocationFromNative(event).ToString());
- EXPECT_EQ(GetTouchId(event), 0);
- EXPECT_EQ(GetTouchRadiusX(event), 10);
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.15f);
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.1f);
- DestroyTouchEvent(event);
+ ui::XScopedTouchEvent event1(CreateTouchEvent(
+ 0, XI_TouchBegin, 5, gfx::Point(10, 10), valuators));
+ EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event1));
+ EXPECT_EQ("10,10", ui::EventLocationFromNative(event1).ToString());
+ EXPECT_EQ(GetTouchId(event1), 0);
+ EXPECT_EQ(GetTouchRadiusX(event1), 10);
+ EXPECT_FLOAT_EQ(GetTouchAngle(event1), 0.15f);
+ EXPECT_FLOAT_EQ(GetTouchForce(event1), 0.1f);
// Touch update, with new orientation info.
valuators.clear();
valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_ORIENTATION, 0.5f));
- event = CreateTouchEvent(0, XI_TouchUpdate, 5, gfx::Point(20, 20), valuators);
- EXPECT_EQ(ui::ET_TOUCH_MOVED, ui::EventTypeFromNative(event));
- EXPECT_EQ("20,20", ui::EventLocationFromNative(event).ToString());
- EXPECT_EQ(GetTouchId(event), 0);
- EXPECT_EQ(GetTouchRadiusX(event), 10);
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.25f);
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.1f);
- DestroyTouchEvent(event);
+ ui::XScopedTouchEvent event2(CreateTouchEvent(
+ 0, XI_TouchUpdate, 5, gfx::Point(20, 20), valuators));
+ EXPECT_EQ(ui::ET_TOUCH_MOVED, ui::EventTypeFromNative(event2));
+ EXPECT_EQ("20,20", ui::EventLocationFromNative(event2).ToString());
+ EXPECT_EQ(GetTouchId(event2), 0);
+ EXPECT_EQ(GetTouchRadiusX(event2), 10);
+ EXPECT_FLOAT_EQ(GetTouchAngle(event2), 0.25f);
+ EXPECT_FLOAT_EQ(GetTouchForce(event2), 0.1f);
// Another touch with tracking id 6, touch id 1.
valuators.clear();
valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_MAJOR, 100));
valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_ORIENTATION, 0.9f));
valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_PRESSURE, 500));
- event = CreateTouchEvent(
- 0, XI_TouchBegin, 6, gfx::Point(200, 200), valuators);
- EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event));
- EXPECT_EQ("200,200", ui::EventLocationFromNative(event).ToString());
- EXPECT_EQ(GetTouchId(event), 1);
- EXPECT_EQ(GetTouchRadiusX(event), 50);
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.45f);
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.5f);
- DestroyTouchEvent(event);
+ ui::XScopedTouchEvent event3(CreateTouchEvent(
+ 0, XI_TouchBegin, 6, gfx::Point(200, 200), valuators));
+ EXPECT_EQ(ui::ET_TOUCH_PRESSED, ui::EventTypeFromNative(event3));
+ EXPECT_EQ("200,200", ui::EventLocationFromNative(event3).ToString());
+ EXPECT_EQ(GetTouchId(event3), 1);
+ EXPECT_EQ(GetTouchRadiusX(event3), 50);
+ EXPECT_FLOAT_EQ(GetTouchAngle(event3), 0.45f);
+ EXPECT_FLOAT_EQ(GetTouchForce(event3), 0.5f);
// Touch with tracking id 5 should have old radius/angle value and new pressue
// value.
valuators.clear();
valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_PRESSURE, 50));
- event = CreateTouchEvent(0, XI_TouchEnd, 5, gfx::Point(30, 30), valuators);
- EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event));
- EXPECT_EQ("30,30", ui::EventLocationFromNative(event).ToString());
- EXPECT_EQ(GetTouchId(event), 0);
- EXPECT_EQ(GetTouchRadiusX(event), 10);
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.25f);
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.05f);
- DestroyTouchEvent(event);
+ ui::XScopedTouchEvent event4(CreateTouchEvent(
+ 0, XI_TouchEnd, 5, gfx::Point(30, 30), valuators));
+ EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event4));
+ EXPECT_EQ("30,30", ui::EventLocationFromNative(event4).ToString());
+ EXPECT_EQ(GetTouchId(event4), 0);
+ EXPECT_EQ(GetTouchRadiusX(event4), 10);
+ EXPECT_FLOAT_EQ(GetTouchAngle(event4), 0.25f);
+ EXPECT_FLOAT_EQ(GetTouchForce(event4), 0.05f);
// Touch with tracking id 6 should have old angle/pressure value and new
// radius value.
valuators.clear();
valuators.push_back(Valuator(DeviceDataManager::DT_TOUCH_MAJOR, 50));
- event = CreateTouchEvent(0, XI_TouchEnd, 6, gfx::Point(200, 200), valuators);
- EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event));
- EXPECT_EQ("200,200", ui::EventLocationFromNative(event).ToString());
- EXPECT_EQ(GetTouchId(event), 1);
- EXPECT_EQ(GetTouchRadiusX(event), 25);
- EXPECT_FLOAT_EQ(GetTouchAngle(event), 0.45f);
- EXPECT_FLOAT_EQ(GetTouchForce(event), 0.5f);
- DestroyTouchEvent(event);
+ ui::XScopedTouchEvent event5(CreateTouchEvent(
+ 0, XI_TouchEnd, 6, gfx::Point(200, 200), valuators));
+ EXPECT_EQ(ui::ET_TOUCH_RELEASED, ui::EventTypeFromNative(event5));
+ EXPECT_EQ("200,200", ui::EventLocationFromNative(event5).ToString());
+ EXPECT_EQ(GetTouchId(event5), 1);
+ EXPECT_EQ(GetTouchRadiusX(event5), 25);
+ EXPECT_FLOAT_EQ(GetTouchAngle(event5), 0.45f);
+ EXPECT_FLOAT_EQ(GetTouchForce(event5), 0.5f);
}
#endif
} // namespace ui
diff --git a/ui/events/x/events_x_utils.cc b/ui/events/x/events_x_utils.cc
index ebde628..416ccf2 100644
--- a/ui/events/x/events_x_utils.cc
+++ b/ui/events/x/events_x_utils.cc
@@ -11,6 +11,7 @@
#include "base/logging.h"
#include "ui/events/event_constants.h"
#include "ui/events/keycodes/keyboard_code_conversion_x.h"
+#include "ui/events/x/touch_factory_x11.h"
namespace {
@@ -150,4 +151,80 @@ EVENTS_EXPORT void InitXMouseWheelEventForTesting(int wheel_delta,
event->xbutton.button = wheel_delta > 0 ? Button4 : Button5;
}
+#if defined(USE_XI2_MT)
+const int kValuatorNum = 3;
+const int kTouchValuatorMap[kValuatorNum][4] = {
+ // { valuator_index, valuator_type, min_val, max_val }
+ { 0, DeviceDataManager::DT_TOUCH_MAJOR, 0, 1000},
+ { 1, DeviceDataManager::DT_TOUCH_ORIENTATION, 0, 1},
+ { 2, DeviceDataManager::DT_TOUCH_PRESSURE, 0, 1000},
+};
+
+XScopedTouchEvent::XScopedTouchEvent(XEvent* event) : event_(event) {
+}
+
+XScopedTouchEvent::~XScopedTouchEvent() {
+ XIDeviceEvent* xiev =
+ static_cast<XIDeviceEvent*>(event_->xcookie.data);
+ if (xiev) {
+ delete[] xiev->valuators.mask;
+ delete[] xiev->valuators.values;
+ delete xiev;
+ }
+}
+
+XEvent* CreateTouchEvent(int deviceid,
+ int evtype,
+ int tracking_id,
+ const gfx::Point& location,
+ const std::vector<Valuator>& valuators) {
+ XEvent* event = new XEvent;
+ memset(event, 0, sizeof(*event));
+ event->type = GenericEvent;
+ event->xcookie.data = new XIDeviceEvent;
+ XIDeviceEvent* xiev =
+ static_cast<XIDeviceEvent*>(event->xcookie.data);
+ memset(xiev, 0, sizeof(XIDeviceEvent));
+ xiev->deviceid = deviceid;
+ xiev->sourceid = deviceid;
+ xiev->evtype = evtype;
+ xiev->detail = tracking_id;
+ xiev->event_x = location.x();
+ xiev->event_y = location.y();
+
+ xiev->valuators.mask_len = (valuators.size() / 8) + 1;
+ xiev->valuators.mask = new unsigned char[xiev->valuators.mask_len];
+ memset(xiev->valuators.mask, 0, xiev->valuators.mask_len);
+ xiev->valuators.values = new double[valuators.size()];
+
+ int val_count = 0;
+ for (int i = 0; i < kValuatorNum; i++) {
+ for(size_t j = 0; j < valuators.size(); j++) {
+ if (valuators[j].data_type == kTouchValuatorMap[i][1]) {
+ XISetMask(xiev->valuators.mask, kTouchValuatorMap[i][0]);
+ xiev->valuators.values[val_count++] = valuators[j].value;
+ }
+ }
+ }
+
+ return event;
+}
+
+void SetupTouchDevicesForTest(const std::vector<unsigned int>& devices) {
+ TouchFactory::GetInstance()->SetTouchDeviceForTest(devices);
+ ui::DeviceDataManager* manager = ui::DeviceDataManager::GetInstance();
+ manager->SetDeviceListForTest(devices);
+ for (size_t i = 0; i < devices.size(); i++) {
+ for (int j = 0; j < kValuatorNum; j++) {
+ manager->SetDeviceValuatorForTest(
+ devices[i],
+ kTouchValuatorMap[j][0],
+ static_cast<DeviceDataManager::DataType>(kTouchValuatorMap[j][1]),
+ kTouchValuatorMap[j][2],
+ kTouchValuatorMap[j][3]);
+ }
+ }
+}
+#endif // defined(USE_XI2_MT)
+
} // namespace ui
diff --git a/ui/events/x/events_x_utils.h b/ui/events/x/events_x_utils.h
index a4cc905..c1ee0e8 100644
--- a/ui/events/x/events_x_utils.h
+++ b/ui/events/x/events_x_utils.h
@@ -2,9 +2,12 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
+#include "base/memory/scoped_ptr.h"
#include "ui/events/event_constants.h"
#include "ui/events/events_export.h"
#include "ui/events/keycodes/keyboard_codes.h"
+#include "ui/events/x/device_data_manager.h"
+#include "ui/gfx/point.h"
#include "ui/gfx/x/x11_types.h"
typedef union _XEvent XEvent;
@@ -17,6 +20,38 @@ EVENTS_EXPORT void InitXKeyEventForTesting(EventType type,
KeyboardCode key_code,
int flags,
XEvent* event);
+#if defined(USE_XI2_MT)
+struct Valuator {
+ Valuator(DeviceDataManager::DataType type, double v)
+ : data_type(type), value(v) {}
+
+ DeviceDataManager::DataType data_type;
+ double value;
+};
+
+class EVENTS_EXPORT XScopedTouchEvent {
+ public:
+ explicit XScopedTouchEvent(XEvent* event);
+ ~XScopedTouchEvent();
+
+ operator XEvent*() { return event_.get(); }
+
+ private:
+ scoped_ptr<XEvent> event_;
+
+ DISALLOW_COPY_AND_ASSIGN(XScopedTouchEvent);
+};
+
+EVENTS_EXPORT XEvent* CreateTouchEvent(int deviceid,
+ int evtype,
+ int tracking_id,
+ const gfx::Point& location,
+ const std::vector<Valuator>& valuators);
+
+EVENTS_EXPORT void SetupTouchDevicesForTest(
+ const std::vector<unsigned int>& devices);
+
+#endif // defined(USE_XI2_MT)
// Initializes a XEvent that holds XButtonEvent for testing. Note that ui::EF_
// flags should be passed as |flags|, not the native ones in <X11/X.h>.