Events¶
Handle user input with type-safe event polling.
Basic Event Loop¶
laya::context ctx{laya::subsystem::video};
laya::window win{"Events", {800, 600}};
bool running = true;
while (running) {
for (const auto& event : laya::poll_events()) {
if (std::holds_alternative<laya::quit_event>(event)) {
running = false;
}
}
}
Event Types¶
Quit event:
if (std::holds_alternative<laya::quit_event>(event)) {
running = false;
}
Key events:
if (std::holds_alternative<laya::key_event>(event)) {
auto& key = std::get<laya::key_event>(event);
// Handle keyboard input
}
Mouse events:
if (std::holds_alternative<laya::mouse_button_event>(event)) {
auto& mouse = std::get<laya::mouse_button_event>(event);
// Handle mouse clicks
}
Pattern Matching¶
Using std::visit:
for (const auto& event : laya::poll_events()) {
std::visit([&](const auto& ev) {
using T = std::decay_t<decltype(ev)>;
if constexpr (std::is_same_v<T, laya::quit_event>) {
running = false;
}
else if constexpr (std::is_same_v<T, laya::key_event>) {
// Handle key
}
}, event);
}
Example¶
Complete event handling:
laya::context ctx{laya::subsystem::video};
laya::window win{"Input", {800, 600}};
laya::renderer ren{win};
bool running = true;
while (running) {
for (const auto& event : laya::poll_events()) {
if (std::holds_alternative<laya::quit_event>(event)) {
running = false;
}
}
ren.clear(laya::color::black());
ren.present();
}
bool running = true;
while (running) {
// Process all pending events
for (const auto& event : laya::poll_events()) {
if (std::holds_alternative<laya::quit_event>(event)) {
running = false;
}
}
// Render
ren.clear(laya::color::black());
ren.present();
}
return 0;
}
### Event Logging
```cpp
for (const auto& event : laya::poll_events()) {
std::visit([](const auto& ev) {
using T = std::decay_t<decltype(ev)>;
if constexpr (std::is_same_v<T, laya::quit_event>) {
laya::log_info("Quit event");
}
else if constexpr (std::is_same_v<T, laya::window_event>) {
laya::log_info("Window event");
}
else if constexpr (std::is_same_v<T, laya::key_event>) {
laya::log_info("Key event");
}
}, event);
}
Filtering Events¶
// Count specific event types
int quit_count = 0;
int window_count = 0;
for (const auto& event : laya::poll_events()) {
if (std::holds_alternative<laya::quit_event>(event)) {
quit_count++;
}
else if (std::holds_alternative<laya::window_event>(event)) {
window_count++;
}
}
laya::log_info("Quit events: {}, Window events: {}",
quit_count, window_count);
Advanced Usage¶
Event Processing with Lambda¶
auto process_events = [&running](const laya::event& event) {
std::visit([&running](const auto& ev) {
```