am 6f5a837c: Merge "Fix getSwitchState according to device capabilities."

* commit '6f5a837c9c4a55c82111c6cd5af6055b63fcb5a9':
  Fix getSwitchState according to device capabilities.
This commit is contained in:
Jeff Brown 2011-08-10 13:56:33 -07:00 committed by Android Git Automerger
commit 38b77d4373
2 changed files with 20 additions and 6 deletions

View File

@ -239,6 +239,7 @@ private:
String8 name; String8 name;
uint32_t classes; uint32_t classes;
uint8_t* keyBitmask; uint8_t* keyBitmask;
uint8_t* switchBitmask;
KeyLayoutMap* layoutMap; KeyLayoutMap* layoutMap;
String8 keylayoutFilename; String8 keylayoutFilename;
int fd; int fd;

View File

@ -94,11 +94,13 @@ static inline const char* toString(bool value) {
EventHub::device_t::device_t(int32_t _id, const char* _path, const char* name) EventHub::device_t::device_t(int32_t _id, const char* _path, const char* name)
: id(_id), path(_path), name(name), classes(0) : id(_id), path(_path), name(name), classes(0)
, keyBitmask(NULL), layoutMap(new KeyLayoutMap()), fd(-1), next(NULL) { , keyBitmask(NULL), switchBitmask(NULL)
, layoutMap(new KeyLayoutMap()), fd(-1), next(NULL) {
} }
EventHub::device_t::~device_t() { EventHub::device_t::~device_t() {
delete [] keyBitmask; delete [] keyBitmask;
delete [] switchBitmask;
delete layoutMap; delete layoutMap;
} }
@ -243,11 +245,14 @@ int32_t EventHub::getSwitchState(int32_t deviceId, int32_t sw) const {
} }
int32_t EventHub::getSwitchStateLocked(device_t* device, int32_t sw) const { int32_t EventHub::getSwitchStateLocked(device_t* device, int32_t sw) const {
uint8_t sw_bitmask[sizeof_bit_array(SW_MAX + 1)]; if (device->switchBitmask != NULL
memset(sw_bitmask, 0, sizeof(sw_bitmask)); && test_bit(sw, device->switchBitmask)) {
if (ioctl(device->fd, uint8_t sw_bitmask[sizeof_bit_array(SW_MAX + 1)];
EVIOCGSW(sizeof(sw_bitmask)), sw_bitmask) >= 0) { memset(sw_bitmask, 0, sizeof(sw_bitmask));
return test_bit(sw, sw_bitmask) ? AKEY_STATE_DOWN : AKEY_STATE_UP; if (ioctl(device->fd,
EVIOCGSW(sizeof(sw_bitmask)), sw_bitmask) >= 0) {
return test_bit(sw, sw_bitmask) ? AKEY_STATE_DOWN : AKEY_STATE_UP;
}
} }
return AKEY_STATE_UNKNOWN; return AKEY_STATE_UNKNOWN;
} }
@ -759,6 +764,14 @@ int EventHub::openDevice(const char *deviceName) {
} }
if (hasSwitches) { if (hasSwitches) {
device->classes |= INPUT_DEVICE_CLASS_SWITCH; device->classes |= INPUT_DEVICE_CLASS_SWITCH;
device->switchBitmask = new uint8_t[sizeof(sw_bitmask)];
if (device->switchBitmask != NULL) {
memcpy(device->switchBitmask, sw_bitmask, sizeof(sw_bitmask));
} else {
delete device;
LOGE("out of memory allocating switch bitmask");
return -1;
}
} }
#endif #endif