MayaFlux 0.2.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
EventAwaiter.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include "coroutine"
7
8namespace MayaFlux::Kriya {
9
10/**
11 * @class EventAwaiter
12 * @brief Awaiter for suspending on window events with optional filtering
13 *
14 * Allows coroutines to suspend until specific window events arrive.
15 * Events are filtered by type and/or input key/button, with support for
16 * both awaiting any event or specific event types.
17 *
18 * @note EventAwaiter takes EventFilter by value, so temporary filters
19 * created in next_event() and await_event() are safe.
20 *
21 * Usage Examples:
22 * @code
23 * // Wait for any event
24 * auto event = co_await event_source.next_event();
25 *
26 * // Wait for specific event type
27 * auto event = co_await event_source.await_event(WindowEventType::KEY_PRESSED);
28 *
29 * // Wait for specific key press (via EventFilter)
30 * Vruta::EventFilter filter(IO::Keys::Escape);
31 * auto event = co_await EventAwaiter(source, filter);
32 *
33 * // Manual filter construction for complex queries
34 * Vruta::EventFilter filter;
35 * filter.event_type = WindowEventType::KEY_PRESSED;
36 * filter.key_code = IO::Keys::Space;
37 * auto event = co_await EventAwaiter(source, filter);
38 * @endcode
39 *
40 * @see EventSource for creating awaiters
41 * @see EventFilter for filter construction
42 * @see IO::Keys for key enumeration
43 */
44class MAYAFLUX_API EventAwaiter {
45public:
47 : m_source(source)
48 , m_filter(filter)
49 {
50 }
51
52 ~EventAwaiter();
53
54 EventAwaiter(const EventAwaiter&) = delete;
56 EventAwaiter(EventAwaiter&&) noexcept = default;
57 EventAwaiter& operator=(EventAwaiter&&) noexcept = delete;
58
59 /**
60 * @brief Check if event already available
61 */
62 bool await_ready();
63
64 /**
65 * @brief Suspend coroutine, register for event notification
66 */
67 void await_suspend(std::coroutine_handle<> handle);
68
69 /**
70 * @brief Resume with event data
71 */
72 Core::WindowEvent await_resume();
73
74 /**
75 * @brief Called by EventSource when event arrives
76 */
77 void try_resume();
78
79private:
80 Vruta::EventSource& m_source;
81 Vruta::EventFilter m_filter;
82 Core::WindowEvent m_result;
83 std::coroutine_handle<> m_handle;
84 bool m_is_suspended = false;
85
86 friend class Vruta::EventSource;
87};
88}
EventAwaiter & operator=(const EventAwaiter &)=delete
EventAwaiter(EventAwaiter &&) noexcept=default
EventAwaiter(Vruta::EventSource &source, Vruta::EventFilter filter={})
EventAwaiter(const EventAwaiter &)=delete
Awaiter for suspending on window events with optional filtering.
Awaitable event stream for window events.
Filter criteria for window events.