Banjo API 0.0.1
C99 game development API
Loading...
Searching...
No Matches
event_polling.c

Event handling using the polling pattern.

Event handling using the polling pattern.This demonstrates polling events from a queue instead of using callbacks. Polling gives you fine-grained control over when and how events are processed, which is useful for game loops and custom event prioritization.

#define BJ_AUTOMAIN_CALLBACKS
#include <banjo/error.h>
#include <banjo/event.h>
#include <banjo/log.h>
#include <banjo/main.h>
#include <banjo/memory.h>
#include <banjo/system.h>
#include <banjo/time.h>
#include <banjo/window.h>
typedef struct {
size_t cursor;
size_t button;
size_t key;
size_t enter;
int bj_app_begin(void** user_data, int argc, char* argv[]) {
(void)argc; (void)argv;
return bj_callback_exit_error;
}
window = bj_bind_window("Event Polling", 100, 100, 800, 600, 0, 0);
*user_data = bj_calloc(sizeof(event_counter));
return bj_callback_continue;
}
int bj_app_iterate(void* user_data) {
event_counter* counter = (event_counter*)user_data;
// Poll events from the queue. bj_poll_events() fills the event structure
// and returns true if an event was available, false when the queue is empty.
// Process all queued events in a loop before continuing with your frame logic.
while(bj_poll_events(&e)) {
// Each event has a type field that determines which union member is valid.
switch(e.type) {
// Mouse cursor entering or leaving the window.
++counter->enter;
bj_info("Enter event, window %p, %s, (%d,%d)",
e.as.enter.enter ? "entered" : "left",
e.as.enter.x, e.as.enter.y
);
break;
// Mouse movement within the window.
++counter->cursor;
bj_info("Cursor event, window %p, (%d,%d)",
window, e.as.cursor.x, e.as.cursor.y
);
break;
// Keyboard input. Action can be PRESS, RELEASE, or REPEAT.
++counter->key;
const char* action_str = "pressed";
if(e.as.key.action != BJ_PRESS) {
action_str = e.as.key.action == BJ_RELEASE ? "released" : "repeated";
}
bj_info("Key 0x%04X (%s) Scancode 0x%04X (with no mods) was %s",
e.as.key.key, bj_key_name(e.as.key.key), e.as.key.scancode, action_str
);
// With polling, you manually check for keys like ESC and handle
// them explicitly, unlike with callbacks where you register handlers.
if(e.as.key.key == BJ_KEY_ESCAPE) {
}
break;
// Mouse button clicks. Button index and position are provided.
++counter->button;
bj_info("Button event, window %p, button %d, %s, (%d,%d)",
(void*)window, e.as.button.button,
e.as.button.action == BJ_PRESS ? "pressed" : "released",
e.as.button.x, e.as.button.y
);
break;
}
}
bj_sleep(30);
? bj_callback_exit_success
: bj_callback_continue;
}
int bj_app_end(void* user_data, int status) {
event_counter* counter = (event_counter*)user_data;
bj_info("Total events: %ld cursor, %ld button, %ld key, %ld enter",
counter->cursor, counter->button, counter->key, counter->enter
);
bj_free(counter);
bj_end();
return status;
}
int bj_app_begin(void **user_data, int argc, char *argv[])
Definition audio_pcm.c:25
int bj_app_iterate(void *user_data)
Definition audio_pcm.c:60
int bj_app_end(void *user_data, int status)
Definition audio_pcm.c:84
bj_window * window
Definition bitmap_blit.c:24
Recoverable error handling.
Sytem event management API.
size_t button
Definition event_callbacks.c:23
size_t enter
Definition event_callbacks.c:25
size_t cursor
Definition event_callbacks.c:22
size_t key
Definition event_callbacks.c:24
Definition event_callbacks.c:21
struct bj_window bj_window
Definition api.h:303
union bj_event::@102271004006361263344115053024230242311221140216 as
enum bj_event_type type
Type of event.
Definition event.h:364
const char * bj_key_name(int key)
Get the string name of a key.
bj_bool bj_poll_events(struct bj_event *event)
Poll the next pending event from the system queue.
@ BJ_KEY_ESCAPE
Esc key.
Definition event.h:85
@ BJ_EVENT_BUTTON
Mouse button.
Definition event.h:351
@ BJ_EVENT_KEY
Keyboard key.
Definition event.h:350
@ BJ_EVENT_ENTER
Mouse enter/leave.
Definition event.h:348
@ BJ_EVENT_CURSOR
Mouse move.
Definition event.h:349
@ BJ_PRESS
The key or button was pressed.
Definition event.h:301
@ BJ_RELEASE
The key or button was released.
Definition event.h:300
Represent a generic window-related event.
Definition event.h:362
#define bj_info(...)
Log a message using the BJ_LOG_INFO level.
Definition log.h:105
void * bj_calloc(size_t size)
Allocate size bytes of zero-initialized memory.
void bj_free(void *memory)
Free a previously allocated memory block.
bj_bool bj_begin(int systems, struct bj_error **error)
Initializes the system.
void bj_end(void)
De-initializes the system.
@ BJ_VIDEO_SYSTEM
Definition system.h:20
void bj_sleep(int milliseconds)
Suspends the current thread for a specified duration.
void bj_set_window_should_close(struct bj_window *window)
Flag a given window to be closed.
struct bj_window * bj_bind_window(const char *title, uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint8_t flags, struct bj_error **error)
Create a new struct bj_window with the specified attributes.
bj_bool bj_should_close_window(struct bj_window *window)
Get the close flag state of a window.
void bj_unbind_window(struct bj_window *window)
Deletes a struct bj_window object and releases associated memory.
Logging utility functions.
Portable main substitution and application callback facilities.
All memory-related functions, including custom allocators.
Header file for system interactions.
Header file for time manipulation utilities.
Header file for bj_window type.