Chromium Code Reviews| Index: ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc |
| diff --git a/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..86f8834d389a911af1d4d38c0798aa363b85dffa |
| --- /dev/null |
| +++ b/ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.cc |
| @@ -0,0 +1,107 @@ |
| +// Copyright 2014 The Chromium 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 "ui/events/ozone/evdev/libgestures_glue/event_reader_libevdev_cros.h" |
| + |
| +#include <errno.h> |
| +#include <libevdev/libevdev.h> |
| +#include <linux/input.h> |
| + |
| +#include "base/message_loop/message_loop.h" |
| +#include "base/strings/string_util.h" |
| +#include "base/strings/stringprintf.h" |
| + |
| +namespace ui { |
| + |
| +namespace { |
| + |
| +std::string FormatLog(const char* fmt, va_list args) { |
| + std::string msg = base::StringPrintV(fmt, args); |
| + if (!msg.empty() && msg[msg.size() - 1] == '\n') |
| + msg.erase(msg.end() - 1, msg.end()); |
| + return msg; |
| +} |
| + |
| +} // namespace |
| + |
| +EventReaderLibevdevCros::EventReaderLibevdevCros(int fd, |
| + const base::FilePath& path, |
| + scoped_ptr<Delegate> delegate) |
|
rjkroege
2014/04/16 14:46:06
is this line too long?
spang
2014/04/16 15:46:37
I count 79 chars.
|
| + : path_(path), delegate_(delegate.Pass()) { |
| + memset(&evdev_, 0, sizeof(evdev_)); |
| + evdev_.log = OnLogMessage; |
| + evdev_.log_udata = this; |
| + evdev_.syn_report = OnSynReport; |
| + evdev_.syn_report_udata = this; |
| + evdev_.fd = fd; |
| + |
| + memset(&evstate_, 0, sizeof(evstate_)); |
| + evdev_.evstate = &evstate_; |
| + Event_Init(&evdev_); |
| + |
| + Event_Open(&evdev_); |
| + |
| + delegate_->OnLibEvdevCrosOpen(&evdev_, &evstate_); |
| +} |
| + |
| +EventReaderLibevdevCros::~EventReaderLibevdevCros() { |
| + Stop(); |
| + EvdevClose(&evdev_); |
| +} |
| + |
| +EventReaderLibevdevCros::Delegate::~Delegate() {} |
| + |
| +void EventReaderLibevdevCros::Start() { |
| + base::MessageLoopForUI::current()->WatchFileDescriptor( |
| + evdev_.fd, |
| + true, |
| + base::MessagePumpLibevent::WATCH_READ, |
| + &controller_, |
| + this); |
| +} |
| + |
| +void EventReaderLibevdevCros::Stop() { |
| + controller_.StopWatchingFileDescriptor(); |
| +} |
| + |
| +void EventReaderLibevdevCros::OnFileCanReadWithoutBlocking(int fd) { |
| + if (EvdevRead(&evdev_)) { |
| + if (errno == EINTR || errno == EAGAIN) |
| + return; |
| + if (errno != ENODEV) |
| + PLOG(ERROR) << "error reading device " << path_.value(); |
| + Stop(); |
| + return; |
| + } |
| +} |
| + |
| +void EventReaderLibevdevCros::OnFileCanWriteWithoutBlocking(int fd) { |
| + NOTREACHED(); |
| +} |
| + |
| +// static |
| +void EventReaderLibevdevCros::OnSynReport(void* data, |
| + EventStateRec* evstate, |
| + struct timeval* tv) { |
| + EventReaderLibevdevCros* reader = static_cast<EventReaderLibevdevCros*>(data); |
| + reader->delegate_->OnLibEvdevCrosEvent(&reader->evdev_, evstate, *tv); |
| +} |
| + |
| +// static |
| +void EventReaderLibevdevCros::OnLogMessage(void* data, |
| + int level, |
| + const char* fmt, |
| + ...) { |
| + va_list args; |
| + va_start(args, fmt); |
| + if (level >= LOGLEVEL_ERROR) |
| + LOG(ERROR) << "libevdev: " << FormatLog(fmt, args); |
| + else if (level >= LOGLEVEL_WARNING) |
| + LOG(WARNING) << "libevdev: " << FormatLog(fmt, args); |
| + else |
| + VLOG(3) << "libevdev: " << FormatLog(fmt, args); |
| + va_end(args); |
| +} |
| + |
| +} // namespace ui |