SDL_events.c File Reference
`#include "../SDL_internal.h"`
`#include "SDL.h"`
`#include "SDL_events.h"`
`#include "SDL_thread.h"`
`#include "SDL_events_c.h"`
`#include "../timer/SDL_timer_c.h"`
`#include "../joystick/SDL_joystick_c.h"`
`#include "../video/SDL_sysvideo.h"`
`#include "SDL_syswm.h"`
Include dependency graph for SDL_events.c:

Go to the source code of this file.

## Data Structures

struct | SDL_EventWatcher
struct | SDL_DisabledEventBlock
struct | SDL_EventEntry
struct | SDL_SysWMEntry

## Macros

#define | SDL_MAX_QUEUED_EVENTS 65535

## Functions

void | SDL_StopEventLoop (void)
int | SDL_StartEventLoop (void)
static int | SDL_AddEvent (SDL_Event *event)
static void | SDL_CutEvent (SDL_EventEntry *entry)
int | SDL_PeepEvents (SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
SDL_bool | SDL_HasEvent (Uint32 type)
SDL_bool | SDL_HasEvents (Uint32 minType, Uint32 maxType)
void | SDL_FlushEvent (Uint32 type)
void | SDL_FlushEvents (Uint32 minType, Uint32 maxType)
void | SDL_PumpEvents (void)
int | SDL_PollEvent (SDL_Event *event)
| Polls for currently pending events. More...
int | SDL_WaitEvent (SDL_Event *event)
| Waits indefinitely for the next available event. More...
int | SDL_WaitEventTimeout (SDL_Event *event, int timeout)
| Waits until the specified timeout (in milliseconds) for the next available event. More...
int | SDL_PushEvent (SDL_Event *event)
| Add an event to the event queue. More...
void | SDL_SetEventFilter (SDL_EventFilter filter, void *userdata)
SDL_bool | SDL_GetEventFilter (SDL_EventFilter *filter, void **userdata)
void | SDL_AddEventWatch (SDL_EventFilter filter, void *userdata)
void | SDL_DelEventWatch (SDL_EventFilter filter, void *userdata)
void | SDL_FilterEvents (SDL_EventFilter filter, void *userdata)
Uint8 | SDL_EventState (Uint32 type, int state)
Uint32 | SDL_RegisterEvents (int numevents)
int | SDL_SendAppEvent (SDL_EventType eventType)
int | SDL_SendSysWMEvent (SDL_SysWMmsg *message)
int | SDL_SendKeymapChangedEvent (void)

## Variables

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
static SDL_DisabledEventBlock * | SDL_disabled_events [256]
static Uint32 | SDL_userevents = SDL_USEREVENT
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 }

## Macro Definition Documentation

## SDL_MAX_QUEUED_EVENTS

#define SDL_MAX_QUEUED_EVENTS 65535

Definition at line 39 of file SDL_events.c.

Referenced by SDL_AddEvent().

## Function Documentation

## SDL_AddEvent()

static int SDL_AddEvent | ( | SDL_Event * | event | ) |

static

Definition at line 429 of file SDL_events.c.

References SDL_EventEntry::event, SDL_EventEntry::msg, SDL_SysWMmsg::msg, SDL_SysWMEvent::msg, SDL_EventEntry::next, NULL, SDL_EventEntry::prev, SDL_assert, SDL_AtomicAdd, SDL_AtomicGet, SDL_EventQ, SDL_malloc, SDL_MAX_QUEUED_EVENTS, SDL_SetError, SDL_SYSWMEVENT, SDL_Event::syswm, and SDL_Event::type.

Referenced by SDL_PeepEvents().

