MayaFlux 0.4.0
Digital-First Multimedia Processing Framework
Loading...
Searching...
No Matches
EventSource.cpp
Go to the documentation of this file.
1#include "EventSource.hpp"
2
4
5namespace MayaFlux::Vruta {
6
8{
9 if (auto* key_data = std::get_if<Core::WindowEvent::KeyData>(&event.data)) {
11 m_key_states[key_data->key] = true;
12 } else if (event.type == Core::WindowEventType::KEY_RELEASED) {
13 m_key_states[key_data->key] = false;
14 }
15 }
16
17 if (auto* button_data = std::get_if<Core::WindowEvent::MouseButtonData>(&event.data)) {
19 m_button_states[button_data->button] = true;
21 m_button_states[button_data->button] = false;
22 }
23 }
24
25 if (auto* pos_data = std::get_if<Core::WindowEvent::MousePosData>(&event.data)) {
26 m_mouse_x = pos_data->x;
27 m_mouse_y = pos_data->y;
28 }
29
30 if (m_waiters.empty()) {
31 return;
32 }
33
34 bool any_waiter_matches = std::ranges::any_of(m_waiters, [&](const Kriya::EventAwaiter* w) {
35 return w->filter_matches(event);
36 });
37
38 if (!any_waiter_matches)
39 return;
40
41 m_pending_events.push(event);
42
43 auto waiters = m_waiters;
44 for (auto* awaiter : waiters) {
45 awaiter->try_resume();
46 }
47}
48
53
58
59std::optional<Core::WindowEvent> EventSource::pop_event(const EventFilter& filter)
60{
61 if (m_pending_events.empty()) {
62 return std::nullopt;
63 }
64
65 if (!filter.event_type && !filter.key_code && !filter.button) {
66 auto event = m_pending_events.front();
67 m_pending_events.pop();
68 return event;
69 }
70
71 std::queue<Core::WindowEvent> temp_queue;
72 std::optional<Core::WindowEvent> result;
73
74 while (!m_pending_events.empty()) {
75 auto event = m_pending_events.front();
76 m_pending_events.pop();
77
78 bool matches = true;
79
80 if (filter.event_type && event.type != *filter.event_type) {
81 matches = false;
82 }
83
84 if (matches && filter.key_code) {
85 auto key_code = static_cast<int16_t>(*filter.key_code);
86 if (auto key_data = std::get_if<Core::WindowEvent::KeyData>(&event.data)) {
87 if (key_data->key != key_code) {
88 matches = false;
89 }
90 } else {
91 matches = false;
92 }
93 }
94
95 if (matches && filter.button) {
96 auto button_code = static_cast<int>(*filter.button);
97 if (auto* button_data = std::get_if<Core::WindowEvent::MouseButtonData>(&event.data)) {
98 if (button_data->button != button_code) {
99 matches = false;
100 }
101 } else {
102 matches = false;
103 }
104 }
105
106 if (matches && !result) {
107 result = event;
108 } else {
109 temp_queue.push(event);
110 }
111 }
112
113 m_pending_events = std::move(temp_queue);
114 return result;
115}
116
118{
119 m_waiters.push_back(awaiter);
120}
121
123{
124 auto it = std::ranges::find(m_waiters, awaiter);
125 if (it != m_waiters.end()) {
126 m_waiters.erase(it);
127 }
128}
129
131{
132 auto key_int = static_cast<int16_t>(key);
133 auto it = m_key_states.find(key_int);
134 return it != m_key_states.end() && it->second;
135}
136
137bool EventSource::is_mouse_pressed(int button) const
138{
139 auto it = m_button_states.find(button);
140 return it != m_button_states.end() && it->second;
141}
142
143std::pair<double, double> EventSource::get_mouse_position() const
144{
145 return { m_mouse_x, m_mouse_y };
146}
147
148} // namespace MayaFlux::Vruta
bool filter_matches(const Core::WindowEvent &event) const
Awaiter for suspending on window events with optional filtering.
bool is_mouse_pressed(int button) const
Query if a specific mouse button is currently pressed.
std::unordered_map< int, bool > m_button_states
std::optional< Core::WindowEvent > pop_event(const EventFilter &filter)
Pop event matching filter from queue.
Kriya::EventAwaiter next_event()
Creates awaiter for next event (any type)
std::vector< Kriya::EventAwaiter * > m_waiters
void register_waiter(Kriya::EventAwaiter *awaiter)
bool is_key_pressed(IO::Keys key) const
Query if a specific key is currently pressed.
std::queue< Core::WindowEvent > m_pending_events
Kriya::EventAwaiter await_event(Core::WindowEventType type)
Creates awaiter for specific event type.
std::unordered_map< int16_t, bool > m_key_states
void unregister_waiter(Kriya::EventAwaiter *awaiter)
void signal(Core::WindowEvent event)
Signals that an event occurred.
std::pair< double, double > get_mouse_position() const
Get current mouse position.
WindowEventType
Types of window and input events.
Event data for window and input events.
std::optional< IO::Keys > key_code
std::optional< IO::MouseButtons > button
std::optional< Core::WindowEventType > event_type
Filter criteria for window events.