| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #ifndef FLUTTER_SHELL_PLATFORM_WINDOWS_TASK_RUNNER_WINDOW_H_ | |
| #define FLUTTER_SHELL_PLATFORM_WINDOWS_TASK_RUNNER_WINDOW_H_ | |
| #include <windows.h> | |
| #include <chrono> | |
| #include <memory> | |
| #include <string> | |
| #include <vector> | |
| #include "flutter/fml/macros.h" | |
| namespace flutter { | |
| // Hidden HWND responsible for processing flutter tasks on main thread | |
| class TaskRunnerWindow { | |
| public: | |
| class Delegate { | |
| public: | |
| // Executes expired task, and returns the duration until the next task | |
| // deadline if exists, otherwise returns `std::chrono::nanoseconds::max()`. | |
| // | |
| // Each platform implementation must call this to schedule the tasks. | |
| virtual std::chrono::nanoseconds ProcessTasks() = 0; | |
| }; | |
| static std::shared_ptr<TaskRunnerWindow> GetSharedInstance(); | |
| // Triggers processing delegate tasks on main thread | |
| void WakeUp(); | |
| void AddDelegate(Delegate* delegate); | |
| void RemoveDelegate(Delegate* delegate); | |
| ~TaskRunnerWindow(); | |
| private: | |
| TaskRunnerWindow(); | |
| void ProcessTasks(); | |
| void SetTimer(std::chrono::nanoseconds when); | |
| WNDCLASS RegisterWindowClass(); | |
| LRESULT | |
| HandleMessage(UINT const message, | |
| WPARAM const wparam, | |
| LPARAM const lparam) noexcept; | |
| static LRESULT CALLBACK WndProc(HWND const window, | |
| UINT const message, | |
| WPARAM const wparam, | |
| LPARAM const lparam) noexcept; | |
| HWND window_handle_; | |
| std::wstring window_class_name_; | |
| std::vector<Delegate*> delegates_; | |
| FML_DISALLOW_COPY_AND_ASSIGN(TaskRunnerWindow); | |
| }; | |
| } // namespace flutter | |
| #endif // FLUTTER_SHELL_PLATFORM_WINDOWS_TASK_RUNNER_WINDOW_H_ |