diff options
Diffstat (limited to 'libs/ui/EventHub.cpp')
-rw-r--r-- | libs/ui/EventHub.cpp | 48 |
1 files changed, 20 insertions, 28 deletions
diff --git a/libs/ui/EventHub.cpp b/libs/ui/EventHub.cpp index 4aac455..d45eaf0 100644 --- a/libs/ui/EventHub.cpp +++ b/libs/ui/EventHub.cpp @@ -176,7 +176,7 @@ int EventHub::getSwitchState(int32_t deviceId, int sw) const if (device == NULL) return -1; if (sw >= 0 && sw <= SW_MAX) { - uint8_t sw_bitmask[(SW_MAX+1)/8]; + uint8_t sw_bitmask[(SW_MAX+7)/8]; memset(sw_bitmask, 0, sizeof(sw_bitmask)); if (ioctl(mFDs[id_to_index(device->id)].fd, EVIOCGSW(sizeof(sw_bitmask)), sw_bitmask) >= 0) { @@ -200,7 +200,7 @@ int EventHub::getScancodeState(int32_t deviceId, int code) const if (device == NULL) return -1; if (code >= 0 && code <= KEY_MAX) { - uint8_t key_bitmask[(KEY_MAX+1)/8]; + uint8_t key_bitmask[(KEY_MAX+7)/8]; memset(key_bitmask, 0, sizeof(key_bitmask)); if (ioctl(mFDs[id_to_index(device->id)].fd, EVIOCGKEY(sizeof(key_bitmask)), key_bitmask) >= 0) { @@ -225,7 +225,7 @@ int EventHub::getKeycodeState(int32_t deviceId, int code) const Vector<int32_t> scanCodes; device->layoutMap->findScancodes(code, &scanCodes); - uint8_t key_bitmask[(KEY_MAX+1)/8]; + uint8_t key_bitmask[(KEY_MAX+7)/8]; memset(key_bitmask, 0, sizeof(key_bitmask)); if (ioctl(mFDs[id_to_index(device->id)].fd, EVIOCGKEY(sizeof(key_bitmask)), key_bitmask) >= 0) { @@ -489,7 +489,6 @@ int EventHub::open_device(const char *deviceName) { int version; int fd; - int attempt; struct pollfd *new_mFDs; device_t **new_devices; char **new_device_names; @@ -502,16 +501,11 @@ int EventHub::open_device(const char *deviceName) AutoMutex _l(mLock); - for (attempt = 0; attempt < 10; attempt++) { - fd = open(deviceName, O_RDWR); - if (fd >= 0) break; - usleep(100); - } + fd = open(deviceName, O_RDWR); if(fd < 0) { LOGE("could not open %s, %s\n", deviceName, strerror(errno)); return -1; } - LOGV("Opened device: %s (%d failures)", deviceName, attempt); if(ioctl(fd, EVIOCGVERSION, &version)) { LOGE("could not get driver version for %s, %s\n", deviceName, strerror(errno)); @@ -610,13 +604,16 @@ int EventHub::open_device(const char *deviceName) // figure out the kinds of events the device reports - // See if this is a keyboard, and classify it. - uint8_t key_bitmask[(KEY_MAX+1)/8]; + // See if this is a keyboard, and classify it. Note that we only + // consider up through the function keys; we don't want to include + // ones after that (play cd etc) so we don't mistakenly consider a + // controller to be a keyboard. + uint8_t key_bitmask[(KEY_MAX+7)/8]; memset(key_bitmask, 0, sizeof(key_bitmask)); LOGV("Getting keys..."); if (ioctl(fd, EVIOCGBIT(EV_KEY, sizeof(key_bitmask)), key_bitmask) >= 0) { //LOGI("MAP\n"); - //for (int i=0; i<((KEY_MAX+1)/8); i++) { + //for (int i=0; i<((KEY_MAX+7)/8); i++) { // LOGI("%d: 0x%02x\n", i, key_bitmask[i]); //} for (int i=0; i<((BTN_MISC+7)/8); i++) { @@ -639,7 +636,7 @@ int EventHub::open_device(const char *deviceName) // See if this is a trackball. if (test_bit(BTN_MOUSE, key_bitmask)) { - uint8_t rel_bitmask[(REL_MAX+1)/8]; + uint8_t rel_bitmask[(REL_MAX+7)/8]; memset(rel_bitmask, 0, sizeof(rel_bitmask)); LOGV("Getting relative controllers..."); if (ioctl(fd, EVIOCGBIT(EV_REL, sizeof(rel_bitmask)), rel_bitmask) >= 0) @@ -650,7 +647,7 @@ int EventHub::open_device(const char *deviceName) } } - uint8_t abs_bitmask[(ABS_MAX+1)/8]; + uint8_t abs_bitmask[(ABS_MAX+7)/8]; memset(abs_bitmask, 0, sizeof(abs_bitmask)); LOGV("Getting absolute controllers..."); ioctl(fd, EVIOCGBIT(EV_ABS, sizeof(abs_bitmask)), abs_bitmask); @@ -669,7 +666,7 @@ int EventHub::open_device(const char *deviceName) #ifdef EV_SW // figure out the switches this device reports - uint8_t sw_bitmask[(SW_MAX+1)/8]; + uint8_t sw_bitmask[(SW_MAX+7)/8]; memset(sw_bitmask, 0, sizeof(sw_bitmask)); if (ioctl(fd, EVIOCGBIT(EV_SW, sizeof(sw_bitmask)), sw_bitmask) >= 0) { for (int i=0; i<EV_SW; i++) { @@ -708,22 +705,20 @@ int EventHub::open_device(const char *deviceName) device->layoutMap->load(keylayoutFilename); // tell the world about the devname (the descriptive name) - int32_t publicID; - if (!mHaveFirstKeyboard && !defaultKeymap) { - publicID = 0; + if (!mHaveFirstKeyboard && !defaultKeymap && strstr(name, "-keypad")) { // the built-in keyboard has a well-known device ID of 0, // this device better not go away. mHaveFirstKeyboard = true; mFirstKeyboardId = device->id; + property_set("hw.keyboards.0.devname", name); } else { - publicID = device->id; // ensure mFirstKeyboardId is set to -something-. if (mFirstKeyboardId == 0) { mFirstKeyboardId = device->id; } } char propName[100]; - sprintf(propName, "hw.keyboards.%u.devname", publicID); + sprintf(propName, "hw.keyboards.%u.devname", device->id); property_set(propName, name); // 'Q' key support = cheap test of whether this is an alpha-capable kbd @@ -740,8 +735,8 @@ int EventHub::open_device(const char *deviceName) device->classes |= CLASS_DPAD; } - LOGI("New keyboard: publicID=%d device->id=0x%x devname='%s' propName='%s' keylayout='%s'\n", - publicID, device->id, name, propName, keylayoutFilename); + LOGI("New keyboard: device->id=0x%x devname='%s' propName='%s' keylayout='%s'\n", + device->id, name, propName, keylayoutFilename); } LOGI("New device: path=%s name=%s id=0x%x (of 0x%x) index=%d fd=%d classes=0x%x\n", @@ -814,18 +809,15 @@ int EventHub::close_device(const char *deviceName) device->next = mClosingDevices; mClosingDevices = device; - uint32_t publicID; if (device->id == mFirstKeyboardId) { LOGW("built-in keyboard device %s (id=%d) is closing! the apps will not like this", device->path.string(), mFirstKeyboardId); mFirstKeyboardId = 0; - publicID = 0; - } else { - publicID = device->id; + property_set("hw.keyboards.0.devname", NULL); } // clear the property char propName[100]; - sprintf(propName, "hw.keyboards.%u.devname", publicID); + sprintf(propName, "hw.keyboards.%u.devname", device->id); property_set(propName, NULL); return 0; } |