Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(41)

Unified Diff: ui/events/ozone/evdev/event_device_info.cc

Issue 671723002: [Ozone] Properly initialize multitouch slot values (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: ui/events/ozone/evdev/event_device_info.cc
diff --git a/ui/events/ozone/evdev/event_device_info.cc b/ui/events/ozone/evdev/event_device_info.cc
index 6d75ea9e0c7272cb0726c5052ea41e3e12d9dc19..e5311f226757cfebcd099f53cd9e0076fe3f5cbb 100644
--- a/ui/events/ozone/evdev/event_device_info.cc
+++ b/ui/events/ozone/evdev/event_device_info.cc
@@ -13,6 +13,11 @@ namespace ui {
namespace {
+struct MTSlotRequest {
spang 2014/10/21 19:38:36 For consistency: MtSlotRequest (and everywhere el
dnicoara 2014/10/21 20:32:12 Removed the struct for simplicity.
+ uint32_t code;
+ int32_t* values;
spang 2014/10/21 19:38:36 Should be an array.
+};
+
bool GetEventBits(int fd, unsigned int type, void* buf, unsigned int size) {
if (ioctl(fd, EVIOCGBIT(type, size), buf) < 0) {
DLOG(ERROR) << "failed EVIOCGBIT(" << type << ", " << size << ") on fd "
@@ -40,6 +45,29 @@ bool GetAbsInfo(int fd, int code, struct input_absinfo* absinfo) {
return true;
}
+bool GetSlotValues(int fd, int code, int32_t* slot_values, unsigned int size) {
+ MTSlotRequest request;
+ request.code = code;
+ request.values = slot_values;
+
+ if (ioctl(fd,
+ EVIOCGMTSLOTS(sizeof(uint32_t) + sizeof(int32_t) * size),
+ &request) < 0) {
+ LOG(ERROR) << "failed EVIOCGMTSLOTS(" << code << ") on fd " << fd;
+ return false;
+ }
+
+ return true;
+}
+
+int IndexToMTCode(int index) {
+ return index + ABS_MT_SLOT + 1;
+}
+
+int MTCodeToIndex(int code) {
+ return code - ABS_MT_SLOT - 1;
spang 2014/10/21 19:38:36 Can you make this a member function: int32_t* slo
dnicoara 2014/10/21 20:32:12 Done.
+}
+
} // namespace
EventDeviceInfo::EventDeviceInfo() {
@@ -52,9 +80,14 @@ EventDeviceInfo::EventDeviceInfo() {
memset(led_bits_, 0, sizeof(led_bits_));
memset(prop_bits_, 0, sizeof(prop_bits_));
memset(abs_info_, 0, sizeof(abs_info_));
+ memset(slot_values_, 0, sizeof(slot_values_));
}
-EventDeviceInfo::~EventDeviceInfo() {}
+EventDeviceInfo::~EventDeviceInfo() {
+ for (size_t i = 0; i < arraysize(slot_values_); ++i)
+ if (slot_values_[i])
+ delete[] slot_values_[i];
+}
bool EventDeviceInfo::Initialize(int fd) {
if (!GetEventBits(fd, 0, ev_bits_, sizeof(ev_bits_)))
@@ -86,6 +119,14 @@ bool EventDeviceInfo::Initialize(int fd) {
if (!GetAbsInfo(fd, i, &abs_info_[i]))
return false;
+ int max_num_slots = abs_info_[ABS_MT_SLOT].maximum + 1;
+ for (unsigned int i = 0; i < ABS_MT_COUNT; ++i) {
spang 2014/10/21 19:38:36 I think this should iterate over codes rather than
dnicoara 2014/10/21 20:32:12 Done.
+ slot_values_[i] = new int32[max_num_slots];
+ memset(slot_values_[i], 0, sizeof(int32) * max_num_slots);
+ if (!GetSlotValues(fd, IndexToMTCode(i), slot_values_[i], max_num_slots))
+ return false;
+ }
+
return true;
}
@@ -145,6 +186,11 @@ int32 EventDeviceInfo::GetAbsMaximum(unsigned int code) const {
return abs_info_[code].maximum;
}
+int32 EventDeviceInfo::GetSlotValue(unsigned int code,
+ unsigned int slot) const {
+ return slot_values_[MTCodeToIndex(code)][slot];
+}
+
bool EventDeviceInfo::HasAbsXY() const {
if (HasAbsEvent(ABS_X) && HasAbsEvent(ABS_Y))
return true;

Powered by Google App Engine
This is Rietveld 408576698