1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "ui/ozone/platform/drm/host/host_cursor_proxy.h"
#include <utility>
#include "base/task/single_thread_task_runner.h"
#include "base/threading/platform_thread.h"
#include "base/time/time.h"
#include "ui/ozone/public/gpu_platform_support_host.h"
namespace ui {
namespace {
void DestroyRemoteOnEvdevThread(
mojo::AssociatedRemote<ui::ozone::mojom::DeviceCursor> remote) {
// Don't do anything. |remote| will automatically get destroyed.
}
} // namespace
// We assume that this is invoked only on the Mus/UI thread.
HostCursorProxy::HostCursorProxy(
mojo::PendingAssociatedRemote<ui::ozone::mojom::DeviceCursor> main_cursor,
mojo::PendingAssociatedRemote<ui::ozone::mojom::DeviceCursor> evdev_cursor)
: main_cursor_(std::move(main_cursor)),
evdev_cursor_pending_remote_(std::move(evdev_cursor)),
ui_thread_ref_(base::PlatformThread::CurrentRef()) {}
HostCursorProxy::~HostCursorProxy() {
if (evdev_task_runner_) {
evdev_task_runner_->PostTask(
FROM_HERE,
base::BindOnce(DestroyRemoteOnEvdevThread, std::move(evdev_cursor_)));
}
}
void HostCursorProxy::CursorSet(gfx::AcceleratedWidget widget,
const std::vector<SkBitmap>& bitmaps,
const std::optional<gfx::Point>& location,
base::TimeDelta frame_delay) {
if (ui_thread_ref_ == base::PlatformThread::CurrentRef()) {
main_cursor_->SetCursor(widget, bitmaps, location, frame_delay);
} else {
InitializeOnEvdevIfNecessary();
evdev_cursor_->SetCursor(widget, bitmaps, location, frame_delay);
}
}
void HostCursorProxy::Move(gfx::AcceleratedWidget widget,
const gfx::Point& location) {
if (ui_thread_ref_ == base::PlatformThread::CurrentRef()) {
main_cursor_->MoveCursor(widget, location);
} else {
InitializeOnEvdevIfNecessary();
evdev_cursor_->MoveCursor(widget, location);
}
}
void HostCursorProxy::InitializeOnEvdevIfNecessary() {
if (evdev_cursor_.is_bound())
return;
evdev_cursor_.Bind(std::move(evdev_cursor_pending_remote_));
evdev_task_runner_ = base::SingleThreadTaskRunner::GetCurrentDefault();
}
} // namespace ui
|