{
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;
}
SDL_EventEntry::next
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_SysWMEvent::msg
SDL_SysWMmsg * msg
Definition: SDL_events.h:519
SDL_SYSWMEVENT
Definition: SDL_events.h:90
SDL_MAX_QUEUED_EVENTS
#define SDL_MAX_QUEUED_EVENTS
Definition: SDL_events.c:39
SDL_EventEntry::event
SDL_Event event
Definition: SDL_events.c:64
SDL_SysWMmsg::msg
union SDL_SysWMmsg::@16 msg
SDL_EventQ
static struct @22 SDL_EventQ
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_EventEntry
Definition: SDL_events.c:62
SDL_assert
#define SDL_assert(condition)
Definition: SDL_assert.h:169
NULL
#define NULL
Definition: begin_code.h:164
SDL_AtomicAdd
#define SDL_AtomicAdd
Definition: SDL_dynapi_overrides.h:69
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_Event::syswm
SDL_SysWMEvent syswm
Definition: SDL_events.h:547
SDL_EventEntry::prev
struct _SDL_EventEntry * prev
Definition: SDL_events.c:66
SDL_AtomicGet
#define SDL_AtomicGet
Definition: SDL_dynapi_overrides.h:68
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374
SDL_Event::type
Uint32 type
Definition: SDL_events.h:527
SDL_EventEntry::msg
SDL_SysWMmsg msg
Definition: SDL_events.c:65

## SDL_AddEventWatch()

void SDL_AddEventWatch | ( | SDL_EventFilter | filter,
|  | void * | userdata
| ) |  |

Add a function which is called when an event is added to the queue.

Definition at line 796 of file SDL_events.c.

References SDL_EventWatcher::callback, SDL_EventWatcher::removed, SDL_event_watchers_count, SDL_FALSE, SDL_LockMutex, SDL_realloc, SDL_UnlockMutex, and SDL_EventWatcher::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);
}
}
}
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_event_watchers
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_EventWatcher::removed
SDL_bool removed
Definition: SDL_events.c:44
SDL_EventWatcher::callback
SDL_EventFilter callback
Definition: SDL_events.c:42
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_event_watchers_count
static int SDL_event_watchers_count
Definition: SDL_events.c:50
SDL_realloc
#define SDL_realloc
Definition: SDL_dynapi_overrides.h:376
SDL_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
SDL_EventWatcher::userdata
void * userdata
Definition: SDL_events.c:43
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_CutEvent()

static void SDL_CutEvent | ( | SDL_EventEntry * | entry | ) |

static

Definition at line 483 of file SDL_events.c.

References SDL_EventEntry::next, NULL, SDL_EventEntry::prev, SDL_assert, SDL_AtomicAdd, SDL_AtomicGet, and SDL_EventQ.

Referenced by SDL_FilterEvents(), SDL_FlushEvents(), and SDL_PeepEvents().

{
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);
}
SDL_EventEntry::next
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_EventQ
static struct @22 SDL_EventQ
SDL_assert
#define SDL_assert(condition)
Definition: SDL_assert.h:169
NULL
#define NULL
Definition: begin_code.h:164
SDL_AtomicAdd
#define SDL_AtomicAdd
Definition: SDL_dynapi_overrides.h:69
SDL_EventEntry::prev
struct _SDL_EventEntry * prev
Definition: SDL_events.c:66
SDL_AtomicGet
#define SDL_AtomicGet
Definition: SDL_dynapi_overrides.h:68

## SDL_DelEventWatch()

void SDL_DelEventWatch | ( | SDL_EventFilter | filter,
|  | void * | userdata
| ) |  |

Remove an event watch function added with SDL_AddEventWatch()

Definition at line 820 of file SDL_events.c.

References SDL_EventWatcher::callback, i, SDL_EventWatcher::removed, SDL_event_watchers_count, SDL_event_watchers_dispatching, SDL_event_watchers_removed, SDL_LockMutex, SDL_memmove, SDL_TRUE, and SDL_UnlockMutex.

{
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);
}
}
}
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_event_watchers
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_EventWatcher::removed
SDL_bool removed
Definition: SDL_events.c:44
SDL_event_watchers_count
static int SDL_event_watchers_count
Definition: SDL_events.c:50
SDL_event_watchers_dispatching
static SDL_bool SDL_event_watchers_dispatching
Definition: SDL_events.c:51
SDL_event_watchers_removed
static SDL_bool SDL_event_watchers_removed
Definition: SDL_events.c:52
callback
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34
SDL_memmove
#define SDL_memmove
Definition: SDL_dynapi_overrides.h:388
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_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
filter
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: SDL_opengl_glext.h:1184

