| 142 | } |
| 143 | |
| 144 | OpenKneeboard::fire_and_forget APIEventServer::DispatchEvent( |
| 145 | std::string_view ref) { |
| 146 | const auto stayingAlive = shared_from_this(); |
| 147 | const std::string buffer(ref); |
| 148 | auto event = APIEvent::Unserialize(buffer); |
| 149 | |
| 150 | co_await mUIThread; |
| 151 | OPENKNEEBOARD_TraceLoggingCoro( |
| 152 | "APIEvent", TraceLoggingValue(event.name.c_str(), "Name")); |
| 153 | if (event.name != APIEvent::EVT_MULTI_EVENT) { |
| 154 | this->evAPIEvent.Emit(event); |
| 155 | co_return; |
| 156 | } |
| 157 | |
| 158 | std::vector<std::tuple<std::string, std::string>> events; |
| 159 | events = nlohmann::json::parse(event.value); |
| 160 | auto dq = DispatcherQueue::GetForCurrentThread(); |
| 161 | for (auto&& [name, value]: events) { |
| 162 | OPENKNEEBOARD_TraceLoggingCoro( |
| 163 | "APIEvent/Multi", TraceLoggingValue(name.c_str(), "Name")); |
| 164 | this->evAPIEvent.Emit({name, value}); |
| 165 | // Re-enter event loop, even if not switching threads |
| 166 | co_await wil::resume_foreground(dq); |
| 167 | } |
| 168 | |
| 169 | co_return; |
| 170 | } |
| 171 | |
| 172 | }// namespace OpenKneeboard |