static int vk_init(struct ev *e) { char vk_path[PATH_MAX] = "/sys/board_properties/virtualkeys."; char vks[2048], *ts; ssize_t len; int vk_fd; int i; e->vk_count = 0; len = strlen(vk_path); len = ioctl(e->fd->fd, EVIOCGNAME(sizeof(vk_path) - len), vk_path + len); if (len <= 0) return -1; vk_fd = open(vk_path, O_RDONLY); if (vk_fd < 0) return -1; len = read(vk_fd, vks, sizeof(vks)-1); close(vk_fd); if (len <= 0) return -1; vks[len] = '\0'; /* Parse a line like: keytype:keycode:centerx:centery:width:height:keytype2:keycode2:centerx2:... */ for (ts = vks, e->vk_count = 1; *ts; ++ts) { if (*ts == ':') ++e->vk_count; } if (e->vk_count % 6) { LOGW("minui: %s is %d %% 6\n", vk_path, e->vk_count % 6); } e->vk_count /= 6; if (e->vk_count <= 0) return -1; e->sent = 0; e->mt_idx = 0; ioctl(e->fd->fd, EVIOCGABS(ABS_X), &e->p.xi); ioctl(e->fd->fd, EVIOCGABS(ABS_Y), &e->p.yi); e->p.pressed = 0; ioctl(e->fd->fd, EVIOCGABS(ABS_MT_POSITION_X), &e->mt_p.xi); ioctl(e->fd->fd, EVIOCGABS(ABS_MT_POSITION_Y), &e->mt_p.yi); e->mt_p.pressed = 0; e->vks = malloc(sizeof(*e->vks) * e->vk_count); for (i = 0; i < e->vk_count; ++i) { char *token[6]; int j; for (j = 0; j < 6; ++j) { token[j] = vk_strtok_r((i||j)?NULL:vks, ":", &ts); } if (strcmp(token[0], "0x01") != 0) { /* Java does string compare, so we do too. */ LOGW("minui: %s: ignoring unknown virtual key type %s\n", vk_path, token[0]); continue; } e->vks[i].scancode = strtol(token[1], NULL, 0); e->vks[i].centerx = strtol(token[2], NULL, 0); e->vks[i].centery = strtol(token[3], NULL, 0); e->vks[i].width = strtol(token[4], NULL, 0); e->vks[i].height = strtol(token[5], NULL, 0); } return 0; }
static int vk_init(struct ev *e) { char vk_path[PATH_MAX] = "/sys/board_properties/virtualkeys."; char vks[2048], *ts = NULL; ssize_t len; int vk_fd; int i; e->vk_count = 0; len = strlen(vk_path); len = ioctl(e->fd->fd, EVIOCGNAME(sizeof(e->deviceName)), e->deviceName); if (len <= 0) { printf("Unable to query event object.\n"); return -1; } #ifdef _EVENT_LOGGING printf("Event object: %s\n", e->deviceName); #endif // Blacklist these "input" devices if (strcmp(e->deviceName, "bma250") == 0 || strcmp(e->deviceName, "bma150") == 0 || strcmp(e->deviceName, "accelerometer") == 0) { e->ignored = 1; } strcat(vk_path, e->deviceName); // Some devices split the keys from the touchscreen e->vk_count = 0; vk_fd = open(vk_path, O_RDONLY); if (vk_fd >= 0) { len = read(vk_fd, vks, sizeof(vks)-1); close(vk_fd); if (len <= 0) return -1; vks[len] = '\0'; /* Parse a line like: keytype:keycode:centerx:centery:width:height:keytype2:keycode2:centerx2:... */ for (ts = vks, e->vk_count = 1; *ts; ++ts) { if (*ts == ':') ++e->vk_count; } if (e->vk_count % 6) { printf("minui: %s is %d %% 6\n", vk_path, e->vk_count % 6); } e->vk_count /= 6; if (e->vk_count <= 0) return -1; e->down = DOWN_NOT; } ioctl(e->fd->fd, EVIOCGABS(ABS_X), &e->p.xi); ioctl(e->fd->fd, EVIOCGABS(ABS_Y), &e->p.yi); e->p.synced = 0; #ifdef _EVENT_LOGGING printf("EV: ST minX: %d maxX: %d minY: %d maxY: %d\n", e->p.xi.minimum, e->p.xi.maximum, e->p.yi.minimum, e->p.yi.maximum); #endif ioctl(e->fd->fd, EVIOCGABS(ABS_MT_POSITION_X), &e->mt_p.xi); ioctl(e->fd->fd, EVIOCGABS(ABS_MT_POSITION_Y), &e->mt_p.yi); e->mt_p.synced = 0; #ifdef _EVENT_LOGGING printf("EV: MT minX: %d maxX: %d minY: %d maxY: %d\n", e->mt_p.xi.minimum, e->mt_p.xi.maximum, e->mt_p.yi.minimum, e->mt_p.yi.maximum); #endif e->vks = malloc(sizeof(*e->vks) * e->vk_count); for (i = 0; i < e->vk_count; ++i) { char *token[6]; int j; for (j = 0; j < 6; ++j) { token[j] = vk_strtok_r((i||j)?NULL:vks, ":", &ts); } if (strcmp(token[0], "0x01") != 0) { /* Java does string compare, so we do too. */ printf("minui: %s: ignoring unknown virtual key type %s\n", vk_path, token[0]); continue; } e->vks[i].scancode = strtol(token[1], NULL, 0); e->vks[i].centerx = strtol(token[2], NULL, 0); e->vks[i].centery = strtol(token[3], NULL, 0); e->vks[i].width = strtol(token[4], NULL, 0); e->vks[i].height = strtol(token[5], NULL, 0); } return 0; }
static int vk_init(struct ev *e) { char vk_path[PATH_MAX] = "/sys/board_properties/virtualkeys."; char vks[2048], *ts = nullptr; ssize_t len; int vk_fd; int i; e->vk_count = 0; len = strlen(vk_path); len = ioctl(e->fd->fd, EVIOCGNAME(sizeof(e->deviceName)), e->deviceName); if (len <= 0) { printf("Unable to query event object.\n"); return -1; } #ifdef _EVENT_LOGGING printf("Event object: %s\n", e->deviceName); #endif auto const &input_whitelist = tw_device.tw_input_whitelist(); auto const &input_blacklist = tw_device.tw_input_blacklist(); if (!input_whitelist.empty()) { if (e->deviceName != input_whitelist) { e->ignored = 1; } } else if (input_blacklist.empty()) { // Blacklist these "input" devices if (strcmp(e->deviceName, "bma250") == 0 || strcmp(e->deviceName, "bma150") == 0 // Galaxy S4 temperature/humidity sensor sends events every few // seconds, which prevents screen blanking from happening || strcmp(e->deviceName, "temp_humidity_sensor") == 0) { printf("blacklisting %s input device\n", e->deviceName); e->ignored = 1; } } else { char* bl = strdup(input_blacklist.c_str()); char* blacklist = strtok(bl, "\n"); while (blacklist != nullptr) { if (strcmp(e->deviceName, blacklist) == 0) { printf("blacklisting %s input device\n", blacklist); e->ignored = 1; } blacklist = strtok(nullptr, "\n"); } free(bl); } strcat(vk_path, e->deviceName); // Some devices split the keys from the touchscreen e->vk_count = 0; vk_fd = open(vk_path, O_RDONLY); if (vk_fd >= 0) { len = read(vk_fd, vks, sizeof(vks) - 1); close(vk_fd); if (len <= 0) { return -1; } vks[len] = '\0'; /* Parse a line like: keytype:keycode:centerx:centery:width:height:keytype2:keycode2:centerx2:... */ for (ts = vks, e->vk_count = 1; *ts; ++ts) { if (*ts == ':') { ++e->vk_count; } } if (e->vk_count % 6) { printf("minui: %s is %d %% 6\n", vk_path, e->vk_count % 6); } e->vk_count /= 6; if (e->vk_count <= 0) { return -1; } e->down = DOWN_NOT; } ioctl(e->fd->fd, EVIOCGABS(ABS_X), &e->p.xi); ioctl(e->fd->fd, EVIOCGABS(ABS_Y), &e->p.yi); e->p.synced = 0; #ifdef _EVENT_LOGGING printf("EV: ST minX: %d maxX: %d minY: %d maxY: %d\n", e->p.xi.minimum, e->p.xi.maximum, e->p.yi.minimum, e->p.yi.maximum); #endif ioctl(e->fd->fd, EVIOCGABS(ABS_MT_POSITION_X), &e->mt_p.xi); ioctl(e->fd->fd, EVIOCGABS(ABS_MT_POSITION_Y), &e->mt_p.yi); e->mt_p.synced = 0; #ifdef _EVENT_LOGGING printf("EV: MT minX: %d maxX: %d minY: %d maxY: %d\n", e->mt_p.xi.minimum, e->mt_p.xi.maximum, e->mt_p.yi.minimum, e->mt_p.yi.maximum); #endif e->vks = (virtualkey *) malloc(sizeof(*e->vks) * e->vk_count); for (i = 0; i < e->vk_count; ++i) { char *token[6]; int j; for (j = 0; j < 6; ++j) { token[j] = vk_strtok_r((i || j) ? nullptr : vks, ":", &ts); } if (strcmp(token[0], "0x01") != 0) { /* Java does string compare, so we do too. */ printf("minui: %s: ignoring unknown virtual key type %s\n", vk_path, token[0]); continue; } e->vks[i].scancode = strtol(token[1], nullptr, 0); e->vks[i].centerx = strtol(token[2], nullptr, 0); e->vks[i].centery = strtol(token[3], nullptr, 0); e->vks[i].width = strtol(token[4], nullptr, 0); e->vks[i].height = strtol(token[5], nullptr, 0); } return 0; }