## SDL_EventState()

Uint8 SDL_EventState | ( | Uint32 | type,
|  | int | state
| ) |  |

This function allows you to set the state of processing certain events.

- If `state` is set to SDL_IGNORE, that event will be automatically dropped from the event queue and will not be filtered.
- If `state` is set to SDL_ENABLE, that event will be processed normally.
- If `state` is set to SDL_QUERY, SDL_EventState() will return the current processing state of the specified event.

Definition at line 864 of file SDL_events.c.

References SDL_DisabledEventBlock::bits, SDL_calloc, SDL_DISABLE, SDL_ENABLE, and SDL_FlushEvent().

Referenced by SDL_StartEventLoop().

{
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;
}
state
struct xkb_state * state
Definition: SDL_waylandsym.h:113
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:722
bits
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
Definition: SDL_opengl_glext.h:6176
SDL_DisabledEventBlock::bits
Uint32 bits[8]
Definition: SDL_events.c:55
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:157
SDL_DisabledEventBlock
Definition: SDL_events.c:54
SDL_FlushEvent
void SDL_FlushEvent(Uint32 type)
Definition: SDL_events.c:599
SDL_DISABLE
#define SDL_DISABLE
Definition: SDL_events.h:721
SDL_calloc
#define SDL_calloc
Definition: SDL_dynapi_overrides.h:375
SDL_disabled_events
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:58
type
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571

## SDL_FilterEvents()

void SDL_FilterEvents | ( | SDL_EventFilter | filter,
|  | void * | userdata
| ) |  |

Run the filter function on the current event queue, removing any events for which the filter returns 0.

Definition at line 847 of file SDL_events.c.

References SDL_EventEntry::event, SDL_EventEntry::next, SDL_CutEvent(), SDL_EventQ, SDL_LockMutex, and SDL_UnlockMutex.

{
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);
}
}
}
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_EventEntry::next
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_EventEntry::event
SDL_Event event
Definition: SDL_events.c:64
SDL_EventQ
static struct @22 SDL_EventQ
SDL_EventEntry
Definition: SDL_events.c:62
SDL_CutEvent
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:483
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
filter
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: SDL_opengl_glext.h:1184

## SDL_FlushEvent()

void SDL_FlushEvent | ( | Uint32 | type | ) |

This function clears events from the event queue This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call SDL_PumpEvents() on the main thread immediately before the flush call.

Definition at line 599 of file SDL_events.c.

References SDL_FlushEvents().

Referenced by SDL_EventState().

{
SDL_FlushEvents(type, type);
}
SDL_FlushEvents
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:605
type
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571

## SDL_FlushEvents()

void SDL_FlushEvents | ( | Uint32 | minType,
|  | Uint32 | maxType
| ) |  |

Definition at line 605 of file SDL_events.c.

References SDL_EventEntry::event, SDL_EventEntry::next, SDL_AtomicGet, SDL_CutEvent(), SDL_EventQ, SDL_LockMutex, SDL_PumpEvents(), SDL_UnlockMutex, and SDL_Event::type.

Referenced by SDL_FlushEvent(), and SDL_SetEventFilter().

