| // Copyright 2020 The Fuchsia 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 "src/ui/lib/input_report_reader/input_reader.h" | |
| #include <fuchsia/ui/scenic/cpp/fidl.h> | |
| #include <lib/async/default.h> | |
| #include <lib/syslog/cpp/macros.h> | |
| #include "src/ui/lib/input_report_reader/fdio_device_watcher.h" | |
| #include "src/ui/lib/input_report_reader/input_interpreter.h" | |
| namespace ui_input { | |
| namespace { | |
| constexpr char kInputDevPath[] = "/dev/class/input-report"; | |
| } | |
| InputReader::InputReader(fuchsia::ui::input::InputDeviceRegistry* registry, bool ignore_console) | |
| : registry_(registry), ignore_console_(ignore_console) { | |
| FX_CHECK(registry_); | |
| } | |
| InputReader::~InputReader() = default; | |
| void InputReader::Start() { Start(std::make_unique<FdioDeviceWatcher>(kInputDevPath)); } | |
| void InputReader::Start(std::unique_ptr<DeviceWatcher> device_watcher) { | |
| device_watcher_ = std::move(device_watcher); | |
| device_watcher_->Watch([this](zx::channel channel) { | |
| std::unique_ptr<InputInterpreter> interpreter = InputInterpreter::Create( | |
| this, std::move(channel), registry_, std::to_string(next_interpreter_id_++)); | |
| if (!interpreter) { | |
| return; | |
| } | |
| FX_VLOGS(1) << "Input device " << interpreter->name() << " added "; | |
| devices_.emplace(interpreter.get(), std::move(interpreter)); | |
| }); | |
| } | |
| // Register to receive notifications that display ownership has changed | |
| void InputReader::SetOwnershipEvent(zx::event event) { | |
| display_ownership_waiter_.Cancel(); | |
| display_ownership_event_ = std::move(event); | |
| // Add handler to listen for signals on this event | |
| zx_signals_t signals = | |
| fuchsia::ui::scenic::displayOwnedSignal | fuchsia::ui::scenic::displayNotOwnedSignal; | |
| display_ownership_waiter_.set_object(display_ownership_event_.get()); | |
| display_ownership_waiter_.set_trigger(signals); | |
| zx_status_t status = display_ownership_waiter_.Begin(async_get_default_dispatcher()); | |
| FX_DCHECK(status == ZX_OK) << "Status is: " << status; | |
| } | |
| void InputReader::RemoveDevice(InputInterpreter* device) { | |
| devices_.erase(device); | |
| } | |
| void InputReader::OnDisplayHandleReady(async_dispatcher_t* dispatcher, async::WaitBase* wait, | |
| zx_status_t status, const zx_packet_signal_t* signal) { | |
| if (status != ZX_OK) { | |
| FX_LOGS(ERROR) << "InputReader::OnDisplayHandleReady received an error status code: " << status; | |
| return; | |
| } | |
| zx_signals_t pending = signal->observed; | |
| if (pending & fuchsia::ui::scenic::displayNotOwnedSignal) { | |
| display_owned_ = false; | |
| display_ownership_waiter_.set_trigger(fuchsia::ui::scenic::displayOwnedSignal); | |
| auto waiter_status = display_ownership_waiter_.Begin(dispatcher); | |
| FX_CHECK(waiter_status == ZX_OK); | |
| } else if (pending & fuchsia::ui::scenic::displayOwnedSignal) { | |
| display_owned_ = true; | |
| display_ownership_waiter_.set_trigger(fuchsia::ui::scenic::displayNotOwnedSignal); | |
| auto waiter_status = display_ownership_waiter_.Begin(dispatcher); | |
| FX_CHECK(waiter_status == ZX_OK); | |
| } | |
| } | |
| } // namespace ui_input |