Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ui/events/ozone/evdev/event_device_info.h" | 5 #include "ui/events/ozone/evdev/event_device_info.h" |
| 6 | 6 |
| 7 #include <linux/input.h> | 7 #include <linux/input.h> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/threading/thread_restrictions.h" | 10 #include "base/threading/thread_restrictions.h" |
| 11 | 11 |
| 12 namespace ui { | 12 namespace ui { |
| 13 | 13 |
| 14 namespace { | 14 namespace { |
| 15 | 15 |
| 16 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.
| |
| 17 uint32_t code; | |
| 18 int32_t* values; | |
|
spang
2014/10/21 19:38:36
Should be an array.
| |
| 19 }; | |
| 20 | |
| 16 bool GetEventBits(int fd, unsigned int type, void* buf, unsigned int size) { | 21 bool GetEventBits(int fd, unsigned int type, void* buf, unsigned int size) { |
| 17 if (ioctl(fd, EVIOCGBIT(type, size), buf) < 0) { | 22 if (ioctl(fd, EVIOCGBIT(type, size), buf) < 0) { |
| 18 DLOG(ERROR) << "failed EVIOCGBIT(" << type << ", " << size << ") on fd " | 23 DLOG(ERROR) << "failed EVIOCGBIT(" << type << ", " << size << ") on fd " |
| 19 << fd; | 24 << fd; |
| 20 return false; | 25 return false; |
| 21 } | 26 } |
| 22 | 27 |
| 23 return true; | 28 return true; |
| 24 } | 29 } |
| 25 | 30 |
| 26 bool GetPropBits(int fd, void* buf, unsigned int size) { | 31 bool GetPropBits(int fd, void* buf, unsigned int size) { |
| 27 if (ioctl(fd, EVIOCGPROP(size), buf) < 0) { | 32 if (ioctl(fd, EVIOCGPROP(size), buf) < 0) { |
| 28 DLOG(ERROR) << "failed EVIOCGPROP(" << size << ") on fd " << fd; | 33 DLOG(ERROR) << "failed EVIOCGPROP(" << size << ") on fd " << fd; |
| 29 return false; | 34 return false; |
| 30 } | 35 } |
| 31 | 36 |
| 32 return true; | 37 return true; |
| 33 } | 38 } |
| 34 | 39 |
| 35 bool GetAbsInfo(int fd, int code, struct input_absinfo* absinfo) { | 40 bool GetAbsInfo(int fd, int code, struct input_absinfo* absinfo) { |
| 36 if (ioctl(fd, EVIOCGABS(code), absinfo)) { | 41 if (ioctl(fd, EVIOCGABS(code), absinfo)) { |
| 37 DLOG(ERROR) << "failed EVIOCGABS(" << code << ") on fd " << fd; | 42 DLOG(ERROR) << "failed EVIOCGABS(" << code << ") on fd " << fd; |
| 38 return false; | 43 return false; |
| 39 } | 44 } |
| 40 return true; | 45 return true; |
| 41 } | 46 } |
| 42 | 47 |
| 48 bool GetSlotValues(int fd, int code, int32_t* slot_values, unsigned int size) { | |
| 49 MTSlotRequest request; | |
| 50 request.code = code; | |
| 51 request.values = slot_values; | |
| 52 | |
| 53 if (ioctl(fd, | |
| 54 EVIOCGMTSLOTS(sizeof(uint32_t) + sizeof(int32_t) * size), | |
| 55 &request) < 0) { | |
| 56 LOG(ERROR) << "failed EVIOCGMTSLOTS(" << code << ") on fd " << fd; | |
| 57 return false; | |
| 58 } | |
| 59 | |
| 60 return true; | |
| 61 } | |
| 62 | |
| 63 int IndexToMTCode(int index) { | |
| 64 return index + ABS_MT_SLOT + 1; | |
| 65 } | |
| 66 | |
| 67 int MTCodeToIndex(int code) { | |
| 68 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.
| |
| 69 } | |
| 70 | |
| 43 } // namespace | 71 } // namespace |
| 44 | 72 |
| 45 EventDeviceInfo::EventDeviceInfo() { | 73 EventDeviceInfo::EventDeviceInfo() { |
| 46 memset(ev_bits_, 0, sizeof(ev_bits_)); | 74 memset(ev_bits_, 0, sizeof(ev_bits_)); |
| 47 memset(key_bits_, 0, sizeof(key_bits_)); | 75 memset(key_bits_, 0, sizeof(key_bits_)); |
| 48 memset(rel_bits_, 0, sizeof(rel_bits_)); | 76 memset(rel_bits_, 0, sizeof(rel_bits_)); |
| 49 memset(abs_bits_, 0, sizeof(abs_bits_)); | 77 memset(abs_bits_, 0, sizeof(abs_bits_)); |
| 50 memset(msc_bits_, 0, sizeof(msc_bits_)); | 78 memset(msc_bits_, 0, sizeof(msc_bits_)); |
| 51 memset(sw_bits_, 0, sizeof(sw_bits_)); | 79 memset(sw_bits_, 0, sizeof(sw_bits_)); |
| 52 memset(led_bits_, 0, sizeof(led_bits_)); | 80 memset(led_bits_, 0, sizeof(led_bits_)); |
| 53 memset(prop_bits_, 0, sizeof(prop_bits_)); | 81 memset(prop_bits_, 0, sizeof(prop_bits_)); |
| 54 memset(abs_info_, 0, sizeof(abs_info_)); | 82 memset(abs_info_, 0, sizeof(abs_info_)); |
| 83 memset(slot_values_, 0, sizeof(slot_values_)); | |
| 55 } | 84 } |
| 56 | 85 |
| 57 EventDeviceInfo::~EventDeviceInfo() {} | 86 EventDeviceInfo::~EventDeviceInfo() { |
| 87 for (size_t i = 0; i < arraysize(slot_values_); ++i) | |
| 88 if (slot_values_[i]) | |
| 89 delete[] slot_values_[i]; | |
| 90 } | |
| 58 | 91 |
| 59 bool EventDeviceInfo::Initialize(int fd) { | 92 bool EventDeviceInfo::Initialize(int fd) { |
| 60 if (!GetEventBits(fd, 0, ev_bits_, sizeof(ev_bits_))) | 93 if (!GetEventBits(fd, 0, ev_bits_, sizeof(ev_bits_))) |
| 61 return false; | 94 return false; |
| 62 | 95 |
| 63 if (!GetEventBits(fd, EV_KEY, key_bits_, sizeof(key_bits_))) | 96 if (!GetEventBits(fd, EV_KEY, key_bits_, sizeof(key_bits_))) |
| 64 return false; | 97 return false; |
| 65 | 98 |
| 66 if (!GetEventBits(fd, EV_REL, rel_bits_, sizeof(rel_bits_))) | 99 if (!GetEventBits(fd, EV_REL, rel_bits_, sizeof(rel_bits_))) |
| 67 return false; | 100 return false; |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 79 return false; | 112 return false; |
| 80 | 113 |
| 81 if (!GetPropBits(fd, prop_bits_, sizeof(prop_bits_))) | 114 if (!GetPropBits(fd, prop_bits_, sizeof(prop_bits_))) |
| 82 return false; | 115 return false; |
| 83 | 116 |
| 84 for (unsigned int i = 0; i < ABS_CNT; ++i) | 117 for (unsigned int i = 0; i < ABS_CNT; ++i) |
| 85 if (HasAbsEvent(i)) | 118 if (HasAbsEvent(i)) |
| 86 if (!GetAbsInfo(fd, i, &abs_info_[i])) | 119 if (!GetAbsInfo(fd, i, &abs_info_[i])) |
| 87 return false; | 120 return false; |
| 88 | 121 |
| 122 int max_num_slots = abs_info_[ABS_MT_SLOT].maximum + 1; | |
| 123 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.
| |
| 124 slot_values_[i] = new int32[max_num_slots]; | |
| 125 memset(slot_values_[i], 0, sizeof(int32) * max_num_slots); | |
| 126 if (!GetSlotValues(fd, IndexToMTCode(i), slot_values_[i], max_num_slots)) | |
| 127 return false; | |
| 128 } | |
| 129 | |
| 89 return true; | 130 return true; |
| 90 } | 131 } |
| 91 | 132 |
| 92 bool EventDeviceInfo::HasEventType(unsigned int type) const { | 133 bool EventDeviceInfo::HasEventType(unsigned int type) const { |
| 93 if (type > EV_MAX) | 134 if (type > EV_MAX) |
| 94 return false; | 135 return false; |
| 95 return EvdevBitIsSet(ev_bits_, type); | 136 return EvdevBitIsSet(ev_bits_, type); |
| 96 } | 137 } |
| 97 | 138 |
| 98 bool EventDeviceInfo::HasKeyEvent(unsigned int code) const { | 139 bool EventDeviceInfo::HasKeyEvent(unsigned int code) const { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 138 } | 179 } |
| 139 | 180 |
| 140 int32 EventDeviceInfo::GetAbsMinimum(unsigned int code) const { | 181 int32 EventDeviceInfo::GetAbsMinimum(unsigned int code) const { |
| 141 return abs_info_[code].minimum; | 182 return abs_info_[code].minimum; |
| 142 } | 183 } |
| 143 | 184 |
| 144 int32 EventDeviceInfo::GetAbsMaximum(unsigned int code) const { | 185 int32 EventDeviceInfo::GetAbsMaximum(unsigned int code) const { |
| 145 return abs_info_[code].maximum; | 186 return abs_info_[code].maximum; |
| 146 } | 187 } |
| 147 | 188 |
| 189 int32 EventDeviceInfo::GetSlotValue(unsigned int code, | |
| 190 unsigned int slot) const { | |
| 191 return slot_values_[MTCodeToIndex(code)][slot]; | |
| 192 } | |
| 193 | |
| 148 bool EventDeviceInfo::HasAbsXY() const { | 194 bool EventDeviceInfo::HasAbsXY() const { |
| 149 if (HasAbsEvent(ABS_X) && HasAbsEvent(ABS_Y)) | 195 if (HasAbsEvent(ABS_X) && HasAbsEvent(ABS_Y)) |
| 150 return true; | 196 return true; |
| 151 | 197 |
| 152 if (HasAbsEvent(ABS_MT_POSITION_X) && HasAbsEvent(ABS_MT_POSITION_Y)) | 198 if (HasAbsEvent(ABS_MT_POSITION_X) && HasAbsEvent(ABS_MT_POSITION_Y)) |
| 153 return true; | 199 return true; |
| 154 | 200 |
| 155 return false; | 201 return false; |
| 156 } | 202 } |
| 157 | 203 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 176 // Touchpads are not mapped to the screen. | 222 // Touchpads are not mapped to the screen. |
| 177 if (HasKeyEvent(BTN_LEFT) || HasKeyEvent(BTN_MIDDLE) || | 223 if (HasKeyEvent(BTN_LEFT) || HasKeyEvent(BTN_MIDDLE) || |
| 178 HasKeyEvent(BTN_RIGHT) || HasKeyEvent(BTN_TOOL_FINGER)) | 224 HasKeyEvent(BTN_RIGHT) || HasKeyEvent(BTN_TOOL_FINGER)) |
| 179 return false; | 225 return false; |
| 180 | 226 |
| 181 // Touchscreens are mapped to the screen. | 227 // Touchscreens are mapped to the screen. |
| 182 return true; | 228 return true; |
| 183 } | 229 } |
| 184 | 230 |
| 185 } // namespace ui | 231 } // namespace ui |
| OLD | NEW |