{
/* 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);
}
}
}
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_EventEntry::next
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_PumpEvents
void SDL_PumpEvents(void)
Definition: SDL_events.c:639
SDL_EventEntry::event
SDL_Event event
Definition: SDL_events.c:64
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_EventQ
static struct @22 SDL_EventQ
SDL_EventEntry
Definition: SDL_events.c:62
SDL_CutEvent
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:483
SDL_AtomicGet
#define SDL_AtomicGet
Definition: SDL_dynapi_overrides.h:68
type
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
SDL_Event::type
Uint32 type
Definition: SDL_events.h:527

## SDL_GetEventFilter()

SDL_bool SDL_GetEventFilter | ( | SDL_EventFilter * | filter,
|  | void ** | userdata
| ) |  |

Return the current event filter - can be used to "chain" filters. If there is no event filter set, this function returns SDL_FALSE.

Definition at line 772 of file SDL_events.c.

References SDL_EventWatcher::callback, SDL_EventOK, SDL_FALSE, SDL_LockMutex, SDL_TRUE, SDL_UnlockMutex, SDL_zero, and SDL_EventWatcher::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;
}
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_EventWatcher::callback
SDL_EventFilter callback
Definition: SDL_events.c:42
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
SDL_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
SDL_EventOK
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
SDL_EventWatcher::userdata
void * userdata
Definition: SDL_events.c:43
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_HasEvent()

SDL_bool SDL_HasEvent | ( | Uint32 | type | ) |

Checks to see if certain event types are in the event queue.

Definition at line 587 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

{
return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0);
}
SDL_PeepEvents
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:509
SDL_PEEKEVENT
Definition: SDL_events.h:579
NULL
#define NULL
Definition: begin_code.h:164
type
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571

## SDL_HasEvents()

SDL_bool SDL_HasEvents | ( | Uint32 | minType,
|  | Uint32 | maxType
| ) |  |

Definition at line 593 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

{
return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0);
}
SDL_PeepEvents
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:509
SDL_PEEKEVENT
Definition: SDL_events.h:579
NULL
#define NULL
Definition: begin_code.h:164

## SDL_PeepEvents()

int SDL_PeepEvents | ( | SDL_Event * | events,
|  | int | numevents,
|  | SDL_eventaction | action,
|  | Uint32 | minType,
|  | Uint32 | maxType
| ) |  |

Checks the event queue for messages and optionally returns them.

If `action` is SDL_ADDEVENT, up to `numevents` events will be added to the back of the event queue.

If `action` is SDL_PEEKEVENT, up to `numevents` events at the front of the event queue, within the specified minimum and maximum type, will be returned and will not be removed from the queue.

If `action` is SDL_GETEVENT, up to `numevents` events at the front of the event queue, within the specified minimum and maximum type, will be returned and will be removed from the queue.

Returns
  The number of events actually stored, or -1 if there was an error.

This function is thread-safe.

Definition at line 509 of file SDL_events.c.

References SDL_EventEntry::event, i, SDL_SysWMEntry::msg, SDL_SysWMEvent::msg, SDL_EventEntry::next, SDL_SysWMEntry::next, NULL, SDL_AddEvent(), SDL_ADDEVENT, SDL_AtomicGet, SDL_CutEvent(), SDL_EventQ, SDL_GETEVENT, SDL_LockMutex, SDL_malloc, SDL_SetError, SDL_SYSWMEVENT, SDL_UnlockMutex, SDL_Event::syswm, and SDL_Event::type.

Referenced by SDL_HasEvent(), SDL_HasEvents(), SDL_PushEvent(), and SDL_WaitEventTimeout().

{
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_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_EventEntry::next
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_SysWMEntry::msg
SDL_SysWMmsg msg
Definition: SDL_events.c:72
SDL_AddEvent
static int SDL_AddEvent(SDL_Event *event)
Definition: SDL_events.c:429
SDL_SysWMEvent::msg
SDL_SysWMmsg * msg
Definition: SDL_events.h:519
SDL_SYSWMEVENT
Definition: SDL_events.h:90
SDL_EventEntry::event
SDL_Event event
Definition: SDL_events.c:64
SDL_SysWMEntry
Definition: SDL_events.c:70
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_EventQ
static struct @22 SDL_EventQ
SDL_SysWMEntry::next
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:73
SDL_EventEntry
Definition: SDL_events.c:62
SDL_CutEvent
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:483
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
NULL
#define NULL
Definition: begin_code.h:164
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
SDL_Event::syswm
SDL_SysWMEvent syswm
Definition: SDL_events.h:547
SDL_AtomicGet
#define SDL_AtomicGet
Definition: SDL_dynapi_overrides.h:68
type
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
SDL_malloc
#define SDL_malloc
Definition: SDL_dynapi_overrides.h:374
SDL_GETEVENT
Definition: SDL_events.h:580
SDL_ADDEVENT
Definition: SDL_events.h:578
SDL_Event::type
Uint32 type
Definition: SDL_events.h:527

## SDL_PollEvent()

int SDL_PollEvent | ( | SDL_Event * | event | ) |

Polls for currently pending events.

Returns
  1 if there are any pending events, or 0 if there are none available.

Parameters

  event | If not NULL, the next event is removed from the queue and stored in that area.

Definition at line 660 of file SDL_events.c.

References SDL_WaitEventTimeout().

{
return SDL_WaitEventTimeout(event, 0);
}
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_PumpEvents()

void SDL_PumpEvents | ( | void |  | ) |

Pumps the event loop, gathering events from the input devices.

This function updates the event queue and internal input device state.

This should only be run in the thread that sets the video mode.

Definition at line 639 of file SDL_events.c.

References _this, SDL_VideoDevice::PumpEvents, SDL_GetVideoDevice(), SDL_JOYAXISMOTION, SDL_JoystickEventState, SDL_JoystickUpdate, SDL_QUERY, and SDL_SendPendingQuit().

Referenced by SDL_FlushEvents(), and SDL_WaitEventTimeout().

{
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. */
}
SDL_JOYAXISMOTION
Definition: SDL_events.h:108
_this
static SDL_VideoDevice * _this
Definition: SDL_video.c:121
SDL_JoystickUpdate
#define SDL_JoystickUpdate
Definition: SDL_dynapi_overrides.h:209
SDL_disabled_events
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:58
SDL_VideoDevice
Definition: SDL_sysvideo.h:147
SDL_JoystickEventState
#define SDL_JoystickEventState
Definition: SDL_dynapi_overrides.h:210
SDL_GetVideoDevice
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:586
SDL_SendPendingQuit
void SDL_SendPendingQuit(void)
Definition: SDL_quit.c:144
SDL_QUERY
#define SDL_QUERY
Definition: SDL_events.h:719
SDL_VideoDevice::PumpEvents
void(* PumpEvents)(_THIS)
Definition: SDL_sysvideo.h:280

