summaryrefslogtreecommitdiffstats
path: root/minui/events.cpp
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2017-08-06 09:35:10 +0200
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-08-06 09:35:10 +0200
commita8c2f0de0117b611c3dbb8d0940f74c36930088e (patch)
tree170927726db2cc51a077f8b6ca9d87ccf00d2848 /minui/events.cpp
parentrelease-request-08461da0-a262-4ebb-8c32-784b60a151df-for-git_oc-mr1-release-4216972 snap-temp-L74000000086000437 (diff)
parentImport translations. DO NOT MERGE (diff)
downloadandroid_bootable_recovery-a8c2f0de0117b611c3dbb8d0940f74c36930088e.tar
android_bootable_recovery-a8c2f0de0117b611c3dbb8d0940f74c36930088e.tar.gz
android_bootable_recovery-a8c2f0de0117b611c3dbb8d0940f74c36930088e.tar.bz2
android_bootable_recovery-a8c2f0de0117b611c3dbb8d0940f74c36930088e.tar.lz
android_bootable_recovery-a8c2f0de0117b611c3dbb8d0940f74c36930088e.tar.xz
android_bootable_recovery-a8c2f0de0117b611c3dbb8d0940f74c36930088e.tar.zst
android_bootable_recovery-a8c2f0de0117b611c3dbb8d0940f74c36930088e.zip
Diffstat (limited to 'minui/events.cpp')
-rw-r--r--minui/events.cpp47
1 files changed, 36 insertions, 11 deletions
diff --git a/minui/events.cpp b/minui/events.cpp
index 0e1fd44a0..24c2a8277 100644
--- a/minui/events.cpp
+++ b/minui/events.cpp
@@ -53,36 +53,37 @@ static bool test_bit(size_t bit, unsigned long* array) { // NOLINT
return (array[bit/BITS_PER_LONG] & (1UL << (bit % BITS_PER_LONG))) != 0;
}
-int ev_init(ev_callback input_cb) {
- bool epollctlfail = false;
-
+int ev_init(ev_callback input_cb, bool allow_touch_inputs) {
g_epoll_fd = epoll_create(MAX_DEVICES + MAX_MISC_FDS);
if (g_epoll_fd == -1) {
return -1;
}
+ bool epollctlfail = false;
DIR* dir = opendir("/dev/input");
- if (dir != NULL) {
+ if (dir != nullptr) {
dirent* de;
while ((de = readdir(dir))) {
- // Use unsigned long to match ioctl's parameter type.
- unsigned long ev_bits[BITS_TO_LONGS(EV_MAX)]; // NOLINT
-
- // fprintf(stderr,"/dev/input/%s\n", de->d_name);
if (strncmp(de->d_name, "event", 5)) continue;
int fd = openat(dirfd(dir), de->d_name, O_RDONLY);
if (fd == -1) continue;
+ // Use unsigned long to match ioctl's parameter type.
+ unsigned long ev_bits[BITS_TO_LONGS(EV_MAX)]; // NOLINT
+
// Read the evbits of the input device.
if (ioctl(fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits) == -1) {
close(fd);
continue;
}
- // We assume that only EV_KEY, EV_REL, and EV_SW event types are ever needed.
+ // We assume that only EV_KEY, EV_REL, and EV_SW event types are ever needed. EV_ABS is also
+ // allowed if allow_touch_inputs is set.
if (!test_bit(EV_KEY, ev_bits) && !test_bit(EV_REL, ev_bits) && !test_bit(EV_SW, ev_bits)) {
- close(fd);
- continue;
+ if (!allow_touch_inputs || !test_bit(EV_ABS, ev_bits)) {
+ close(fd);
+ continue;
+ }
}
epoll_event ev;
@@ -231,3 +232,27 @@ void ev_iterate_available_keys(const std::function<void(int)>& f) {
}
}
}
+
+void ev_iterate_touch_inputs(const std::function<void(int)>& action) {
+ for (size_t i = 0; i < ev_dev_count; ++i) {
+ // Use unsigned long to match ioctl's parameter type.
+ unsigned long ev_bits[BITS_TO_LONGS(EV_MAX)] = {}; // NOLINT
+ if (ioctl(ev_fdinfo[i].fd, EVIOCGBIT(0, sizeof(ev_bits)), ev_bits) == -1) {
+ continue;
+ }
+ if (!test_bit(EV_ABS, ev_bits)) {
+ continue;
+ }
+
+ unsigned long key_bits[BITS_TO_LONGS(KEY_MAX)] = {}; // NOLINT
+ if (ioctl(ev_fdinfo[i].fd, EVIOCGBIT(EV_ABS, KEY_MAX), key_bits) == -1) {
+ continue;
+ }
+
+ for (int key_code = 0; key_code <= KEY_MAX; ++key_code) {
+ if (test_bit(key_code, key_bits)) {
+ action(key_code);
+ }
+ }
+ }
+}