MayaFlux 0.3.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 m_pending_events.push(event);
31
32 auto waiters = m_waiters;
33 for (auto* awaiter : waiters) {
34 awaiter->try_resume();
35 }
36}
37
42
47
48std::optional<Core::WindowEvent> EventSource::pop_event(const EventFilter& filter)
49{
50 if (m_pending_events.empty()) {
51 return std::nullopt;
52 }
53
54 if (!filter.event_type && !filter.key_code && !filter.button) {
55 auto event = m_pending_events.front();
56 m_pending_events.pop();
57 return event;
58 }
59
60 std::queue<Core::WindowEvent> temp_queue;
61 std::optional<Core::WindowEvent> result;
62
63 while (!m_pending_events.empty()) {
64 auto event = m_pending_events.front();
65 m_pending_events.pop();
66
67 bool matches = true;
68
69 if (filter.event_type && event.type != *filter.event_type) {
70 matches = false;
71 }
72
73 if (matches && filter.key_code) {
74 auto key_code = static_cast<int16_t>(*filter.key_code);
75 if (auto key_data = std::get_if<Core::WindowEvent::KeyData>(&event.data)) {
76 if (key_data->key != key_code) {
77 matches = false;
78 }
79 } else {
80 matches = false;
81 }
82 }
83
84 if (matches && filter.button) {
85 auto button_code = static_cast<int>(*filter.button);
86 if (auto* button_data = std::get_if<Core::WindowEvent::MouseButtonData>(&event.data)) {
87 if (button_data->button != button_code) {
88 matches = false;
89 }
90 } else {
91 matches = false;
92 }
93 }
94
95 if (matches && !result) {
96 result = event;
97 } else {
98 temp_queue.push(event);
99 }
100 }
101
102 m_pending_events = std::move(temp_queue);
103 return result;
104}
105
107{
108 m_waiters.push_back(awaiter);
109}
110
112{
113 auto it = std::ranges::find(m_waiters, awaiter);
114 if (it != m_waiters.end()) {
115 m_waiters.erase(it);
116 }
117}
118
120{
121 auto key_int = static_cast<int16_t>(key);
122 auto it = m_key_states.find(key_int);
123 return it != m_key_states.end() && it->second;
124}
125
126bool EventSource::is_mouse_pressed(int button) const
127{
128 auto it = m_button_states.find(button);
129 return it != m_button_states.end() && it->second;
130}
131
132std::pair<double, double> EventSource::get_mouse_position() const
133{
134 return { m_mouse_x, m_mouse_y };
135}
136
137} // namespace MayaFlux::Vruta
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.