## SDL_PushEvent()

int SDL_PushEvent | ( | SDL_Event * | event | ) |

Add an event to the event queue.

Returns
  1 on success, 0 if the event was filtered, or -1 if the event queue was full or there was some other error.

Definition at line 703 of file SDL_events.c.

References SDL_EventWatcher::callback, i, SDL_EventWatcher::removed, SDL_ADDEVENT, SDL_event_watchers_count, SDL_event_watchers_dispatching, SDL_event_watchers_removed, SDL_FALSE, SDL_GestureProcessEvent(), SDL_GetTicks(), SDL_LockMutex, SDL_memmove, SDL_PeepEvents(), SDL_TRUE, SDL_UnlockMutex, and SDL_EventWatcher::userdata.

Referenced by SDL_SendAppEvent(), and SDL_SendSysWMEvent().

{
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;
}
SDL_PeepEvents
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:509
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_event_watchers
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_TRUE
Definition: SDL_stdinc.h:142
SDL_EventWatcher::callback
SDL_EventFilter callback
Definition: SDL_events.c:42
SDL_FALSE
Definition: SDL_stdinc.h:141
SDL_event_watchers_count
static int SDL_event_watchers_count
Definition: SDL_events.c:50
SDL_event_watchers_dispatching
static SDL_bool SDL_event_watchers_dispatching
Definition: SDL_events.c:51
SDL_GestureProcessEvent
void SDL_GestureProcessEvent(SDL_Event *event)
Definition: SDL_gesture.c:538
SDL_event_watchers_removed
static SDL_bool SDL_event_watchers_removed
Definition: SDL_events.c:52
SDL_GetTicks
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
SDL_memmove
#define SDL_memmove
Definition: SDL_dynapi_overrides.h:388
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_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
SDL_EventOK
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
SDL_ADDEVENT
Definition: SDL_events.h:578
SDL_EventWatcher::userdata
void * userdata
Definition: SDL_events.c:43

## SDL_RegisterEvents()

Uint32 SDL_RegisterEvents | ( | int | numevents | ) |

This function allocates a set of user-defined events, and returns the beginning event number for that set of events.

If there aren't enough user-defined events left, this function returns (Uint32)-1

Definition at line 905 of file SDL_events.c.

References SDL_LASTEVENT, and SDL_userevents.

