blob: 1dcc69740ab35838009a64eb63080f2d295c9819 [file] [log] [blame]
// Copyright 2015 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/event_thread_evdev.h"
#include <utility>
#include "base/bind.h"
#include "base/callback.h"
#include "base/logging.h"
#include "base/message_loop/message_loop.h"
#include "base/threading/thread.h"
#include "base/threading/thread_task_runner_handle.h"
#include "base/trace_event/trace_event.h"
#include "ui/events/ozone/evdev/cursor_delegate_evdev.h"
#include "ui/events/ozone/evdev/device_event_dispatcher_evdev.h"
#include "ui/events/ozone/evdev/input_device_factory_evdev.h"
#include "ui/events/ozone/evdev/input_device_factory_evdev_proxy.h"
namespace ui {
namespace {
// Internal base::Thread subclass for events thread.
class EvdevThread : public base::Thread {
public:
EvdevThread(std::unique_ptr<DeviceEventDispatcherEvdev> dispatcher,
CursorDelegateEvdev* cursor,
const EventThreadStartCallback& callback)
: base::Thread("evdev"),
dispatcher_(std::move(dispatcher)),
cursor_(cursor),
init_callback_(callback),
init_runner_(base::ThreadTaskRunnerHandle::Get()) {}
~EvdevThread() override { Stop(); }
void Init() override {
TRACE_EVENT0("evdev", "EvdevThread::Init");
input_device_factory_ =
new InputDeviceFactoryEvdev(std::move(dispatcher_), cursor_);
std::unique_ptr<InputDeviceFactoryEvdevProxy> proxy(
new InputDeviceFactoryEvdevProxy(base::ThreadTaskRunnerHandle::Get(),
input_device_factory_->GetWeakPtr()));
if (cursor_)
cursor_->InitializeOnEvdev();
init_runner_->PostTask(FROM_HERE,
base::BindOnce(init_callback_, std::move(proxy)));
}
void CleanUp() override {
TRACE_EVENT0("evdev", "EvdevThread::CleanUp");
delete input_device_factory_;
}
private:
// Initialization bits passed from main thread.
std::unique_ptr<DeviceEventDispatcherEvdev> dispatcher_;
CursorDelegateEvdev* cursor_;
EventThreadStartCallback init_callback_;
scoped_refptr<base::SingleThreadTaskRunner> init_runner_;
// Thread-internal state.
InputDeviceFactoryEvdev* input_device_factory_ = nullptr;
};
} // namespace
EventThreadEvdev::EventThreadEvdev() {
}
EventThreadEvdev::~EventThreadEvdev() {
}
void EventThreadEvdev::Start(
std::unique_ptr<DeviceEventDispatcherEvdev> dispatcher,
CursorDelegateEvdev* cursor,
const EventThreadStartCallback& callback) {
TRACE_EVENT0("evdev", "EventThreadEvdev::Start");
thread_.reset(new EvdevThread(std::move(dispatcher), cursor, callback));
base::Thread::Options thread_options;
thread_options.message_loop_type = base::MessageLoop::TYPE_UI;
thread_options.priority = base::ThreadPriority::DISPLAY;
if (!thread_->StartWithOptions(thread_options))
LOG(FATAL) << "Failed to create input thread";
}
} // namespace ui