From 4e32538b56e4770a82c4e897de2e8d241eb09fc1 Mon Sep 17 00:00:00 2001 From: Kenny Kerr Date: Tue, 2 Jun 2020 07:40:25 -0700 Subject: [PATCH] winui dispatcher (#648) --- cppwinrt/code_writers.h | 4 +++ cppwinrt/cppwinrt.vcxproj | 1 + cppwinrt/cppwinrt.vcxproj.filters | 3 ++ strings/base_coroutine_system_winui.h | 50 +++++++++++++++++++++++++++ 4 files changed, 58 insertions(+) create mode 100644 strings/base_coroutine_system_winui.h diff --git a/cppwinrt/code_writers.h b/cppwinrt/code_writers.h index ed0d4bd96..ee082f717 100644 --- a/cppwinrt/code_writers.h +++ b/cppwinrt/code_writers.h @@ -3168,6 +3168,10 @@ struct __declspec(empty_bases) produce_dispatch_to_overridable { w.write(strings::base_coroutine_system); } + else if (namespace_name == "Microsoft.System") + { + w.write(strings::base_coroutine_system_winui); + } else if (namespace_name == "Windows.UI.Core") { w.write(strings::base_coroutine_ui_core); diff --git a/cppwinrt/cppwinrt.vcxproj b/cppwinrt/cppwinrt.vcxproj index a87178c47..871316366 100644 --- a/cppwinrt/cppwinrt.vcxproj +++ b/cppwinrt/cppwinrt.vcxproj @@ -56,6 +56,7 @@ + diff --git a/cppwinrt/cppwinrt.vcxproj.filters b/cppwinrt/cppwinrt.vcxproj.filters index 20141f18f..069061a3b 100644 --- a/cppwinrt/cppwinrt.vcxproj.filters +++ b/cppwinrt/cppwinrt.vcxproj.filters @@ -157,6 +157,9 @@ strings + + strings + diff --git a/strings/base_coroutine_system_winui.h b/strings/base_coroutine_system_winui.h new file mode 100644 index 000000000..770573664 --- /dev/null +++ b/strings/base_coroutine_system_winui.h @@ -0,0 +1,50 @@ + +WINRT_EXPORT namespace winrt +{ + [[nodiscard]] inline auto resume_foreground( + Microsoft::System::DispatcherQueue const& dispatcher, + Microsoft::System::DispatcherQueuePriority const priority = Microsoft::System::DispatcherQueuePriority::Normal) noexcept + { + struct awaitable + { + awaitable(Microsoft::System::DispatcherQueue const& dispatcher, Microsoft::System::DispatcherQueuePriority const priority) noexcept : + m_dispatcher(dispatcher), + m_priority(priority) + { + } + + bool await_ready() const noexcept + { + return false; + } + + bool await_resume() const noexcept + { + return m_queued; + } + + bool await_suspend(std::experimental::coroutine_handle<> handle) + { + return m_dispatcher.TryEnqueue(m_priority, [handle, this] + { + m_queued = true; + handle(); + }); + } + + private: + Microsoft::System::DispatcherQueue const& m_dispatcher; + Microsoft::System::DispatcherQueuePriority const m_priority; + bool m_queued{}; + }; + + return awaitable{ dispatcher, priority }; + }; + +#ifdef __cpp_coroutines + inline auto operator co_await(Microsoft::System::DispatcherQueue const& dispatcher) + { + return resume_foreground(dispatcher); + } +#endif +}