{
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;
}
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_userevents
static Uint32 SDL_userevents
Definition: SDL_events.c:59
SDL_LASTEVENT
Definition: SDL_events.h:159

## SDL_SendAppEvent()

int SDL_SendAppEvent | ( | SDL_EventType | eventType | ) |

Definition at line 919 of file SDL_events.c.

References SDL_ENABLE, SDL_GetEventState, and SDL_PushEvent().

Referenced by IsSDLWindowEventPending(), SDL_OnApplicationDidBecomeActive(), SDL_OnApplicationDidEnterBackground(), SDL_OnApplicationDidReceiveMemoryWarning(), SDL_OnApplicationWillEnterForeground(), SDL_OnApplicationWillResignActive(), SDL_OnApplicationWillTerminate(), SDL_SendKeymapChangedEvent(), and SDL_SendQuit().

{
int posted;
posted = 0;
if (SDL_GetEventState(eventType) == SDL_ENABLE) {
SDL_Event event;
event.type = eventType;
posted = (SDL_PushEvent(&event) > 0);
}
return (posted);
}
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:722
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_PushEvent
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:703
SDL_Event
General event structure.
Definition: SDL_events.h:525

## SDL_SendKeymapChangedEvent()

int SDL_SendKeymapChangedEvent | ( | void |  | ) |

Definition at line 950 of file SDL_events.c.

References SDL_KEYMAPCHANGED, and SDL_SendAppEvent().

{
return SDL_SendAppEvent(SDL_KEYMAPCHANGED);
}
SDL_SendAppEvent
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:919
SDL_KEYMAPCHANGED
Definition: SDL_events.h:97

## SDL_SendSysWMEvent()

int SDL_SendSysWMEvent | ( | SDL_SysWMmsg * | message | ) |

Definition at line 933 of file SDL_events.c.

References SDL_ENABLE, SDL_GetEventState, SDL_memset, SDL_PushEvent(), and SDL_SYSWMEVENT.

{
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);
}
message
GLuint GLsizei const GLchar * message
Definition: SDL_opengl_glext.h:2483
SDL_SYSWMEVENT
Definition: SDL_events.h:90
SDL_ENABLE
#define SDL_ENABLE
Definition: SDL_events.h:722
SDL_GetEventState
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
event
struct _cl_event * event
Definition: SDL_opengl_glext.h:2649
SDL_PushEvent
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:703
SDL_Event
General event structure.
Definition: SDL_events.h:525
SDL_memset
#define SDL_memset
Definition: SDL_dynapi_overrides.h:386

## SDL_SetEventFilter()

void SDL_SetEventFilter | ( | SDL_EventFilter | filter,
|  | void * | userdata
| ) |  |

Sets up a filter to process all events before they change internal state and are posted to the internal event queue.

The filter is prototyped as:

int SDL_EventFilter(void *userdata, SDL_Event * event);

If the filter returns 1, then the event will be added to the internal queue. If it returns 0, then the event will be dropped from the queue, but the internal state will still be updated. This allows selective filtering of dynamically arriving events.

Warning
  Be very careful of what you do in the event filter function, as it may run in a different thread!

There is one caveat when dealing with the SDL_QuitEvent event type. The event filter is only called when the window manager desires to close the application window. If the event filter returns 1, then the window will be closed, otherwise the window will remain open if possible.

If the quit event is generated by an interrupt signal, it will bypass the internal queue and be delivered to the application at the next event poll.

Definition at line 757 of file SDL_events.c.

References SDL_EventWatcher::callback, SDL_FIRSTEVENT, SDL_FlushEvents(), SDL_LASTEVENT, SDL_LockMutex, SDL_UnlockMutex, and SDL_EventWatcher::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_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_EventWatcher::callback
SDL_EventFilter callback
Definition: SDL_events.c:42
SDL_FlushEvents
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:605
SDL_FIRSTEVENT
Definition: SDL_events.h:57
SDL_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
SDL_EventOK
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
SDL_EventWatcher::userdata
void * userdata
Definition: SDL_events.c:43
SDL_LASTEVENT
Definition: SDL_events.h:159
filter
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: SDL_opengl_glext.h:1184

