您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
109 行
3.5 KiB
109 行
3.5 KiB
#include "ui_mono_state.h"
|
|
|
|
#include "common/settings.h"
|
|
#include "common/task_runners.h"
|
|
#include "flutter/fml/message_loop.h"
|
|
|
|
namespace uiwidgets {
|
|
|
|
UIMonoState::UIMonoState(TaskRunners task_runners, TaskObserverAdd add_callback,
|
|
TaskObserverRemove remove_callback,
|
|
fml::WeakPtr<SnapshotDelegate> snapshot_delegate,
|
|
fml::WeakPtr<IOManager> io_manager,
|
|
fml::RefPtr<SkiaUnrefQueue> skia_unref_queue,
|
|
fml::WeakPtr<ImageDecoder> image_decoder)
|
|
: task_runners_(std::move(task_runners)),
|
|
add_callback_(std::move(add_callback)),
|
|
remove_callback_(std::move(remove_callback)),
|
|
snapshot_delegate_(std::move(snapshot_delegate)),
|
|
io_manager_(std::move(io_manager)),
|
|
skia_unref_queue_(std::move(skia_unref_queue)),
|
|
image_decoder_(std::move(image_decoder)) {
|
|
AddOrRemoveTaskObserver(true /* add */);
|
|
}
|
|
|
|
UIMonoState::~UIMonoState() { AddOrRemoveTaskObserver(false /* remove */); }
|
|
|
|
UIMonoState* UIMonoState::Current() {
|
|
return static_cast<UIMonoState*>(MonoState::Current());
|
|
}
|
|
|
|
void UIMonoState::SetWindow(std::unique_ptr<Window> window) {
|
|
window_ = std::move(window);
|
|
}
|
|
|
|
const TaskRunners& UIMonoState::GetTaskRunners() const { return task_runners_; }
|
|
|
|
fml::WeakPtr<IOManager> UIMonoState::GetIOManager() const {
|
|
return io_manager_;
|
|
}
|
|
|
|
fml::RefPtr<SkiaUnrefQueue> UIMonoState::GetSkiaUnrefQueue() const {
|
|
return skia_unref_queue_;
|
|
}
|
|
|
|
void UIMonoState::ScheduleMicrotask(MonoMicrotaskQueue::CallbackFunc callback,
|
|
Mono_Handle handle) {
|
|
microtask_queue_.ScheduleMicrotask(callback, handle);
|
|
}
|
|
|
|
void UIMonoState::FlushMicrotasksNow() { microtask_queue_.RunMicrotasks(); }
|
|
|
|
void UIMonoState::AddOrRemoveTaskObserver(bool add) {
|
|
auto task_runner = task_runners_.GetUITaskRunner();
|
|
if (!task_runner) {
|
|
// This may happen in case the isolate has no thread affinity (for example,
|
|
// the service isolate).
|
|
return;
|
|
}
|
|
FML_DCHECK(add_callback_ && remove_callback_);
|
|
if (add) {
|
|
add_callback_(reinterpret_cast<intptr_t>(this),
|
|
[this]() { this->FlushMicrotasksNow(); });
|
|
} else {
|
|
remove_callback_(reinterpret_cast<intptr_t>(this));
|
|
}
|
|
}
|
|
|
|
fml::WeakPtr<SnapshotDelegate> UIMonoState::GetSnapshotDelegate() const {
|
|
return snapshot_delegate_;
|
|
}
|
|
|
|
fml::WeakPtr<GrContext> UIMonoState::GetResourceContext() const {
|
|
if (!io_manager_) {
|
|
return {};
|
|
}
|
|
return io_manager_->GetResourceContext();
|
|
}
|
|
|
|
fml::WeakPtr<ImageDecoder> UIMonoState::GetImageDecoder() const {
|
|
return image_decoder_;
|
|
}
|
|
|
|
UIWIDGETS_API(void)
|
|
UIMonoState_scheduleMicrotask(MonoMicrotaskQueue::CallbackFunc callback,
|
|
Mono_Handle handle) {
|
|
UIMonoState::Current()->ScheduleMicrotask(callback, handle);
|
|
}
|
|
|
|
UIWIDGETS_API(void)
|
|
UIMonoState_postTaskForTime(MonoMicrotaskQueue::CallbackFunc callback,
|
|
Mono_Handle handle, int64_t target_time_nanos) {
|
|
auto const weak_mono_state = MonoState::Current()->GetWeakPtr();
|
|
|
|
UIMonoState::Current()->GetTaskRunners().GetUITaskRunner()->PostTaskForTime(
|
|
[callback, handle, weak_mono_state]() -> void {
|
|
if (auto mono_state = weak_mono_state.lock()) {
|
|
MonoState::Scope mono_scope(mono_state.get());
|
|
|
|
callback(handle);
|
|
}
|
|
},
|
|
fml::TimePoint::FromEpochDelta(
|
|
fml::TimeDelta::FromNanoseconds(target_time_nanos)));
|
|
}
|
|
|
|
UIWIDGETS_API(int)
|
|
UIMonoState_timerMillisecondClock() { return Mono_TimelineGetMicros() / 1000; }
|
|
|
|
} // namespace uiwidgets
|