| Index: ui/events/ozone/device/device_manager_manual.cc
|
| diff --git a/ui/events/ozone/device/device_manager_manual.cc b/ui/events/ozone/device/device_manager_manual.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f5e1eca3e4e9c3b20060ee93ab12dc57ce30e5e2
|
| --- /dev/null
|
| +++ b/ui/events/ozone/device/device_manager_manual.cc
|
| @@ -0,0 +1,74 @@
|
| +// 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/device/device_manager_manual.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/callback.h"
|
| +#include "base/files/file_enumerator.h"
|
| +#include "base/location.h"
|
| +#include "base/threading/worker_pool.h"
|
| +#include "ui/events/ozone/device/device_event.h"
|
| +#include "ui/events/ozone/device/device_event_observer.h"
|
| +
|
| +namespace ui {
|
| +
|
| +namespace {
|
| +
|
| +void ScanDevicesOnWorkerThread(std::vector<base::FilePath>* result) {
|
| + base::FileEnumerator file_enum(base::FilePath("/dev/input"),
|
| + false,
|
| + base::FileEnumerator::FILES,
|
| + "event*[0-9]");
|
| + for (base::FilePath path = file_enum.Next(); !path.empty();
|
| + path = file_enum.Next()) {
|
| + result->push_back(path);
|
| + }
|
| +}
|
| +}
|
| +
|
| +DeviceManagerManual::DeviceManagerManual()
|
| + : have_scanned_devices_(false), weak_ptr_factory_(this) {
|
| +}
|
| +
|
| +DeviceManagerManual::~DeviceManagerManual() {
|
| +}
|
| +
|
| +void DeviceManagerManual::ScanDevices(DeviceEventObserver* observer) {
|
| + if (have_scanned_devices_) {
|
| + std::vector<base::FilePath>::const_iterator it = devices_.begin();
|
| + for (; it != devices_.end(); ++it) {
|
| + DeviceEvent event(DeviceEvent::INPUT, DeviceEvent::ADD, *it);
|
| + observer->OnDeviceEvent(event);
|
| + }
|
| + } else {
|
| + std::vector<base::FilePath>* result = new std::vector<base::FilePath>();
|
| + base::WorkerPool::PostTaskAndReply(
|
| + FROM_HERE, base::Bind(&ScanDevicesOnWorkerThread, result),
|
| + base::Bind(&DeviceManagerManual::OnDevicesScanned,
|
| + weak_ptr_factory_.GetWeakPtr(), base::Owned(result)),
|
| + false /* task_is_slow */);
|
| + have_scanned_devices_ = true;
|
| + }
|
| +}
|
| +
|
| +void DeviceManagerManual::AddObserver(DeviceEventObserver* observer) {
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void DeviceManagerManual::RemoveObserver(DeviceEventObserver* observer) {
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| +void DeviceManagerManual::OnDevicesScanned(
|
| + std::vector<base::FilePath>* result) {
|
| + std::vector<base::FilePath>::const_iterator it = result->begin();
|
| + for (; it != result->end(); ++it) {
|
| + devices_.push_back(*it);
|
| + DeviceEvent event(DeviceEvent::INPUT, DeviceEvent::ADD, *it);
|
| + FOR_EACH_OBSERVER(DeviceEventObserver, observers_, OnDeviceEvent(event));
|
| + }
|
| +}
|
| +
|
| +} // namespace ui
|
|
|