| // 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_WIN32_WINDOW_H_ |
| #define FLUTTER_SHELL_PLATFORM_WINDOWS_TASK_RUNNER_WIN32_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 |