| // Copyright 2016 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "touch_keyboard/evdevsource.h" |
| |
| namespace touch_keyboard { |
| |
| bool EvdevSource::OpenSourceDevice(std::string const &source_device_path) { |
| source_fd_ = syscall_handler_->open(source_device_path.c_str(), O_RDONLY); |
| if (source_fd_ < 0) { |
| PLOG(ERROR) << "Failed to open() source device. (" << source_fd_ << ")"; |
| return false; |
| } |
| return true; |
| } |
| |
| bool EvdevSource::GetNextEvent(int timeout_ms, struct input_event *ev) const { |
| if (timeout_ms > 0) { |
| int num_ready; |
| struct timeval timeout = {0, timeout_ms * 1000}; |
| fd_set set; |
| |
| // Block until there's something to read or we hit a timeout. |
| FD_ZERO(&set); |
| FD_SET(source_fd_, &set); |
| num_ready = syscall_handler_->select(source_fd_ + 1, &set, |
| NULL, NULL, &timeout); |
| |
| // If the timeout triggered, return false instead of waiting forever. |
| if (num_ready != 1) { |
| return false; |
| } |
| } |
| |
| int num_bytes_read = syscall_handler_->read(source_fd_, ev, sizeof(*ev)); |
| if (num_bytes_read != sizeof(*ev)) { |
| PLOG(ERROR) << "ERROR: A read failed to read an entire event. Only read " << |
| num_bytes_read << " of " << sizeof(*ev) << "expected bytes."; |
| return false; |
| } |
| return true; |
| } |
| |
| } // namespace touch_keyboard |