SDL_events.c
Go to the documentation of this file.
/*
Simple DirectMedia Layer
Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org>
This software is provided 'as-is', without any express or implied
warranty. In no event will the authors be held liable for any damages
arising from the use of this software.
Permission is granted to anyone to use this software for any purpose,
including commercial applications, and to alter it and redistribute it
freely, subject to the following restrictions:
1. The origin of this software must not be misrepresented; you must not
claim that you wrote the original software. If you use this software
in a product, an acknowledgment in the product documentation would be
appreciated but is not required.
2. Altered source versions must be plainly marked as such, and must not be
misrepresented as being the original software.
3. This notice may not be removed or altered from any source distribution.
*/
#include "../SDL_internal.h"
/* General event handling code for SDL */
#include "SDL.h"
#include "SDL_events.h"
#include "SDL_thread.h"
#include "SDL_events_c.h"
#include "../timer/SDL_timer_c.h"
#if !SDL_JOYSTICK_DISABLED
#include "../joystick/SDL_joystick_c.h"
#endif
#include "../video/SDL_sysvideo.h"
#include "SDL_syswm.h"
/*#define SDL_DEBUG_EVENTS 1*/
/* An arbitrary limit so we don't have unbounded growth */
#define SDL_MAX_QUEUED_EVENTS 65535
typedef struct SDL_EventWatcher {
SDL_EventFilter callback;
void *userdata;
SDL_bool removed;
} SDL_EventWatcher;
static SDL_mutex *SDL_event_watchers_lock;
static SDL_EventWatcher SDL_EventOK;
static SDL_EventWatcher *SDL_event_watchers = NULL;
static int SDL_event_watchers_count = 0;
static SDL_bool SDL_event_watchers_dispatching = SDL_FALSE;
static SDL_bool SDL_event_watchers_removed = SDL_FALSE;
typedef struct {
Uint32 bits[8];
} SDL_DisabledEventBlock;
static SDL_DisabledEventBlock *SDL_disabled_events[256];
static Uint32 SDL_userevents = SDL_USEREVENT;
/* Private data -- event queue */
typedef struct _SDL_EventEntry
{
SDL_Event event;
SDL_SysWMmsg msg;
struct _SDL_EventEntry *prev;
struct _SDL_EventEntry *next;
} SDL_EventEntry;
typedef struct _SDL_SysWMEntry
{
SDL_SysWMmsg msg;
struct _SDL_SysWMEntry *next;
} SDL_SysWMEntry;
static struct
{
SDL_mutex *lock;
SDL_atomic_t active;
SDL_atomic_t count;
int max_events_seen;
SDL_EventEntry *head;
SDL_EventEntry *tail;
SDL_EventEntry *free;
SDL_SysWMEntry *wmmsg_used;
SDL_SysWMEntry *wmmsg_free;
} SDL_EventQ = { NULL, { 1 }, { 0 }, 0, NULL, NULL, NULL, NULL, NULL };
#ifdef SDL_DEBUG_EVENTS
/* this is to make printf() calls cleaner. */
#define uint unsigned int
static void
SDL_DebugPrintEvent(const SDL_Event *event)
{
/* !!! FIXME: This code is kinda ugly, sorry. */
printf("SDL EVENT: ");
if ((event->type >= SDL_USEREVENT) && (event->type <= SDL_LASTEVENT)) {
printf("SDL_USEREVENT");
if (event->type > SDL_USEREVENT) {
printf("+%u", ((uint) event->type) - SDL_USEREVENT);
}
printf(" (timestamp=%u windowid=%u code=%d data1=%p data2=%p)",
(uint) event->user.timestamp, (uint) event->user.windowID,
(int) event->user.code, event->user.data1, event->user.data2);
return;
}
switch (event->type) {
#define SDL_EVENT_CASE(x) case x: printf("%s", #x);
SDL_EVENT_CASE(SDL_FIRSTEVENT) printf("(THIS IS PROBABLY A BUG!)"); break;
SDL_EVENT_CASE(SDL_QUIT) printf("(timestamp=%u)", (uint) event->quit.timestamp); break;
SDL_EVENT_CASE(SDL_APP_TERMINATING) break;
SDL_EVENT_CASE(SDL_APP_LOWMEMORY) break;
SDL_EVENT_CASE(SDL_APP_WILLENTERBACKGROUND) break;
SDL_EVENT_CASE(SDL_APP_DIDENTERBACKGROUND) break;
SDL_EVENT_CASE(SDL_APP_WILLENTERFOREGROUND) break;
SDL_EVENT_CASE(SDL_APP_DIDENTERFOREGROUND) break;
SDL_EVENT_CASE(SDL_KEYMAPCHANGED) break;
SDL_EVENT_CASE(SDL_CLIPBOARDUPDATE) break;
SDL_EVENT_CASE(SDL_RENDER_TARGETS_RESET) break;
SDL_EVENT_CASE(SDL_RENDER_DEVICE_RESET) break;
#undef SDL_EVENT_CASE
#define SDL_EVENT_CASE(x) case x: printf("%s ", #x);
SDL_EVENT_CASE(SDL_WINDOWEVENT)
printf("(timestamp=%u windowid=%u event=", (uint) event->window.timestamp, (uint) event->window.windowID);
switch(event->window.event) {
case SDL_WINDOWEVENT_NONE: printf("none(THIS IS PROBABLY A BUG!)"); break;
#define SDL_WINDOWEVENT_CASE(x) case x: printf("%s", #x); break
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_SHOWN);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_HIDDEN);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_EXPOSED);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_MOVED);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_RESIZED);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_SIZE_CHANGED);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_MINIMIZED);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_MAXIMIZED);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_RESTORED);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_ENTER);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_LEAVE);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_FOCUS_GAINED);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_FOCUS_LOST);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_CLOSE);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_TAKE_FOCUS);
SDL_WINDOWEVENT_CASE(SDL_WINDOWEVENT_HIT_TEST);
#undef SDL_WINDOWEVENT_CASE
default: printf("UNKNOWN(bug? fixme?)"); break;
}
printf(" data1=%d data2=%d)", (int) event->window.data1, (int) event->window.data2);
break;
SDL_EVENT_CASE(SDL_SYSWMEVENT)
printf("(timestamp=%u)", (uint) event->syswm.timestamp);
/* !!! FIXME: we don't delve further at the moment. */
break;
#define PRINT_KEY_EVENT(event) \
printf("(timestamp=%u windowid=%u state=%s repeat=%s scancode=%u keycode=%u mod=%u)", \
(uint) event->key.timestamp, (uint) event->key.windowID, \
event->key.state == SDL_PRESSED ? "pressed" : "released", \
event->key.repeat ? "true" : "false", \
(uint) event->key.keysym.scancode, \
(uint) event->key.keysym.sym, \
(uint) event->key.keysym.mod)
SDL_EVENT_CASE(SDL_KEYDOWN) PRINT_KEY_EVENT(event); break;
SDL_EVENT_CASE(SDL_KEYUP) PRINT_KEY_EVENT(event); break;
#undef PRINT_KEY_EVENT
SDL_EVENT_CASE(SDL_TEXTEDITING)
printf("(timestamp=%u windowid=%u text='%s' start=%d length=%d)",
(uint) event->edit.timestamp, (uint) event->edit.windowID,
event->edit.text, (int) event->edit.start, (int) event->edit.length);
break;
SDL_EVENT_CASE(SDL_TEXTINPUT)
printf("(timestamp=%u windowid=%u text='%s')", (uint) event->text.timestamp, (uint) event->text.windowID, event->text.text);
break;
SDL_EVENT_CASE(SDL_MOUSEMOTION)
printf("(timestamp=%u windowid=%u which=%u state=%u x=%d y=%d xrel=%d yrel=%d)",
(uint) event->motion.timestamp, (uint) event->motion.windowID,
(uint) event->motion.which, (uint) event->motion.state,
(int) event->motion.x, (int) event->motion.y,
(int) event->motion.xrel, (int) event->motion.yrel);
break;
#define PRINT_MBUTTON_EVENT(event) \
printf("(timestamp=%u windowid=%u which=%u button=%u state=%s clicks=%u x=%d y=%d)", \
(uint) event->button.timestamp, (uint) event->button.windowID, \
(uint) event->button.which, (uint) event->button.button, \
event->button.state == SDL_PRESSED ? "pressed" : "released", \
(uint) event->button.clicks, (int) event->button.x, (int) event->button.y)
SDL_EVENT_CASE(SDL_MOUSEBUTTONDOWN) PRINT_MBUTTON_EVENT(event); break;
SDL_EVENT_CASE(SDL_MOUSEBUTTONUP) PRINT_MBUTTON_EVENT(event); break;
#undef PRINT_MBUTTON_EVENT
SDL_EVENT_CASE(SDL_MOUSEWHEEL)
printf("(timestamp=%u windowid=%u which=%u x=%d y=%d direction=%s)",
(uint) event->wheel.timestamp, (uint) event->wheel.windowID,
(uint) event->wheel.which, (int) event->wheel.x, (int) event->wheel.y,
event->wheel.direction == SDL_MOUSEWHEEL_NORMAL ? "normal" : "flipped");
break;
SDL_EVENT_CASE(SDL_JOYAXISMOTION)
printf("(timestamp=%u which=%d axis=%u value=%d)",
(uint) event->jaxis.timestamp, (int) event->jaxis.which,
(uint) event->jaxis.axis, (int) event->jaxis.value);
break;
SDL_EVENT_CASE(SDL_JOYBALLMOTION)
printf("(timestamp=%u which=%d ball=%u xrel=%d yrel=%d)",
(uint) event->jball.timestamp, (int) event->jball.which,
(uint) event->jball.ball, (int) event->jball.xrel, (int) event->jball.yrel);
break;
SDL_EVENT_CASE(SDL_JOYHATMOTION)
printf("(timestamp=%u which=%d hat=%u value=%u)",
(uint) event->jhat.timestamp, (int) event->jhat.which,
(uint) event->jhat.hat, (uint) event->jhat.value);
break;
#define PRINT_JBUTTON_EVENT(event) \
printf("(timestamp=%u which=%d button=%u state=%s)", \
(uint) event->jbutton.timestamp, (int) event->jbutton.which, \
(uint) event->jbutton.button, event->jbutton.state == SDL_PRESSED ? "pressed" : "released")
SDL_EVENT_CASE(SDL_JOYBUTTONDOWN) PRINT_JBUTTON_EVENT(event); break;
SDL_EVENT_CASE(SDL_JOYBUTTONUP) PRINT_JBUTTON_EVENT(event); break;
#undef PRINT_JBUTTON_EVENT
#define PRINT_JOYDEV_EVENT(event) printf("(timestamp=%u which=%d)", (uint) event->jdevice.timestamp, (int) event->jdevice.which)
SDL_EVENT_CASE(SDL_JOYDEVICEADDED) PRINT_JOYDEV_EVENT(event); break;
SDL_EVENT_CASE(SDL_JOYDEVICEREMOVED) PRINT_JOYDEV_EVENT(event); break;
#undef PRINT_JOYDEV_EVENT
SDL_EVENT_CASE(SDL_CONTROLLERAXISMOTION)
printf("(timestamp=%u which=%d axis=%u value=%d)",
(uint) event->caxis.timestamp, (int) event->caxis.which,
(uint) event->caxis.axis, (int) event->caxis.value);
break;
#define PRINT_CBUTTON_EVENT(event) \
printf("(timestamp=%u which=%d button=%u state=%s)", \
(uint) event->cbutton.timestamp, (int) event->cbutton.which, \
(uint) event->cbutton.button, event->cbutton.state == SDL_PRESSED ? "pressed" : "released")
SDL_EVENT_CASE(SDL_CONTROLLERBUTTONDOWN) PRINT_CBUTTON_EVENT(event); break;
SDL_EVENT_CASE(SDL_CONTROLLERBUTTONUP) PRINT_CBUTTON_EVENT(event); break;
#undef PRINT_CBUTTON_EVENT
#define PRINT_CONTROLLERDEV_EVENT(event) printf("(timestamp=%u which=%d)", (uint) event->cdevice.timestamp, (int) event->cdevice.which)
SDL_EVENT_CASE(SDL_CONTROLLERDEVICEADDED) PRINT_CONTROLLERDEV_EVENT(event); break;
SDL_EVENT_CASE(SDL_CONTROLLERDEVICEREMOVED) PRINT_CONTROLLERDEV_EVENT(event); break;
SDL_EVENT_CASE(SDL_CONTROLLERDEVICEREMAPPED) PRINT_CONTROLLERDEV_EVENT(event); break;
#undef PRINT_CONTROLLERDEV_EVENT
#define PRINT_FINGER_EVENT(event) \
printf("(timestamp=%u touchid=%lld fingerid=%lld x=%f y=%f dx=%f dy=%f pressure=%f)", \
(uint) event->tfinger.timestamp, (long long) event->tfinger.touchId, \
(long long) event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, \
event->tfinger.dx, event->tfinger.dy, event->tfinger.pressure)
SDL_EVENT_CASE(SDL_FINGERDOWN) PRINT_FINGER_EVENT(event); break;
SDL_EVENT_CASE(SDL_FINGERUP) PRINT_FINGER_EVENT(event); break;
SDL_EVENT_CASE(SDL_FINGERMOTION) PRINT_FINGER_EVENT(event); break;
#undef PRINT_FINGER_EVENT
#define PRINT_DOLLAR_EVENT(event) \
printf("(timestamp=%u touchid=%lld gestureid=%lld numfingers=%u error=%f x=%f y=%f)", \
(uint) event->dgesture.timestamp, (long long) event->dgesture.touchId, \
(long long) event->dgesture.gestureId, (uint) event->dgesture.numFingers, \
event->dgesture.error, event->dgesture.x, event->dgesture.y);
SDL_EVENT_CASE(SDL_DOLLARGESTURE) PRINT_DOLLAR_EVENT(event); break;
SDL_EVENT_CASE(SDL_DOLLARRECORD) PRINT_DOLLAR_EVENT(event); break;
#undef PRINT_DOLLAR_EVENT
SDL_EVENT_CASE(SDL_MULTIGESTURE)
printf("(timestamp=%u touchid=%lld dtheta=%f ddist=%f x=%f y=%f numfingers=%u)",
(uint) event->mgesture.timestamp, (long long) event->mgesture.touchId,
event->mgesture.dTheta, event->mgesture.dDist,
event->mgesture.x, event->mgesture.y, (uint) event->mgesture.numFingers);
break;
#define PRINT_DROP_EVENT(event) printf("(file='%s' timestamp=%u windowid=%u)", event->drop.file, (uint) event->drop.timestamp, (uint) event->drop.windowID)
SDL_EVENT_CASE(SDL_DROPFILE) PRINT_DROP_EVENT(event); break;
SDL_EVENT_CASE(SDL_DROPTEXT) PRINT_DROP_EVENT(event); break;
SDL_EVENT_CASE(SDL_DROPBEGIN) PRINT_DROP_EVENT(event); break;
SDL_EVENT_CASE(SDL_DROPCOMPLETE) PRINT_DROP_EVENT(event); break;
#undef PRINT_DROP_EVENT
#define PRINT_AUDIODEV_EVENT(event) printf("(timestamp=%u which=%u iscapture=%s)", (uint) event->adevice.timestamp, (uint) event->adevice.which, event->adevice.iscapture ? "true" : "false");
SDL_EVENT_CASE(SDL_AUDIODEVICEADDED) PRINT_AUDIODEV_EVENT(event); break;
SDL_EVENT_CASE(SDL_AUDIODEVICEREMOVED) PRINT_AUDIODEV_EVENT(event); break;
#undef PRINT_AUDIODEV_EVENT
#undef SDL_EVENT_CASE
default:
printf("UNKNOWN SDL EVENT #%u! (Bug? FIXME?)", (uint) event->type);
break;
}
printf("\n");
}
#undef uint
#endif
/* Public functions */
void
SDL_StopEventLoop(void)
{
const char *report = SDL_GetHint("SDL_EVENT_QUEUE_STATISTICS");
int i;
SDL_EventEntry *entry;
SDL_SysWMEntry *wmmsg;
if (SDL_EventQ.lock) {
SDL_LockMutex(SDL_EventQ.lock);
}
SDL_AtomicSet(&SDL_EventQ.active, 0);
if (report && SDL_atoi(report)) {
SDL_Log("SDL EVENT QUEUE: Maximum events in-flight: %d\n",
SDL_EventQ.max_events_seen);
}
/* Clean out EventQ */
for (entry = SDL_EventQ.head; entry; ) {
SDL_EventEntry *next = entry->next;
SDL_free(entry);
entry = next;
}
for (entry = SDL_EventQ.free; entry; ) {
SDL_EventEntry *next = entry->next;
SDL_free(entry);
entry = next;
}
for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; ) {
SDL_SysWMEntry *next = wmmsg->next;
SDL_free(wmmsg);
wmmsg = next;
}
for (wmmsg = SDL_EventQ.wmmsg_free; wmmsg; ) {
SDL_SysWMEntry *next = wmmsg->next;
SDL_free(wmmsg);
wmmsg = next;
}
SDL_AtomicSet(&SDL_EventQ.count, 0);
SDL_EventQ.max_events_seen = 0;
SDL_EventQ.head = NULL;
SDL_EventQ.tail = NULL;
SDL_EventQ.free = NULL;
SDL_EventQ.wmmsg_used = NULL;
SDL_EventQ.wmmsg_free = NULL;
/* Clear disabled event state */
for (i = 0; i < SDL_arraysize(SDL_disabled_events); ++i) {
SDL_free(SDL_disabled_events[i]);
SDL_disabled_events[i] = NULL;
}
if (SDL_event_watchers_lock) {
SDL_DestroyMutex(SDL_event_watchers_lock);
SDL_event_watchers_lock = NULL;
}
if (SDL_event_watchers) {
SDL_free(SDL_event_watchers);
SDL_event_watchers = NULL;
SDL_event_watchers_count = 0;
}
SDL_zero(SDL_EventOK);
if (SDL_EventQ.lock) {
SDL_UnlockMutex(SDL_EventQ.lock);
SDL_DestroyMutex(SDL_EventQ.lock);
SDL_EventQ.lock = NULL;
}
}
/* This function (and associated calls) may be called more than once */
int
SDL_StartEventLoop(void)
{
/* We'll leave the event queue alone, since we might have gotten
some important events at launch (like SDL_DROPFILE)
FIXME: Does this introduce any other bugs with events at startup?
*/
/* Create the lock and set ourselves active */
#if !SDL_THREADS_DISABLED
if (!SDL_EventQ.lock) {
SDL_EventQ.lock = SDL_CreateMutex();
if (SDL_EventQ.lock == NULL) {
return -1;
}
}
if (!SDL_event_watchers_lock) {
SDL_event_watchers_lock = SDL_CreateMutex();
if (SDL_event_watchers_lock == NULL) {
return -1;
}
}
#endif /* !SDL_THREADS_DISABLED */
/* Process most event types */
SDL_EventState(SDL_TEXTINPUT, SDL_DISABLE);
SDL_EventState(SDL_TEXTEDITING, SDL_DISABLE);
SDL_EventState(SDL_SYSWMEVENT, SDL_DISABLE);
SDL_AtomicSet(&SDL_EventQ.active, 1);
return 0;
}
/* Add an event to the event queue -- called with the queue locked */
static int
SDL_AddEvent(SDL_Event * event)
{
SDL_EventEntry *entry;
const int initial_count = SDL_AtomicGet(&SDL_EventQ.count);
int final_count;
if (initial_count >= SDL_MAX_QUEUED_EVENTS) {
SDL_SetError("Event queue is full (%d events)", initial_count);
return 0;
}
if (SDL_EventQ.free == NULL) {
entry = (SDL_EventEntry *)SDL_malloc(sizeof(*entry));
if (!entry) {
return 0;
}
} else {
entry = SDL_EventQ.free;
SDL_EventQ.free = entry->next;
}
#ifdef SDL_DEBUG_EVENTS
SDL_DebugPrintEvent(event);
#endif
entry->event = *event;
if (event->type == SDL_SYSWMEVENT) {
entry->msg = *event->syswm.msg;
entry->event.syswm.msg = &entry->msg;
}
if (SDL_EventQ.tail) {
SDL_EventQ.tail->next = entry;
entry->prev = SDL_EventQ.tail;
SDL_EventQ.tail = entry;
entry->next = NULL;
} else {
SDL_assert(!SDL_EventQ.head);
SDL_EventQ.head = entry;
SDL_EventQ.tail = entry;
entry->prev = NULL;
entry->next = NULL;
}
final_count = SDL_AtomicAdd(&SDL_EventQ.count, 1) + 1;
if (final_count > SDL_EventQ.max_events_seen) {
SDL_EventQ.max_events_seen = final_count;
}
return 1;
}
/* Remove an event from the queue -- called with the queue locked */
static void
SDL_CutEvent(SDL_EventEntry *entry)
{
if (entry->prev) {
entry->prev->next = entry->next;
}
if (entry->next) {
entry->next->prev = entry->prev;
}
if (entry == SDL_EventQ.head) {
SDL_assert(entry->prev == NULL);
SDL_EventQ.head = entry->next;
}
if (entry == SDL_EventQ.tail) {
SDL_assert(entry->next == NULL);
SDL_EventQ.tail = entry->prev;
}
entry->next = SDL_EventQ.free;
SDL_EventQ.free = entry;
SDL_assert(SDL_AtomicGet(&SDL_EventQ.count) > 0);
SDL_AtomicAdd(&SDL_EventQ.count, -1);
}
/* Lock the event queue, take a peep at it, and unlock it */
int
SDL_PeepEvents(SDL_Event * events, int numevents, SDL_eventaction action,
Uint32 minType, Uint32 maxType)
{
int i, used;
/* Don't look after we've quit */
if (!SDL_AtomicGet(&SDL_EventQ.active)) {
/* We get a few spurious events at shutdown, so don't warn then */
if (action != SDL_ADDEVENT) {
SDL_SetError("The event system has been shut down");
}
return (-1);
}
/* Lock the event queue */
used = 0;
if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
if (action == SDL_ADDEVENT) {
for (i = 0; i < numevents; ++i) {
used += SDL_AddEvent(&events[i]);
}
} else {
SDL_EventEntry *entry, *next;
SDL_SysWMEntry *wmmsg, *wmmsg_next;
Uint32 type;
if (action == SDL_GETEVENT) {
/* Clean out any used wmmsg data
FIXME: Do we want to retain the data for some period of time?
*/
for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; wmmsg = wmmsg_next) {
wmmsg_next = wmmsg->next;
wmmsg->next = SDL_EventQ.wmmsg_free;
SDL_EventQ.wmmsg_free = wmmsg;
}
SDL_EventQ.wmmsg_used = NULL;
}
for (entry = SDL_EventQ.head; entry && (!events || used < numevents); entry = next) {
next = entry->next;
type = entry->event.type;
if (minType <= type && type <= maxType) {
if (events) {
events[used] = entry->event;
if (entry->event.type == SDL_SYSWMEVENT) {
/* We need to copy the wmmsg somewhere safe.
For now we'll guarantee it's valid at least until
the next call to SDL_PeepEvents()
*/
if (SDL_EventQ.wmmsg_free) {
wmmsg = SDL_EventQ.wmmsg_free;
SDL_EventQ.wmmsg_free = wmmsg->next;
} else {
wmmsg = (SDL_SysWMEntry *)SDL_malloc(sizeof(*wmmsg));
}
wmmsg->msg = *entry->event.syswm.msg;
wmmsg->next = SDL_EventQ.wmmsg_used;
SDL_EventQ.wmmsg_used = wmmsg;
events[used].syswm.msg = &wmmsg->msg;
}
if (action == SDL_GETEVENT) {
SDL_CutEvent(entry);
}
}
++used;
}
}
}
if (SDL_EventQ.lock) {
SDL_UnlockMutex(SDL_EventQ.lock);
}
} else {
return SDL_SetError("Couldn't lock event queue");
}
return (used);
}
SDL_bool
SDL_HasEvent(Uint32 type)
{
return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0);
}
SDL_bool
SDL_HasEvents(Uint32 minType, Uint32 maxType)
{
return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0);
}
void
SDL_FlushEvent(Uint32 type)
{
SDL_FlushEvents(type, type);
}
void
SDL_FlushEvents(Uint32 minType, Uint32 maxType)
{
/* Don't look after we've quit */
if (!SDL_AtomicGet(&SDL_EventQ.active)) {
return;
}
/* Make sure the events are current */
#if 0
/* Actually, we can't do this since we might be flushing while processing
a resize event, and calling this might trigger further resize events.
*/
SDL_PumpEvents();
#endif
/* Lock the event queue */
if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
SDL_EventEntry *entry, *next;
Uint32 type;
for (entry = SDL_EventQ.head; entry; entry = next) {
next = entry->next;
type = entry->event.type;
if (minType <= type && type <= maxType) {
SDL_CutEvent(entry);
}
}
if (SDL_EventQ.lock) {
SDL_UnlockMutex(SDL_EventQ.lock);
}
}
}
/* Run the system dependent event loops */
void
SDL_PumpEvents(void)
{
SDL_VideoDevice *_this = SDL_GetVideoDevice();
/* Get events from the video subsystem */
if (_this) {
_this->PumpEvents(_this);
}
#if !SDL_JOYSTICK_DISABLED
/* Check for joystick state change */
if ((!SDL_disabled_events[SDL_JOYAXISMOTION >> 8] || SDL_JoystickEventState(SDL_QUERY))) {
SDL_JoystickUpdate();
}
#endif
SDL_SendPendingQuit(); /* in case we had a signal handler fire, etc. */
}
/* Public functions */
int
SDL_PollEvent(SDL_Event * event)
{
return SDL_WaitEventTimeout(event, 0);
}
int
SDL_WaitEvent(SDL_Event * event)
{
return SDL_WaitEventTimeout(event, -1);
}
int
SDL_WaitEventTimeout(SDL_Event * event, int timeout)
{
Uint32 expiration = 0;
if (timeout > 0)
expiration = SDL_GetTicks() + timeout;
for (;;) {
SDL_PumpEvents();
switch (SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) {
case -1:
return 0;
case 0:
if (timeout == 0) {
/* Polling and no events, just return */
return 0;
}
if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) {
/* Timeout expired and no events */
return 0;
}
SDL_Delay(10);
break;
default:
/* Has events */
return 1;
}
}
}
int
SDL_PushEvent(SDL_Event * event)
{
event->common.timestamp = SDL_GetTicks();
if (SDL_EventOK.callback || SDL_event_watchers_count > 0) {
if (!SDL_event_watchers_lock || SDL_LockMutex(SDL_event_watchers_lock) == 0) {
if (SDL_EventOK.callback && !SDL_EventOK.callback(SDL_EventOK.userdata, event)) {
if (SDL_event_watchers_lock) {
SDL_UnlockMutex(SDL_event_watchers_lock);
}
return 0;
}
if (SDL_event_watchers_count > 0) {
/* Make sure we only dispatch the current watcher list */
int i, event_watchers_count = SDL_event_watchers_count;
SDL_event_watchers_dispatching = SDL_TRUE;
for (i = 0; i < event_watchers_count; ++i) {
if (!SDL_event_watchers[i].removed) {
SDL_event_watchers[i].callback(SDL_event_watchers[i].userdata, event);
}
}
SDL_event_watchers_dispatching = SDL_FALSE;
if (SDL_event_watchers_removed) {
for (i = SDL_event_watchers_count; i--; ) {
if (SDL_event_watchers[i].removed) {
--SDL_event_watchers_count;
if (i < SDL_event_watchers_count) {
SDL_memmove(&SDL_event_watchers[i], &SDL_event_watchers[i+1], (SDL_event_watchers_count - i) * sizeof(SDL_event_watchers[i]));
}
}
}
SDL_event_watchers_removed = SDL_FALSE;
}
}
if (SDL_event_watchers_lock) {
SDL_UnlockMutex(SDL_event_watchers_lock);
}
}
}
if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {
return -1;
}
SDL_GestureProcessEvent(event);
return 1;
}
void
SDL_SetEventFilter(SDL_EventFilter filter, void *userdata)
{
if (!SDL_event_watchers_lock || SDL_LockMutex(SDL_event_watchers_lock) == 0) {
/* Set filter and discard pending events */
SDL_EventOK.callback = filter;
SDL_EventOK.userdata = userdata;
SDL_FlushEvents(SDL_FIRSTEVENT, SDL_LASTEVENT);
if (SDL_event_watchers_lock) {
SDL_UnlockMutex(SDL_event_watchers_lock);
}
}
}
SDL_bool
SDL_GetEventFilter(SDL_EventFilter * filter, void **userdata)
{
SDL_EventWatcher event_ok;
if (!SDL_event_watchers_lock || SDL_LockMutex(SDL_event_watchers_lock) == 0) {
event_ok = SDL_EventOK;
if (SDL_event_watchers_lock) {
SDL_UnlockMutex(SDL_event_watchers_lock);
}
} else {
SDL_zero(event_ok);
}
if (filter) {
*filter = event_ok.callback;
}
if (userdata) {
*userdata = event_ok.userdata;
}
return event_ok.callback ? SDL_TRUE : SDL_FALSE;
}
void
SDL_AddEventWatch(SDL_EventFilter filter, void *userdata)
{
if (!SDL_event_watchers_lock || SDL_LockMutex(SDL_event_watchers_lock) == 0) {
SDL_EventWatcher *event_watchers;
event_watchers = SDL_realloc(SDL_event_watchers, (SDL_event_watchers_count + 1) * sizeof(*event_watchers));
if (event_watchers) {
SDL_EventWatcher *watcher;
SDL_event_watchers = event_watchers;
watcher = &SDL_event_watchers[SDL_event_watchers_count];
watcher->callback = filter;
watcher->userdata = userdata;
watcher->removed = SDL_FALSE;
++SDL_event_watchers_count;
}
if (SDL_event_watchers_lock) {
SDL_UnlockMutex(SDL_event_watchers_lock);
}
}
}
void
SDL_DelEventWatch(SDL_EventFilter filter, void *userdata)
{
if (!SDL_event_watchers_lock || SDL_LockMutex(SDL_event_watchers_lock) == 0) {
int i;
for (i = 0; i < SDL_event_watchers_count; ++i) {
if (SDL_event_watchers[i].callback == filter && SDL_event_watchers[i].userdata == userdata) {
if (SDL_event_watchers_dispatching) {
SDL_event_watchers[i].removed = SDL_TRUE;
SDL_event_watchers_removed = SDL_TRUE;
} else {
--SDL_event_watchers_count;
if (i < SDL_event_watchers_count) {
SDL_memmove(&SDL_event_watchers[i], &SDL_event_watchers[i+1], (SDL_event_watchers_count - i) * sizeof(SDL_event_watchers[i]));
}
}
break;
}
}
if (SDL_event_watchers_lock) {
SDL_UnlockMutex(SDL_event_watchers_lock);
}
}
}
void
SDL_FilterEvents(SDL_EventFilter filter, void *userdata)
{
if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
SDL_EventEntry *entry, *next;
for (entry = SDL_EventQ.head; entry; entry = next) {
next = entry->next;
if (!filter(userdata, &entry->event)) {
SDL_CutEvent(entry);
}
}
if (SDL_EventQ.lock) {
SDL_UnlockMutex(SDL_EventQ.lock);
}
}
}
Uint8
SDL_EventState(Uint32 type, int state)
{
Uint8 current_state;
Uint8 hi = ((type >> 8) & 0xff);
Uint8 lo = (type & 0xff);
if (SDL_disabled_events[hi] &&
(SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) {
current_state = SDL_DISABLE;
} else {
current_state = SDL_ENABLE;
}
if (state != current_state)
{
switch (state) {
case SDL_DISABLE:
/* Disable this event type and discard pending events */
if (!SDL_disabled_events[hi]) {
SDL_disabled_events[hi] = (SDL_DisabledEventBlock*) SDL_calloc(1, sizeof(SDL_DisabledEventBlock));
if (!SDL_disabled_events[hi]) {
/* Out of memory, nothing we can do... */
break;
}
}
SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31));
SDL_FlushEvent(type);
break;
case SDL_ENABLE:
SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31));
break;
default:
/* Querying state... */
break;
}
}
return current_state;
}
Uint32
SDL_RegisterEvents(int numevents)
{
Uint32 event_base;
if ((numevents > 0) && (SDL_userevents+numevents <= SDL_LASTEVENT)) {
event_base = SDL_userevents;
SDL_userevents += numevents;
} else {
event_base = (Uint32)-1;
}
return event_base;
}
int
SDL_SendAppEvent(SDL_EventType eventType)
{
int posted;
posted = 0;
if (SDL_GetEventState(eventType) == SDL_ENABLE) {
SDL_Event event;
event.type = eventType;
posted = (SDL_PushEvent(&event) > 0);
}
return (posted);
}
int
SDL_SendSysWMEvent(SDL_SysWMmsg * message)
{
int posted;
posted = 0;
if (SDL_GetEventState(SDL_SYSWMEVENT) == SDL_ENABLE) {
SDL_Event event;
SDL_memset(&event, 0, sizeof(event));
event.type = SDL_SYSWMEVENT;
event.syswm.msg = message;
posted = (SDL_PushEvent(&event) > 0);
}
/* Update internal event state */
return (posted);
}
int
SDL_SendKeymapChangedEvent(void)
{
return SDL_SendAppEvent(SDL_KEYMAPCHANGED);
}
/* vi: set ts=4 sw=4 expandtab: */
wmmsg_used
SDL_SysWMEntry * wmmsg_used
Definition: SDL_events.c:85
SDL_JOYBUTTONUP
Definition: SDL_events.h:112
SDL_UserEvent::data1
void * data1
Definition: SDL_events.h:501
SDL_ControllerAxisEvent::which
SDL_JoystickID which
Definition: SDL_events.h:360
SDL_JoyAxisEvent::value
Sint16 value
Definition: SDL_events.h:288
SDL_eventaction
SDL_eventaction
Definition: SDL_events.h:576
SDL_Event::motion
SDL_MouseMotionEvent motion
Definition: SDL_events.h:533
SDL_PeepEvents
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:509
SDL_MouseMotionEvent::which
Uint32 which
Definition: SDL_events.h:237
SDL_APP_DIDENTERFOREGROUND
Definition: SDL_events.h:83
SDL_WaitEventTimeout
int SDL_WaitEventTimeout(SDL_Event *event, int timeout)
Waits until the specified timeout (in milliseconds) for the next available event. ...
Definition: SDL_events.c:672
SDL_TextEditingEvent::windowID
Uint32 windowID
Definition: SDL_events.h:210
SDL_JOYHATMOTION
Definition: SDL_events.h:110
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_APP_WILLENTERFOREGROUND
Definition: SDL_events.h:79
SDL_TextEditingEvent::start
Sint32 start
Definition: SDL_events.h:212
SDL_KEYDOWN
Definition: SDL_events.h:93
SDL_Event::caxis
SDL_ControllerAxisEvent caxis
Definition: SDL_events.h:541
SDL_GetEventFilter
SDL_bool SDL_GetEventFilter(SDL_EventFilter *filter, void **userdata)
Definition: SDL_events.c:772
SDL_EventEntry::next
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_event_watchers
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_PumpEvents
void SDL_PumpEvents(void)
Definition: SDL_events.c:639
SDL_DROPTEXT
Definition: SDL_events.h:139
SDL_JoyAxisEvent::axis
Uint8 axis
Definition: SDL_events.h:284
SDL_MouseWheelEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:268
SDL_SysWMEntry::msg
SDL_SysWMmsg msg
Definition: SDL_events.c:72
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_APP_LOWMEMORY
Definition: SDL_events.h:67
SDL_MouseMotionEvent::y
Sint32 y
Definition: SDL_events.h:240
SDL_EventWatcher::removed
SDL_bool removed
Definition: SDL_events.c:44
SDL_MOUSEBUTTONUP
Definition: SDL_events.h:104
SDL_WINDOWEVENT_MINIMIZED
Definition: SDL_video.h:159
SDL_ControllerAxisEvent::value
Sint16 value
Definition: SDL_events.h:365
SDL_CONTROLLERDEVICEREMOVED
Definition: SDL_events.h:121
SDL_UserEvent::data2
void * data2
Definition: SDL_events.h:502
message
GLuint GLsizei const GLchar * message
Definition: SDL_opengl_glext.h:2483
active
SDL_atomic_t active
Definition: SDL_events.c:79
SDL_WINDOWEVENT_TAKE_FOCUS
Definition: SDL_video.h:168
SDL_EventWatcher::callback
SDL_EventFilter callback
Definition: SDL_events.c:42
SDL_HasEvent
SDL_bool SDL_HasEvent(Uint32 type)
Definition: SDL_events.c:587
SDL_atomic_t
A type representing an atomic integer value. It is a struct so people don&#39;t accidentally use numeric ...
Definition: SDL_atomic.h:198
SDL_AddEvent
static int SDL_AddEvent(SDL_Event *event)
Definition: SDL_events.c:429
SDL_JoyBallEvent::ball
Uint8 ball
Definition: SDL_events.h:300
SDL_SysWMEvent::msg
SDL_SysWMmsg * msg
Definition: SDL_events.h:519
SDL_JOYDEVICEADDED
Definition: SDL_events.h:113
SDL_SYSWMEVENT
Definition: SDL_events.h:90
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_CreateMutex
#define SDL_CreateMutex
Definition: SDL_dynapi_overrides.h:259
SDL_MOUSEWHEEL_NORMAL
Definition: SDL_mouse.h:68
state
struct xkb_state * state
Definition: SDL_waylandsym.h:113
SDL_PEEKEVENT
Definition: SDL_events.h:579
events
static SDL_Event events[EVENT_BUF_SIZE]
Definition: testgesture.c:35
free
SDL_EventEntry * free
Definition: SDL_events.c:84
SDL_MOUSEBUTTONDOWN
Definition: SDL_events.h:103
SDL_StartEventLoop
int SDL_StartEventLoop(void)
Definition: SDL_events.c:391
SDL_Event::jball
SDL_JoyBallEvent jball
Definition: SDL_events.h:537
SDL_MAX_QUEUED_EVENTS
#define SDL_MAX_QUEUED_EVENTS
Definition: SDL_events.c:39
SDL_QUIT
Definition: SDL_events.h:60
SDL_events.h
SDL_JoyAxisEvent::which
SDL_JoystickID which
Definition: SDL_events.h:283
SDL_event_watchers_count
static int SDL_event_watchers_count
Definition: SDL_events.c:50
SDL_QuitEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:480
SDL_EventFilter
int(* SDL_EventFilter)(void *userdata, SDL_Event *event)
Definition: SDL_events.h:662
SDL_GetHint
#define SDL_GetHint
Definition: SDL_dynapi_overrides.h:191
SDL_EventEntry::event
SDL_Event event
Definition: SDL_events.c:64
SDL_USEREVENT
Definition: SDL_events.h:154
SDL_MouseMotionEvent::x
Sint32 x
Definition: SDL_events.h:239
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:722
SDL_JoyBallEvent::xrel
Sint16 xrel
Definition: SDL_events.h:304
SDL_WINDOWEVENT_NONE
Definition: SDL_video.h:148
max_events_seen
int max_events_seen
Definition: SDL_events.c:81
SDL_WINDOWEVENT_MAXIMIZED
Definition: SDL_video.h:160
SDL_SysWMEntry
Definition: SDL_events.c:70
SDL_JOYBALLMOTION
Definition: SDL_events.h:109
SDL_MultiGestureEvent::dDist
float dDist
Definition: SDL_events.h:436
SDL_MultiGestureEvent::y
float y
Definition: SDL_events.h:438
bits
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
Definition: SDL_opengl_glext.h:6176
SDL_Event::quit
SDL_QuitEvent quit
Definition: SDL_events.h:545
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_realloc
#define SDL_realloc
Definition: SDL_dynapi_overrides.h:376
SDL_JOYAXISMOTION
Definition: SDL_events.h:108
SDL_UserEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:498
SDL_MOUSEWHEEL
Definition: SDL_events.h:105
SDL_event_watchers_dispatching
static SDL_bool SDL_event_watchers_dispatching
Definition: SDL_events.c:51
SDL_CONTROLLERDEVICEADDED
Definition: SDL_events.h:120
SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:156
SDL_TextEditingEvent::length
Sint32 length
Definition: SDL_events.h:213
SDL_SysWMmsg::msg
union SDL_SysWMmsg::@16 msg
SDL_EventQ
static struct @22 SDL_EventQ
SDL_DROPBEGIN
Definition: SDL_events.h:140
SDL_JoyAxisEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:282
SDL_Event::wheel
SDL_MouseWheelEvent wheel
Definition: SDL_events.h:535
SDL_HasEvents
SDL_bool SDL_HasEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:593
SDL_SendSysWMEvent
int SDL_SendSysWMEvent(SDL_SysWMmsg *message)
Definition: SDL_events.c:933
SDL_DisabledEventBlock::bits
Uint32 bits[8]
Definition: SDL_events.c:55
SDL_WINDOWEVENT_HIDDEN
Definition: SDL_video.h:150
SDL_thread.h
SDL_JoyBallEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:298
SDL_CONTROLLERBUTTONUP
Definition: SDL_events.h:119
SDL_mutex
Definition: SDL_sysmutex.c:29
SDL_JOYDEVICEREMOVED
Definition: SDL_events.h:114
_this
static SDL_VideoDevice * _this
Definition: SDL_video.c:121
SDL_SysWMEntry::next
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:73
SDL_DOLLARGESTURE
Definition: SDL_events.h:130
SDL_WINDOWEVENT_FOCUS_GAINED
Definition: SDL_video.h:165
SDL_Event::window
SDL_WindowEvent window
Definition: SDL_events.h:529
SDL_SysWMEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:518
SDL_RENDER_DEVICE_RESET
Definition: SDL_events.h:149
SDL_MouseMotionEvent::yrel
Sint32 yrel
Definition: SDL_events.h:242
SDL_GestureProcessEvent
void SDL_GestureProcessEvent(SDL_Event *event)
Definition: SDL_gesture.c:538
SDL_AUDIODEVICEREMOVED
Definition: SDL_events.h:145
SDL_JoyBallEvent::which
SDL_JoystickID which
Definition: SDL_events.h:299
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
SDL_FINGERDOWN
Definition: SDL_events.h:125
SDL_FlushEvents
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:605
SDL_Event::text
SDL_TextInputEvent text
Definition: SDL_events.h:532
SDL_MouseMotionEvent::xrel
Sint32 xrel
Definition: SDL_events.h:241
SDL_TextInputEvent::text
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]
Definition: SDL_events.h:226
SDL_AUDIODEVICEADDED
Definition: SDL_events.h:144
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
SDL_event_watchers_removed
static SDL_bool SDL_event_watchers_removed
Definition: SDL_events.c:52
SDL_JOYBUTTONDOWN
Definition: SDL_events.h:111
SDL_GetTicks
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
SDL_WINDOWEVENT_RESTORED
Definition: SDL_video.h:161
SDL_Event::jaxis
SDL_JoyAxisEvent jaxis
Definition: SDL_events.h:536
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:157
SDL_MultiGestureEvent::numFingers
Uint16 numFingers
Definition: SDL_events.h:439
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_Event::mgesture
SDL_MultiGestureEvent mgesture
Definition: SDL_events.h:549
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_KEYUP
Definition: SDL_events.h:94
SDL_SysWMmsg
Definition: SDL_syswm.h:135
SDL_WindowEvent::data2
Sint32 data2
Definition: SDL_events.h:184
SDL_MouseWheelEvent::windowID
Uint32 windowID
Definition: SDL_events.h:269
SDL_TextInputEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:224
SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:166
SDL_DisabledEventBlock
Definition: SDL_events.c:54
SDL_EventType
SDL_EventType
The types of events that can be delivered.
Definition: SDL_events.h:55
SDL_FlushEvent
void SDL_FlushEvent(Uint32 type)
Definition: SDL_events.c:599
SDL_WINDOWEVENT
Definition: SDL_events.h:89
SDL_TextEditingEvent::text
char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]
Definition: SDL_events.h:211
SDL_MouseWheelEvent::which
Uint32 which
Definition: SDL_events.h:270
SDL_ControllerAxisEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:359
SDL_PushEvent
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:703
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
SDL_UserEvent::windowID
Uint32 windowID
Definition: SDL_events.h:499
SDL_CONTROLLERBUTTONDOWN
Definition: SDL_events.h:118
SDL_FilterEvents
void SDL_FilterEvents(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:847
SDL_EventEntry
Definition: SDL_events.c:62
SDL_TextInputEvent::windowID
Uint32 windowID
Definition: SDL_events.h:225
SDL_memmove
#define SDL_memmove
Definition: SDL_dynapi_overrides.h:388
SDL_JoyHatEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:314
SDL_WindowEvent::event
Uint8 event
Definition: SDL_events.h:179
SDL_UserEvent::code
Sint32 code
Definition: SDL_events.h:500
SDL_WINDOWEVENT_LEAVE
Definition: SDL_video.h:164
SDL_FINGERMOTION
Definition: SDL_events.h:127
SDL_CONTROLLERDEVICEREMAPPED
Definition: SDL_events.h:122
SDL_CutEvent
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:483
SDL_atoi
#define SDL_atoi
Definition: SDL_dynapi_overrides.h:410
SDL_EventState
Uint8 SDL_EventState(Uint32 type, int state)
Definition: SDL_events.c:864
SDL_WINDOWEVENT_CLOSE
Definition: SDL_video.h:167
SDL_Delay
#define SDL_Delay
Definition: SDL_dynapi_overrides.h:486
SDL_TextEditingEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:209
i
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
SDL_DROPFILE
Definition: SDL_events.h:138
SDL_assert
#define SDL_assert(condition)
Definition: SDL_assert.h:169
SDL_FIRSTEVENT
Definition: SDL_events.h:57
SDL_WindowEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:177
SDL_events_c.h
SDL_DISABLE
#define SDL_DISABLE
Definition: SDL_events.h:721
NULL
#define NULL
Definition: begin_code.h:164
SDL_AtomicAdd
#define SDL_AtomicAdd
Definition: SDL_dynapi_overrides.h:69
SDL_bool
SDL_bool
Definition: SDL_stdinc.h:139
tail
SDL_EventEntry * tail
Definition: SDL_events.c:83
SDL_MultiGestureEvent::dTheta
float dTheta
Definition: SDL_events.h:435
SDL_Event::edit
SDL_TextEditingEvent edit
Definition: SDL_events.h:531
SDL_JoystickUpdate
#define SDL_JoystickUpdate
Definition: SDL_dynapi_overrides.h:209
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_FINGERUP
Definition: SDL_events.h:126
SDL_Event::syswm
SDL_SysWMEvent syswm
Definition: SDL_events.h:547
SDL_MOUSEMOTION
Definition: SDL_events.h:102
SDL_DestroyMutex
#define SDL_DestroyMutex
Definition: SDL_dynapi_overrides.h:263
SDL_SendKeymapChangedEvent
int SDL_SendKeymapChangedEvent(void)
Definition: SDL_events.c:950
SDL_calloc
#define SDL_calloc
Definition: SDL_dynapi_overrides.h:375
SDL_JoyHatEvent::hat
Uint8 hat
Definition: SDL_events.h:316
SDL_DelEventWatch
void SDL_DelEventWatch(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:820
SDL_EventEntry::prev
struct _SDL_EventEntry * prev
Definition: SDL_events.c:66
SDL_WINDOWEVENT_SHOWN
Definition: SDL_video.h:149
SDL_TEXTINPUT
Definition: SDL_events.h:96
lock
SDL_mutex * lock
Definition: SDL_events.c:78
count
SDL_atomic_t count
Definition: SDL_events.c:80
SDL_ControllerAxisEvent::axis
Uint8 axis
Definition: SDL_events.h:361
SDL_MultiGestureEvent::x
float x
Definition: SDL_events.h:437
SDL_MouseMotionEvent::windowID
Uint32 windowID
Definition: SDL_events.h:236
timeout
GLbitfield GLuint64 timeout
Definition: SDL_opengl_glext.h:1483
SDL_MouseMotionEvent::state
Uint32 state
Definition: SDL_events.h:238
SDL_userevents
static Uint32 SDL_userevents
Definition: SDL_events.c:59
SDL_disabled_events
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:58
SDL_MouseWheelEvent::x
Sint32 x
Definition: SDL_events.h:271
SDL_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
wmmsg_free
SDL_SysWMEntry * wmmsg_free
Definition: SDL_events.c:86
SDL_JoyHatEvent::value
Uint8 value
Definition: SDL_events.h:317
SDL_WINDOWEVENT_ENTER
Definition: SDL_video.h:163
SDL_WINDOWEVENT_EXPOSED
Definition: SDL_video.h:151
SDL_MouseMotionEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:235
SDL_AtomicSet
#define SDL_AtomicSet
Definition: SDL_dynapi_overrides.h:67
SDL_VideoDevice
Definition: SDL_sysvideo.h:147
SDL_AtomicGet
#define SDL_AtomicGet
Definition: SDL_dynapi_overrides.h:68
SDL_JoystickEventState
#define SDL_JoystickEventState
Definition: SDL_dynapi_overrides.h:210
SDL_MultiGestureEvent::timestamp
Uint32 timestamp
Definition: SDL_events.h:433
type
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
SDL_GetVideoDevice
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:586
SDL_EventOK
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
SDL_SendPendingQuit
void SDL_SendPendingQuit(void)
Definition: SDL_quit.c:144
SDL_arraysize
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
SDL_WINDOWEVENT_HIT_TEST
Definition: SDL_video.h:169
SDL_Event
General event structure.
Definition: SDL_events.h:525
SDL_MouseWheelEvent::y
Sint32 y
Definition: SDL_events.h:272
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374
SDL_WINDOWEVENT_RESIZED
Definition: SDL_video.h:155
SDL_Event::user
SDL_UserEvent user
Definition: SDL_events.h:546
SDL_APP_WILLENTERBACKGROUND
Definition: SDL_events.h:71
SDL_PollEvent
int SDL_PollEvent(SDL_Event *event)
Polls for currently pending events.
Definition: SDL_events.c:660
SDL_APP_TERMINATING
Definition: SDL_events.h:63
SDL_SendAppEvent
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:919
SDL_AddEventWatch
void SDL_AddEventWatch(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:796
SDL_GETEVENT
Definition: SDL_events.h:580
SDL_JoyBallEvent::yrel
Sint16 yrel
Definition: SDL_events.h:305
SDL_QUERY
#define SDL_QUERY
Definition: SDL_events.h:719
SDL_ADDEVENT
Definition: SDL_events.h:578
SDL_KEYMAPCHANGED
Definition: SDL_events.h:97
SDL_Event::jhat
SDL_JoyHatEvent jhat
Definition: SDL_events.h:538
SDL_RENDER_TARGETS_RESET
Definition: SDL_events.h:148
SDL_EventWatcher::userdata
void * userdata
Definition: SDL_events.c:43
SDL_WaitEvent
int SDL_WaitEvent(SDL_Event *event)
Waits indefinitely for the next available event.
Definition: SDL_events.c:666
head
SDL_EventEntry * head
Definition: SDL_events.c:82
SDL_WindowEvent::data1
Sint32 data1
Definition: SDL_events.h:183
SDL_DROPCOMPLETE
Definition: SDL_events.h:141
SDL_TICKS_PASSED
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
Definition: SDL_timer.h:56
SDL.h
SDL_APP_DIDENTERBACKGROUND
Definition: SDL_events.h:75
SDL_CLIPBOARDUPDATE
Definition: SDL_events.h:135
SDL_WINDOWEVENT_MOVED
Definition: SDL_video.h:153
SDL_CONTROLLERAXISMOTION
Definition: SDL_events.h:117
SDL_syswm.h
SDL_JoyHatEvent::which
SDL_JoystickID which
Definition: SDL_events.h:315
SDL_WindowEvent::windowID
Uint32 windowID
Definition: SDL_events.h:178
SDL_SetEventFilter
void SDL_SetEventFilter(SDL_EventFilter filter, void *userdata)
Definition: SDL_events.c:757
SDL_DOLLARRECORD
Definition: SDL_events.h:131
SDL_TEXTEDITING
Definition: SDL_events.h:95
SDL_memset
#define SDL_memset
Definition: SDL_dynapi_overrides.h:386
SDL_LASTEVENT
Definition: SDL_events.h:159
SDL_EventWatcher
Definition: SDL_events.c:41
filter
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: SDL_opengl_glext.h:1184
SDL_MultiGestureEvent::touchId
SDL_TouchID touchId
Definition: SDL_events.h:434
SDL_Event::type
Uint32 type
Definition: SDL_events.h:527
SDL_StopEventLoop
void SDL_StopEventLoop(void)
Definition: SDL_events.c:317
SDL_VideoDevice::PumpEvents
void(* PumpEvents)(_THIS)
Definition: SDL_sysvideo.h:280
SDL_RegisterEvents
Uint32 SDL_RegisterEvents(int numevents)
Definition: SDL_events.c:905
SDL_MULTIGESTURE
Definition: SDL_events.h:132
SDL_MouseWheelEvent::direction
Uint32 direction
Definition: SDL_events.h:273
SDL_EventEntry::msg
SDL_SysWMmsg msg
Definition: SDL_events.c:65