2024-09-06 23:08:08 +02:00
|
|
|
#include "events.h"
|
|
|
|
|
|
|
|
#include "util/log.h"
|
2024-09-06 23:08:08 +02:00
|
|
|
#include "util/thread.h"
|
2024-09-06 23:08:08 +02:00
|
|
|
|
|
|
|
bool
|
|
|
|
sc_push_event_impl(uint32_t type, const char *name) {
|
|
|
|
SDL_Event event;
|
|
|
|
event.type = type;
|
|
|
|
int ret = SDL_PushEvent(&event);
|
|
|
|
// ret < 0: error (queue full)
|
|
|
|
// ret == 0: event was filtered
|
|
|
|
// ret == 1: success
|
|
|
|
if (ret != 1) {
|
|
|
|
LOGE("Could not post %s event: %s", name, SDL_GetError());
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
2024-09-06 23:08:08 +02:00
|
|
|
|
|
|
|
bool
|
|
|
|
sc_post_to_main_thread(sc_runnable_fn run, void *userdata) {
|
|
|
|
SDL_Event event = {
|
|
|
|
.user = {
|
|
|
|
.type = SC_EVENT_RUN_ON_MAIN_THREAD,
|
|
|
|
.data1 = run,
|
|
|
|
.data2 = userdata,
|
|
|
|
},
|
|
|
|
};
|
|
|
|
int ret = SDL_PushEvent(&event);
|
|
|
|
// ret < 0: error (queue full)
|
|
|
|
// ret == 0: event was filtered
|
|
|
|
// ret == 1: success
|
|
|
|
if (ret != 1) {
|
|
|
|
if (ret == 0) {
|
|
|
|
// if ret == 0, this is expected on exit, log in debug mode
|
|
|
|
LOGD("Could not post runnable to main thread (filtered)");
|
|
|
|
} else {
|
|
|
|
assert(ret < 0);
|
|
|
|
LOGW("Could not post runnable to main thread: %s", SDL_GetError());
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int SDLCALL
|
|
|
|
task_event_filter(void *userdata, SDL_Event *event) {
|
|
|
|
(void) userdata;
|
|
|
|
|
|
|
|
if (event->type == SC_EVENT_RUN_ON_MAIN_THREAD) {
|
|
|
|
// Reject this event type from now on
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
sc_reject_new_runnables(void) {
|
|
|
|
assert(sc_thread_get_id() == SC_MAIN_THREAD_ID);
|
|
|
|
|
|
|
|
SDL_SetEventFilter(task_event_filter, NULL);
|
|
|
|
}
|