## SDL_StartEventLoop()

int SDL_StartEventLoop | ( | void |  | ) |

Definition at line 391 of file SDL_events.c.

References NULL, SDL_AtomicSet, SDL_CreateMutex, SDL_DISABLE, SDL_EventQ, SDL_EventState(), SDL_SYSWMEVENT, SDL_TEXTEDITING, and SDL_TEXTINPUT.

Referenced by SDL_InitSubSystem().

{
/* 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;
}
SDL_SYSWMEVENT
Definition: SDL_events.h:90
SDL_CreateMutex
#define SDL_CreateMutex
Definition: SDL_dynapi_overrides.h:259
SDL_EventQ
static struct @22 SDL_EventQ
SDL_EventState
Uint8 SDL_EventState(Uint32 type, int state)
Definition: SDL_events.c:864
SDL_DISABLE
#define SDL_DISABLE
Definition: SDL_events.h:721
NULL
#define NULL
Definition: begin_code.h:164
SDL_TEXTINPUT
Definition: SDL_events.h:96
SDL_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
SDL_AtomicSet
#define SDL_AtomicSet
Definition: SDL_dynapi_overrides.h:67
SDL_TEXTEDITING
Definition: SDL_events.h:95

## SDL_StopEventLoop()

void SDL_StopEventLoop | ( | void |  | ) |

Definition at line 317 of file SDL_events.c.

References i, SDL_EventEntry::next, SDL_SysWMEntry::next, NULL, SDL_arraysize, SDL_atoi, SDL_AtomicSet, SDL_DestroyMutex, SDL_event_watchers_count, SDL_EventQ, SDL_free, SDL_GetHint, SDL_LockMutex, SDL_Log, SDL_UnlockMutex, and SDL_zero.

Referenced by SDL_QuitSubSystem().

{
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;
}
}
SDL_LockMutex
#define SDL_LockMutex
Definition: SDL_dynapi_overrides.h:260
SDL_event_watchers
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_EventEntry::next
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_event_watchers_count
static int SDL_event_watchers_count
Definition: SDL_events.c:50
SDL_GetHint
#define SDL_GetHint
Definition: SDL_dynapi_overrides.h:191
SDL_SysWMEntry
Definition: SDL_events.c:70
SDL_EventQ
static struct @22 SDL_EventQ
SDL_SysWMEntry::next
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:73
SDL_Log
#define SDL_Log
Definition: SDL_dynapi_overrides.h:31
SDL_free
#define SDL_free
Definition: SDL_dynapi_overrides.h:377
SDL_zero
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
SDL_EventEntry
Definition: SDL_events.c:62
SDL_atoi
#define SDL_atoi
Definition: SDL_dynapi_overrides.h:410
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
NULL
#define NULL
Definition: begin_code.h:164
SDL_DestroyMutex
#define SDL_DestroyMutex
Definition: SDL_dynapi_overrides.h:263
SDL_disabled_events
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:58
SDL_event_watchers_lock
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
SDL_AtomicSet
#define SDL_AtomicSet
Definition: SDL_dynapi_overrides.h:67
SDL_EventOK
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
SDL_UnlockMutex
#define SDL_UnlockMutex
Definition: SDL_dynapi_overrides.h:262
SDL_arraysize
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93

## SDL_WaitEvent()

int SDL_WaitEvent | ( | SDL_Event * | event | ) |

Waits indefinitely for the next available event.

Returns
  1, or 0 if there was an error while waiting for events.

Parameters

  event | If not NULL, the next event is removed from the queue and stored in that area.

Definition at line 666 of file SDL_events.c.

References SDL_WaitEventTimeout().

{
return SDL_WaitEventTimeout(event, -1);
}
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_WaitEventTimeout()

int SDL_WaitEventTimeout | ( | SDL_Event * | event,
|  | int | timeout
| ) |  |

Waits until the specified timeout (in milliseconds) for the next available event.

Returns
  1, or 0 if there was an error while waiting for events.

Parameters

  event | If not NULL, the next event is removed from the queue and stored in that area.
  timeout | The timeout (in milliseconds) to wait for next event.

Definition at line 672 of file SDL_events.c.

References SDL_Delay, SDL_FIRSTEVENT, SDL_GETEVENT, SDL_GetTicks(), SDL_LASTEVENT, SDL_PeepEvents(), SDL_PumpEvents(), and SDL_TICKS_PASSED.

Referenced by SDL_PollEvent(), and SDL_WaitEvent().

{
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;
}
}
}
SDL_PeepEvents
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:509
SDL_PumpEvents
void SDL_PumpEvents(void)
Definition: SDL_events.c:639
Uint32
uint32_t Uint32
Definition: SDL_stdinc.h:181
SDL_GetTicks
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
SDL_Delay
#define SDL_Delay
Definition: SDL_dynapi_overrides.h:486
SDL_FIRSTEVENT
Definition: SDL_events.h:57
timeout
GLbitfield GLuint64 timeout
Definition: SDL_opengl_glext.h:1483
SDL_GETEVENT
Definition: SDL_events.h:580
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_LASTEVENT
Definition: SDL_events.h:159

## Variable Documentation

## active

SDL_atomic_t active

Definition at line 79 of file SDL_events.c.

## count

SDL_atomic_t count

Definition at line 80 of file SDL_events.c.

## free

SDL_EventEntry* free

Definition at line 84 of file SDL_events.c.

Referenced by decode_edid(), SDL_BWin::DirectConnected(), glGetConfig(), main(), SDL_PromptAssertion(), and SDL_BWin::~ SDL_BWin().

## head

SDL_EventEntry* head

Definition at line 82 of file SDL_events.c.

Referenced by change_mparam(), and mmap_alloc().

## lock

SDL_mutex* lock

Definition at line 78 of file SDL_events.c.

Referenced by RunBasicTest(), SDL_AtomicTryLock(), SDL_SYS_GetTLSData(), and SDL_ThreadID().

## max_events_seen

int max_events_seen

Definition at line 81 of file SDL_events.c.

## SDL_disabled_events

SDL_DisabledEventBlock* SDL_disabled_events[256]

static

Definition at line 58 of file SDL_events.c.

## SDL_event_watchers

SDL_EventWatcher* SDL_event_watchers = NULL

static

Definition at line 49 of file SDL_events.c.

## SDL_event_watchers_count

int SDL_event_watchers_count = 0

static

Definition at line 50 of file SDL_events.c.

Referenced by SDL_AddEventWatch(), SDL_DelEventWatch(), SDL_PushEvent(), and SDL_StopEventLoop().

## SDL_event_watchers_dispatching

SDL_bool SDL_event_watchers_dispatching = SDL_FALSE

static

Definition at line 51 of file SDL_events.c.

Referenced by SDL_DelEventWatch(), and SDL_PushEvent().

## SDL_event_watchers_lock

SDL_mutex* SDL_event_watchers_lock

static

Definition at line 47 of file SDL_events.c.

## SDL_event_watchers_removed

SDL_bool SDL_event_watchers_removed = SDL_FALSE

static

Definition at line 52 of file SDL_events.c.

Referenced by SDL_DelEventWatch(), and SDL_PushEvent().

## SDL_EventOK

SDL_EventWatcher SDL_EventOK

static

Definition at line 48 of file SDL_events.c.

Referenced by SDL_GetEventFilter().

## SDL_EventQ

struct { ... } SDL_EventQ

Referenced by SDL_AddEvent(), SDL_CutEvent(), SDL_FilterEvents(), SDL_FlushEvents(), SDL_PeepEvents(), SDL_StartEventLoop(), and SDL_StopEventLoop().

## SDL_userevents

Uint32 SDL_userevents = SDL_USEREVENT

static

Definition at line 59 of file SDL_events.c.

Referenced by SDL_RegisterEvents().

## tail

SDL_EventEntry* tail

Definition at line 83 of file SDL_events.c.

## wmmsg_free

SDL_SysWMEntry* wmmsg_free

Definition at line 86 of file SDL_events.c.

## wmmsg_used

SDL_SysWMEntry* wmmsg_used

Definition at line 85 of file SDL_events.c.