SDL 2.0
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
 
#define uint   unsigned int
 
#define SDL_EVENT_CASE(x)   case x: SDL_strlcpy(name, #x, sizeof (name));
 
#define SDL_WINDOWEVENT_CASE(x)   case x: SDL_strlcpy(name2, #x, sizeof (name2)); break
 
#define PRINT_KEY_EVENT(event)
 
#define PRINT_MBUTTON_EVENT(event)
 
#define PRINT_JBUTTON_EVENT(event)
 
#define PRINT_JOYDEV_EVENT(event)   SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d)", (uint) event->jdevice.timestamp, (int) event->jdevice.which)
 
#define PRINT_CBUTTON_EVENT(event)
 
#define PRINT_CONTROLLERDEV_EVENT(event)   SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d)", (uint) event->cdevice.timestamp, (int) event->cdevice.which)
 
#define PRINT_FINGER_EVENT(event)
 
#define PRINT_DOLLAR_EVENT(event)
 
#define PRINT_DROP_EVENT(event)   SDL_snprintf(details, sizeof (details), " (file='%s' timestamp=%u windowid=%u)", event->drop.file, (uint) event->drop.timestamp, (uint) event->drop.windowID)
 
#define PRINT_AUDIODEV_EVENT(event)   SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%u iscapture=%s)", (uint) event->adevice.timestamp, (uint) event->adevice.which, event->adevice.iscapture ? "true" : "false");
 

Functions

static void SDL_EventLoggingChanged (void *userdata, const char *name, const char *oldValue, const char *hint)
 
static void SDL_LogEvent (const SDL_Event *event)
 
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)
 
int SDL_EventsInit (void)
 
void SDL_EventsQuit (void)
 

Variables

static SDL_mutexSDL_event_watchers_lock
 
static SDL_EventWatcher SDL_EventOK
 
static SDL_EventWatcherSDL_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_DisabledEventBlockSDL_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 }
 
static int SDL_DoEventLogging = 0
 

Macro Definition Documentation

◆ PRINT_AUDIODEV_EVENT

#define PRINT_AUDIODEV_EVENT (   event)    SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%u iscapture=%s)", (uint) event->adevice.timestamp, (uint) event->adevice.which, event->adevice.iscapture ? "true" : "false");

◆ PRINT_CBUTTON_EVENT

#define PRINT_CBUTTON_EVENT (   event)
Value:
SDL_snprintf(details, sizeof (details), " (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")
#define SDL_snprintf
#define uint
#define SDL_PRESSED
Definition: SDL_events.h:50
struct _cl_event * event

◆ PRINT_CONTROLLERDEV_EVENT

#define PRINT_CONTROLLERDEV_EVENT (   event)    SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d)", (uint) event->cdevice.timestamp, (int) event->cdevice.which)

◆ PRINT_DOLLAR_EVENT

#define PRINT_DOLLAR_EVENT (   event)
Value:
SDL_snprintf(details, sizeof (details), " (timestamp=%u touchid=%"SDL_PRIs64" gestureid=%"SDL_PRIs64" numfingers=%u error=%f x=%f y=%f)", \
(uint) event->dgesture.timestamp, event->dgesture.touchId, \
event->dgesture.gestureId, (uint) event->dgesture.numFingers, \
event->dgesture.error, event->dgesture.x, event->dgesture.y);
#define SDL_PRIs64
Definition: SDL_stdinc.h:227

◆ PRINT_DROP_EVENT

#define PRINT_DROP_EVENT (   event)    SDL_snprintf(details, sizeof (details), " (file='%s' timestamp=%u windowid=%u)", event->drop.file, (uint) event->drop.timestamp, (uint) event->drop.windowID)

◆ PRINT_FINGER_EVENT

#define PRINT_FINGER_EVENT (   event)
Value:
SDL_snprintf(details, sizeof (details), " (timestamp=%u touchid=%"SDL_PRIs64" fingerid=%"SDL_PRIs64" x=%f y=%f dx=%f dy=%f pressure=%f)", \
(uint) event->tfinger.timestamp, event->tfinger.touchId, \
event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, \
event->tfinger.dx, event->tfinger.dy, event->tfinger.pressure)

◆ PRINT_JBUTTON_EVENT

#define PRINT_JBUTTON_EVENT (   event)
Value:
SDL_snprintf(details, sizeof (details), " (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")

◆ PRINT_JOYDEV_EVENT

#define PRINT_JOYDEV_EVENT (   event)    SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d)", (uint) event->jdevice.timestamp, (int) event->jdevice.which)

◆ PRINT_KEY_EVENT

#define PRINT_KEY_EVENT (   event)
Value:
SDL_snprintf(details, sizeof (details), " (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)

◆ PRINT_MBUTTON_EVENT

#define PRINT_MBUTTON_EVENT (   event)
Value:
SDL_snprintf(details, sizeof (details), " (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

#define SDL_EVENT_CASE (   x)    case x: SDL_strlcpy(name, #x, sizeof (name));

◆ SDL_MAX_QUEUED_EVENTS

#define SDL_MAX_QUEUED_EVENTS   65535

Definition at line 37 of file SDL_events.c.

◆ SDL_WINDOWEVENT_CASE

#define SDL_WINDOWEVENT_CASE (   x)    case x: SDL_strlcpy(name2, #x, sizeof (name2)); break

◆ uint

#define uint   unsigned int

Function Documentation

◆ SDL_AddEvent()

static int SDL_AddEvent ( SDL_Event event)
static

Definition at line 456 of file SDL_events.c.

457{
458 SDL_EventEntry *entry;
459 const int initial_count = SDL_AtomicGet(&SDL_EventQ.count);
460 int final_count;
461
462 if (initial_count >= SDL_MAX_QUEUED_EVENTS) {
463 SDL_SetError("Event queue is full (%d events)", initial_count);
464 return 0;
465 }
466
467 if (SDL_EventQ.free == NULL) {
468 entry = (SDL_EventEntry *)SDL_malloc(sizeof(*entry));
469 if (!entry) {
470 return 0;
471 }
472 } else {
473 entry = SDL_EventQ.free;
474 SDL_EventQ.free = entry->next;
475 }
476
477 if (SDL_DoEventLogging) {
479 }
480
481 entry->event = *event;
482 if (event->type == SDL_SYSWMEVENT) {
483 entry->msg = *event->syswm.msg;
484 entry->event.syswm.msg = &entry->msg;
485 }
486
487 if (SDL_EventQ.tail) {
488 SDL_EventQ.tail->next = entry;
489 entry->prev = SDL_EventQ.tail;
490 SDL_EventQ.tail = entry;
491 entry->next = NULL;
492 } else {
493 SDL_assert(!SDL_EventQ.head);
494 SDL_EventQ.head = entry;
495 SDL_EventQ.tail = entry;
496 entry->prev = NULL;
497 entry->next = NULL;
498 }
499
500 final_count = SDL_AtomicAdd(&SDL_EventQ.count, 1) + 1;
501 if (final_count > SDL_EventQ.max_events_seen) {
502 SDL_EventQ.max_events_seen = final_count;
503 }
504
505 return 1;
506}
#define SDL_assert(condition)
Definition: SDL_assert.h:169
#define SDL_SetError
#define SDL_malloc
#define SDL_AtomicGet
#define SDL_AtomicAdd
static struct @23 SDL_EventQ
#define SDL_MAX_QUEUED_EVENTS
Definition: SDL_events.c:37
static void SDL_LogEvent(const SDL_Event *event)
Definition: SDL_events.c:98
static int SDL_DoEventLogging
Definition: SDL_events.c:89
@ SDL_SYSWMEVENT
Definition: SDL_events.h:93
#define NULL
Definition: begin_code.h:167
Definition: SDL_events.c:61
SDL_Event event
Definition: SDL_events.c:62
struct _SDL_EventEntry * next
Definition: SDL_events.c:65
struct _SDL_EventEntry * prev
Definition: SDL_events.c:64
SDL_SysWMmsg msg
Definition: SDL_events.c:63
SDL_SysWMmsg * msg
Definition: SDL_events.h:551
union SDL_SysWMmsg::@15 msg
SDL_SysWMEvent syswm
Definition: SDL_events.h:581

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

Referenced by SDL_PeepEvents().

◆ 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 834 of file SDL_events.c.

835{
837 SDL_EventWatcher *event_watchers;
838
839 event_watchers = SDL_realloc(SDL_event_watchers, (SDL_event_watchers_count + 1) * sizeof(*event_watchers));
840 if (event_watchers) {
841 SDL_EventWatcher *watcher;
842
843 SDL_event_watchers = event_watchers;
845 watcher->callback = filter;
846 watcher->userdata = userdata;
847 watcher->removed = SDL_FALSE;
849 }
850
853 }
854 }
855}
#define SDL_LockMutex
#define SDL_realloc
#define SDL_UnlockMutex
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:45
static int SDL_event_watchers_count
Definition: SDL_events.c:48
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:47
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
@ SDL_FALSE
Definition: SDL_stdinc.h:163
SDL_EventFilter callback
Definition: SDL_events.c:40
SDL_bool removed
Definition: SDL_events.c:42

References SDL_EventWatcher::callback, SDL_EventWatcher::removed, SDL_event_watchers, SDL_event_watchers_count, SDL_event_watchers_lock, SDL_FALSE, SDL_LockMutex, SDL_realloc, SDL_UnlockMutex, and SDL_EventWatcher::userdata.

◆ SDL_CutEvent()

static void SDL_CutEvent ( SDL_EventEntry entry)
static

Definition at line 510 of file SDL_events.c.

511{
512 if (entry->prev) {
513 entry->prev->next = entry->next;
514 }
515 if (entry->next) {
516 entry->next->prev = entry->prev;
517 }
518
519 if (entry == SDL_EventQ.head) {
520 SDL_assert(entry->prev == NULL);
521 SDL_EventQ.head = entry->next;
522 }
523 if (entry == SDL_EventQ.tail) {
524 SDL_assert(entry->next == NULL);
525 SDL_EventQ.tail = entry->prev;
526 }
527
528 entry->next = SDL_EventQ.free;
529 SDL_EventQ.free = entry;
531 SDL_AtomicAdd(&SDL_EventQ.count, -1);
532}

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().

◆ SDL_DelEventWatch()

void SDL_DelEventWatch ( SDL_EventFilter  filter,
void userdata 
)

Remove an event watch function added with SDL_AddEventWatch()

Definition at line 858 of file SDL_events.c.

859{
861 int i;
862
863 for (i = 0; i < SDL_event_watchers_count; ++i) {
864 if (SDL_event_watchers[i].callback == filter && SDL_event_watchers[i].userdata == userdata) {
868 } else {
872 }
873 }
874 break;
875 }
876 }
877
880 }
881 }
882}
#define SDL_memmove
static SDL_bool SDL_event_watchers_dispatching
Definition: SDL_events.c:49
static SDL_bool SDL_event_watchers_removed
Definition: SDL_events.c:50
@ SDL_TRUE
Definition: SDL_stdinc.h:164
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
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34

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

◆ SDL_EventLoggingChanged()

static void SDL_EventLoggingChanged ( void userdata,
const char *  name,
const char *  oldValue,
const char *  hint 
)
static

Definition at line 92 of file SDL_events.c.

93{
94 SDL_DoEventLogging = (hint && *hint) ? SDL_max(SDL_min(SDL_atoi(hint), 2), 0) : 0;
95}
#define SDL_atoi
#define SDL_min(x, y)
Definition: SDL_stdinc.h:406
#define SDL_max(x, y)
Definition: SDL_stdinc.h:407

References SDL_atoi, SDL_DoEventLogging, SDL_max, and SDL_min.

Referenced by SDL_EventsInit(), and SDL_EventsQuit().

◆ SDL_EventsInit()

int SDL_EventsInit ( void  )

Definition at line 1002 of file SDL_events.c.

1003{
1005 if (SDL_StartEventLoop() < 0) {
1007 return -1;
1008 }
1009
1010 SDL_QuitInit();
1011
1012 return 0;
1013}
#define SDL_DelHintCallback
#define SDL_AddHintCallback
static void SDL_EventLoggingChanged(void *userdata, const char *name, const char *oldValue, const char *hint)
Definition: SDL_events.c:92
int SDL_StartEventLoop(void)
Definition: SDL_events.c:414
int SDL_QuitInit(void)
Definition: SDL_quit.c:154
#define SDL_HINT_EVENT_LOGGING
A variable controlling whether SDL logs all events pushed onto its internal queue.
Definition: SDL_hints.h:1109

References NULL, SDL_AddHintCallback, SDL_DelHintCallback, SDL_EventLoggingChanged(), SDL_HINT_EVENT_LOGGING, SDL_QuitInit(), and SDL_StartEventLoop().

Referenced by SDL_InitSubSystem().

◆ SDL_EventsQuit()

void SDL_EventsQuit ( void  )

◆ 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 902 of file SDL_events.c.

903{
904 const SDL_bool isdnd = ((state == SDL_DISABLE) || (state == SDL_ENABLE)) &&
905 ((type == SDL_DROPFILE) || (type == SDL_DROPTEXT));
906 Uint8 current_state;
907 Uint8 hi = ((type >> 8) & 0xff);
908 Uint8 lo = (type & 0xff);
909
910 if (SDL_disabled_events[hi] &&
911 (SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) {
912 current_state = SDL_DISABLE;
913 } else {
914 current_state = SDL_ENABLE;
915 }
916
917 if (state != current_state)
918 {
919 switch (state) {
920 case SDL_DISABLE:
921 /* Disable this event type and discard pending events */
922 if (!SDL_disabled_events[hi]) {
924 if (!SDL_disabled_events[hi]) {
925 /* Out of memory, nothing we can do... */
926 break;
927 }
928 }
929 SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31));
931 break;
932 case SDL_ENABLE:
933 SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31));
934 break;
935 default:
936 /* Querying state... */
937 break;
938 }
939 }
940
941 /* turn off drag'n'drop support if we've disabled the events.
942 This might change some UI details at the OS level. */
943 if (isdnd) {
945 }
946
947 return current_state;
948}
#define SDL_calloc
void SDL_FlushEvent(Uint32 type)
Definition: SDL_events.c:626
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:56
@ SDL_DROPTEXT
Definition: SDL_events.h:142
@ SDL_DROPFILE
Definition: SDL_events.h:141
#define SDL_DISABLE
Definition: SDL_events.h:758
#define SDL_ENABLE
Definition: SDL_events.h:759
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
SDL_bool
Definition: SDL_stdinc.h:162
uint8_t Uint8
Definition: SDL_stdinc.h:179
void SDL_ToggleDragAndDropSupport(void)
Definition: SDL_video.c:1371
struct xkb_state * state

References SDL_DisabledEventBlock::bits, SDL_calloc, SDL_DISABLE, SDL_disabled_events, SDL_DROPFILE, SDL_DROPTEXT, SDL_ENABLE, SDL_FlushEvent(), SDL_ToggleDragAndDropSupport(), and state.

Referenced by SDL_StartEventLoop().

◆ 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 885 of file SDL_events.c.

886{
887 if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
888 SDL_EventEntry *entry, *next;
889 for (entry = SDL_EventQ.head; entry; entry = next) {
890 next = entry->next;
891 if (!filter(userdata, &entry->event)) {
892 SDL_CutEvent(entry);
893 }
894 }
895 if (SDL_EventQ.lock) {
897 }
898 }
899}
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:510

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

◆ 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 626 of file SDL_events.c.

627{
629}
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:632

References SDL_FlushEvents().

Referenced by SDL_EventState().

◆ SDL_FlushEvents()

void SDL_FlushEvents ( Uint32  minType,
Uint32  maxType 
)

Definition at line 632 of file SDL_events.c.

633{
634 /* !!! FIXME: we need to manually SDL_free() the strings in TEXTINPUT and
635 drag'n'drop events if we're flushing them without passing them to the
636 app, but I don't know if this is the right place to do that. */
637
638 /* Don't look after we've quit */
639 if (!SDL_AtomicGet(&SDL_EventQ.active)) {
640 return;
641 }
642
643 /* Make sure the events are current */
644#if 0
645 /* Actually, we can't do this since we might be flushing while processing
646 a resize event, and calling this might trigger further resize events.
647 */
649#endif
650
651 /* Lock the event queue */
652 if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
653 SDL_EventEntry *entry, *next;
654 Uint32 type;
655 for (entry = SDL_EventQ.head; entry; entry = next) {
656 next = entry->next;
657 type = entry->event.type;
658 if (minType <= type && type <= maxType) {
659 SDL_CutEvent(entry);
660 }
661 }
662 if (SDL_EventQ.lock) {
664 }
665 }
666}
void SDL_PumpEvents(void)
Definition: SDL_events.c:670
uint32_t Uint32
Definition: SDL_stdinc.h:203
Uint32 type
Definition: SDL_events.h:559

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().

◆ 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 810 of file SDL_events.c.

811{
812 SDL_EventWatcher event_ok;
813
815 event_ok = SDL_EventOK;
816
819 }
820 } else {
821 SDL_zero(event_ok);
822 }
823
824 if (filter) {
825 *filter = event_ok.callback;
826 }
827 if (userdata) {
828 *userdata = event_ok.userdata;
829 }
830 return event_ok.callback ? SDL_TRUE : SDL_FALSE;
831}
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:46
#define SDL_zero(x)
Definition: SDL_stdinc.h:416

References SDL_EventWatcher::callback, SDL_event_watchers_lock, SDL_EventOK, SDL_FALSE, SDL_LockMutex, SDL_TRUE, SDL_UnlockMutex, SDL_zero, and SDL_EventWatcher::userdata.

◆ SDL_HasEvent()

SDL_bool SDL_HasEvent ( Uint32  type)

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

Definition at line 614 of file SDL_events.c.

615{
616 return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0);
617}
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:536
@ SDL_PEEKEVENT
Definition: SDL_events.h:616

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

◆ SDL_HasEvents()

SDL_bool SDL_HasEvents ( Uint32  minType,
Uint32  maxType 
)

Definition at line 620 of file SDL_events.c.

621{
622 return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0);
623}

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

◆ SDL_LogEvent()

static void SDL_LogEvent ( const SDL_Event event)
static

Definition at line 98 of file SDL_events.c.

99{
100 char name[32];
101 char details[128];
102
103 /* mouse/finger motion are spammy, ignore these if they aren't demanded. */
104 if ( (SDL_DoEventLogging < 2) &&
105 ( (event->type == SDL_MOUSEMOTION) ||
106 (event->type == SDL_FINGERMOTION) ) ) {
107 return;
108 }
109
110 /* this is to make SDL_snprintf() calls cleaner. */
111 #define uint unsigned int
112
113 name[0] = '\0';
114 details[0] = '\0';
115
116 /* !!! FIXME: This code is kinda ugly, sorry. */
117
118 if ((event->type >= SDL_USEREVENT) && (event->type <= SDL_LASTEVENT)) {
119 char plusstr[16];
120 SDL_strlcpy(name, "SDL_USEREVENT", sizeof (name));
121 if (event->type > SDL_USEREVENT) {
122 SDL_snprintf(plusstr, sizeof (plusstr), "+%u", ((uint) event->type) - SDL_USEREVENT);
123 } else {
124 plusstr[0] = '\0';
125 }
126 SDL_snprintf(details, sizeof (details), "%s (timestamp=%u windowid=%u code=%d data1=%p data2=%p)",
127 plusstr, (uint) event->user.timestamp, (uint) event->user.windowID,
128 (int) event->user.code, event->user.data1, event->user.data2);
129 }
130
131 switch (event->type) {
132 #define SDL_EVENT_CASE(x) case x: SDL_strlcpy(name, #x, sizeof (name));
133 SDL_EVENT_CASE(SDL_FIRSTEVENT) SDL_strlcpy(details, " (THIS IS PROBABLY A BUG!)", sizeof (details)); break;
134 SDL_EVENT_CASE(SDL_QUIT) SDL_snprintf(details, sizeof (details), " (timestamp=%u)", (uint) event->quit.timestamp); break;
145
147 char name2[64];
148 switch(event->window.event) {
149 case SDL_WINDOWEVENT_NONE: SDL_strlcpy(name2, "SDL_WINDOWEVENT_NONE (THIS IS PROBABLY A BUG!)", sizeof (name2)); break;
150 #define SDL_WINDOWEVENT_CASE(x) case x: SDL_strlcpy(name2, #x, sizeof (name2)); break
167 #undef SDL_WINDOWEVENT_CASE
168 default: SDL_strlcpy(name2, "UNKNOWN (bug? fixme?)", sizeof (name2)); break;
169 }
170 SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u event=%s data1=%d data2=%d)",
171 (uint) event->window.timestamp, (uint) event->window.windowID, name2, (int) event->window.data1, (int) event->window.data2);
172 break;
173 }
174
176 /* !!! FIXME: we don't delve further at the moment. */
177 SDL_snprintf(details, sizeof (details), " (timestamp=%u)", (uint) event->syswm.timestamp);
178 break;
179
180 #define PRINT_KEY_EVENT(event) \
181 SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u state=%s repeat=%s scancode=%u keycode=%u mod=%u)", \
182 (uint) event->key.timestamp, (uint) event->key.windowID, \
183 event->key.state == SDL_PRESSED ? "pressed" : "released", \
184 event->key.repeat ? "true" : "false", \
185 (uint) event->key.keysym.scancode, \
186 (uint) event->key.keysym.sym, \
187 (uint) event->key.keysym.mod)
190 #undef PRINT_KEY_EVENT
191
193 SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u text='%s' start=%d length=%d)",
194 (uint) event->edit.timestamp, (uint) event->edit.windowID,
195 event->edit.text, (int) event->edit.start, (int) event->edit.length);
196 break;
197
199 SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u text='%s')", (uint) event->text.timestamp, (uint) event->text.windowID, event->text.text);
200 break;
201
202
204 SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u which=%u state=%u x=%d y=%d xrel=%d yrel=%d)",
205 (uint) event->motion.timestamp, (uint) event->motion.windowID,
206 (uint) event->motion.which, (uint) event->motion.state,
207 (int) event->motion.x, (int) event->motion.y,
208 (int) event->motion.xrel, (int) event->motion.yrel);
209 break;
210
211 #define PRINT_MBUTTON_EVENT(event) \
212 SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u which=%u button=%u state=%s clicks=%u x=%d y=%d)", \
213 (uint) event->button.timestamp, (uint) event->button.windowID, \
214 (uint) event->button.which, (uint) event->button.button, \
215 event->button.state == SDL_PRESSED ? "pressed" : "released", \
216 (uint) event->button.clicks, (int) event->button.x, (int) event->button.y)
219 #undef PRINT_MBUTTON_EVENT
220
221
223 SDL_snprintf(details, sizeof (details), " (timestamp=%u windowid=%u which=%u x=%d y=%d direction=%s)",
224 (uint) event->wheel.timestamp, (uint) event->wheel.windowID,
225 (uint) event->wheel.which, (int) event->wheel.x, (int) event->wheel.y,
226 event->wheel.direction == SDL_MOUSEWHEEL_NORMAL ? "normal" : "flipped");
227 break;
228
230 SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d axis=%u value=%d)",
231 (uint) event->jaxis.timestamp, (int) event->jaxis.which,
232 (uint) event->jaxis.axis, (int) event->jaxis.value);
233 break;
234
236 SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d ball=%u xrel=%d yrel=%d)",
237 (uint) event->jball.timestamp, (int) event->jball.which,
238 (uint) event->jball.ball, (int) event->jball.xrel, (int) event->jball.yrel);
239 break;
240
242 SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d hat=%u value=%u)",
243 (uint) event->jhat.timestamp, (int) event->jhat.which,
244 (uint) event->jhat.hat, (uint) event->jhat.value);
245 break;
246
247 #define PRINT_JBUTTON_EVENT(event) \
248 SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d button=%u state=%s)", \
249 (uint) event->jbutton.timestamp, (int) event->jbutton.which, \
250 (uint) event->jbutton.button, event->jbutton.state == SDL_PRESSED ? "pressed" : "released")
253 #undef PRINT_JBUTTON_EVENT
254
255 #define PRINT_JOYDEV_EVENT(event) SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d)", (uint) event->jdevice.timestamp, (int) event->jdevice.which)
258 #undef PRINT_JOYDEV_EVENT
259
261 SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d axis=%u value=%d)",
262 (uint) event->caxis.timestamp, (int) event->caxis.which,
263 (uint) event->caxis.axis, (int) event->caxis.value);
264 break;
265
266 #define PRINT_CBUTTON_EVENT(event) \
267 SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d button=%u state=%s)", \
268 (uint) event->cbutton.timestamp, (int) event->cbutton.which, \
269 (uint) event->cbutton.button, event->cbutton.state == SDL_PRESSED ? "pressed" : "released")
272 #undef PRINT_CBUTTON_EVENT
273
274 #define PRINT_CONTROLLERDEV_EVENT(event) SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%d)", (uint) event->cdevice.timestamp, (int) event->cdevice.which)
278 #undef PRINT_CONTROLLERDEV_EVENT
279
280 #define PRINT_FINGER_EVENT(event) \
281 SDL_snprintf(details, sizeof (details), " (timestamp=%u touchid=%"SDL_PRIs64" fingerid=%"SDL_PRIs64" x=%f y=%f dx=%f dy=%f pressure=%f)", \
282 (uint) event->tfinger.timestamp, event->tfinger.touchId, \
283 event->tfinger.fingerId, event->tfinger.x, event->tfinger.y, \
284 event->tfinger.dx, event->tfinger.dy, event->tfinger.pressure)
288 #undef PRINT_FINGER_EVENT
289
290 #define PRINT_DOLLAR_EVENT(event) \
291 SDL_snprintf(details, sizeof (details), " (timestamp=%u touchid=%"SDL_PRIs64" gestureid=%"SDL_PRIs64" numfingers=%u error=%f x=%f y=%f)", \
292 (uint) event->dgesture.timestamp, event->dgesture.touchId, \
293 event->dgesture.gestureId, (uint) event->dgesture.numFingers, \
294 event->dgesture.error, event->dgesture.x, event->dgesture.y);
297 #undef PRINT_DOLLAR_EVENT
298
300 SDL_snprintf(details, sizeof (details), " (timestamp=%u touchid=%"SDL_PRIs64" dtheta=%f ddist=%f x=%f y=%f numfingers=%u)",
301 (uint) event->mgesture.timestamp, event->mgesture.touchId,
302 event->mgesture.dTheta, event->mgesture.dDist,
303 event->mgesture.x, event->mgesture.y, (uint) event->mgesture.numFingers);
304 break;
305
306 #define PRINT_DROP_EVENT(event) SDL_snprintf(details, sizeof (details), " (file='%s' timestamp=%u windowid=%u)", event->drop.file, (uint) event->drop.timestamp, (uint) event->drop.windowID)
311 #undef PRINT_DROP_EVENT
312
313 #define PRINT_AUDIODEV_EVENT(event) SDL_snprintf(details, sizeof (details), " (timestamp=%u which=%u iscapture=%s)", (uint) event->adevice.timestamp, (uint) event->adevice.which, event->adevice.iscapture ? "true" : "false");
316 #undef PRINT_AUDIODEV_EVENT
317
318 #undef SDL_EVENT_CASE
319
320 default:
321 if (!name[0]) {
322 SDL_strlcpy(name, "UNKNOWN", sizeof (name));
323 SDL_snprintf(details, sizeof (details), " #%u! (Bug? FIXME?)", (uint) event->type);
324 }
325 break;
326 }
327
328 if (name[0]) {
329 SDL_Log("SDL EVENT: %s%s", name, details);
330 }
331
332 #undef uint
333}
#define SDL_strlcpy
#define SDL_Log
#define PRINT_CONTROLLERDEV_EVENT(event)
#define SDL_EVENT_CASE(x)
#define PRINT_DOLLAR_EVENT(event)
#define PRINT_KEY_EVENT(event)
#define PRINT_DROP_EVENT(event)
#define PRINT_JOYDEV_EVENT(event)
#define PRINT_AUDIODEV_EVENT(event)
#define PRINT_FINGER_EVENT(event)
#define SDL_WINDOWEVENT_CASE(x)
#define PRINT_JBUTTON_EVENT(event)
#define PRINT_CBUTTON_EVENT(event)
#define PRINT_MBUTTON_EVENT(event)
@ SDL_MOUSEMOTION
Definition: SDL_events.h:105
@ SDL_JOYDEVICEADDED
Definition: SDL_events.h:116
@ SDL_DROPBEGIN
Definition: SDL_events.h:143
@ SDL_FINGERMOTION
Definition: SDL_events.h:130
@ SDL_TEXTEDITING
Definition: SDL_events.h:98
@ SDL_QUIT
Definition: SDL_events.h:60
@ SDL_APP_LOWMEMORY
Definition: SDL_events.h:67
@ SDL_JOYBUTTONDOWN
Definition: SDL_events.h:114
@ SDL_APP_WILLENTERFOREGROUND
Definition: SDL_events.h:79
@ SDL_USEREVENT
Definition: SDL_events.h:160
@ SDL_MOUSEBUTTONUP
Definition: SDL_events.h:107
@ SDL_JOYDEVICEREMOVED
Definition: SDL_events.h:117
@ SDL_TEXTINPUT
Definition: SDL_events.h:99
@ SDL_WINDOWEVENT
Definition: SDL_events.h:92
@ SDL_MOUSEWHEEL
Definition: SDL_events.h:108
@ SDL_CLIPBOARDUPDATE
Definition: SDL_events.h:138
@ SDL_JOYBUTTONUP
Definition: SDL_events.h:115
@ SDL_JOYBALLMOTION
Definition: SDL_events.h:112
@ SDL_FINGERUP
Definition: SDL_events.h:129
@ SDL_RENDER_DEVICE_RESET
Definition: SDL_events.h:155
@ SDL_CONTROLLERBUTTONUP
Definition: SDL_events.h:122
@ SDL_MOUSEBUTTONDOWN
Definition: SDL_events.h:106
@ SDL_CONTROLLERDEVICEADDED
Definition: SDL_events.h:123
@ SDL_APP_DIDENTERFOREGROUND
Definition: SDL_events.h:83
@ SDL_DOLLARRECORD
Definition: SDL_events.h:134
@ SDL_APP_WILLENTERBACKGROUND
Definition: SDL_events.h:71
@ SDL_MULTIGESTURE
Definition: SDL_events.h:135
@ SDL_FINGERDOWN
Definition: SDL_events.h:128
@ SDL_DROPCOMPLETE
Definition: SDL_events.h:144
@ SDL_DOLLARGESTURE
Definition: SDL_events.h:133
@ SDL_CONTROLLERBUTTONDOWN
Definition: SDL_events.h:121
@ SDL_APP_DIDENTERBACKGROUND
Definition: SDL_events.h:75
@ SDL_APP_TERMINATING
Definition: SDL_events.h:63
@ SDL_CONTROLLERAXISMOTION
Definition: SDL_events.h:120
@ SDL_KEYDOWN
Definition: SDL_events.h:96
@ SDL_KEYMAPCHANGED
Definition: SDL_events.h:100
@ SDL_AUDIODEVICEREMOVED
Definition: SDL_events.h:148
@ SDL_AUDIODEVICEADDED
Definition: SDL_events.h:147
@ SDL_KEYUP
Definition: SDL_events.h:97
@ SDL_CONTROLLERDEVICEREMOVED
Definition: SDL_events.h:124
@ SDL_RENDER_TARGETS_RESET
Definition: SDL_events.h:154
@ SDL_CONTROLLERDEVICEREMAPPED
Definition: SDL_events.h:125
@ SDL_JOYAXISMOTION
Definition: SDL_events.h:111
@ SDL_JOYHATMOTION
Definition: SDL_events.h:113
@ SDL_FIRSTEVENT
Definition: SDL_events.h:57
@ SDL_LASTEVENT
Definition: SDL_events.h:165
@ SDL_MOUSEWHEEL_NORMAL
Definition: SDL_mouse.h:68
GLuint const GLchar * name
@ SDL_WINDOWEVENT_HIDDEN
Definition: SDL_video.h:150
@ SDL_WINDOWEVENT_FOCUS_LOST
Definition: SDL_video.h:166
@ SDL_WINDOWEVENT_CLOSE
Definition: SDL_video.h:167
@ SDL_WINDOWEVENT_RESIZED
Definition: SDL_video.h:155
@ SDL_WINDOWEVENT_HIT_TEST
Definition: SDL_video.h:169
@ SDL_WINDOWEVENT_FOCUS_GAINED
Definition: SDL_video.h:165
@ SDL_WINDOWEVENT_SHOWN
Definition: SDL_video.h:149
@ SDL_WINDOWEVENT_MOVED
Definition: SDL_video.h:153
@ SDL_WINDOWEVENT_TAKE_FOCUS
Definition: SDL_video.h:168
@ SDL_WINDOWEVENT_MINIMIZED
Definition: SDL_video.h:159
@ SDL_WINDOWEVENT_LEAVE
Definition: SDL_video.h:164
@ SDL_WINDOWEVENT_MAXIMIZED
Definition: SDL_video.h:160
@ SDL_WINDOWEVENT_SIZE_CHANGED
Definition: SDL_video.h:156
@ SDL_WINDOWEVENT_RESTORED
Definition: SDL_video.h:161
@ SDL_WINDOWEVENT_EXPOSED
Definition: SDL_video.h:151
@ SDL_WINDOWEVENT_ENTER
Definition: SDL_video.h:163
@ SDL_WINDOWEVENT_NONE
Definition: SDL_video.h:148

References PRINT_AUDIODEV_EVENT, PRINT_CBUTTON_EVENT, PRINT_CONTROLLERDEV_EVENT, PRINT_DOLLAR_EVENT, PRINT_DROP_EVENT, PRINT_FINGER_EVENT, PRINT_JBUTTON_EVENT, PRINT_JOYDEV_EVENT, PRINT_KEY_EVENT, PRINT_MBUTTON_EVENT, SDL_APP_DIDENTERBACKGROUND, SDL_APP_DIDENTERFOREGROUND, SDL_APP_LOWMEMORY, SDL_APP_TERMINATING, SDL_APP_WILLENTERBACKGROUND, SDL_APP_WILLENTERFOREGROUND, SDL_AUDIODEVICEADDED, SDL_AUDIODEVICEREMOVED, SDL_CLIPBOARDUPDATE, SDL_CONTROLLERAXISMOTION, SDL_CONTROLLERBUTTONDOWN, SDL_CONTROLLERBUTTONUP, SDL_CONTROLLERDEVICEADDED, SDL_CONTROLLERDEVICEREMAPPED, SDL_CONTROLLERDEVICEREMOVED, SDL_DoEventLogging, SDL_DOLLARGESTURE, SDL_DOLLARRECORD, SDL_DROPBEGIN, SDL_DROPCOMPLETE, SDL_DROPFILE, SDL_DROPTEXT, SDL_EVENT_CASE, SDL_FINGERDOWN, SDL_FINGERMOTION, SDL_FINGERUP, SDL_FIRSTEVENT, SDL_JOYAXISMOTION, SDL_JOYBALLMOTION, SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP, SDL_JOYDEVICEADDED, SDL_JOYDEVICEREMOVED, SDL_JOYHATMOTION, SDL_KEYDOWN, SDL_KEYMAPCHANGED, SDL_KEYUP, SDL_LASTEVENT, SDL_Log, SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP, SDL_MOUSEMOTION, SDL_MOUSEWHEEL, SDL_MOUSEWHEEL_NORMAL, SDL_MULTIGESTURE, SDL_PRIs64, SDL_QUIT, SDL_RENDER_DEVICE_RESET, SDL_RENDER_TARGETS_RESET, SDL_snprintf, SDL_strlcpy, SDL_SYSWMEVENT, SDL_TEXTEDITING, SDL_TEXTINPUT, SDL_USEREVENT, SDL_WINDOWEVENT, SDL_WINDOWEVENT_CASE, SDL_WINDOWEVENT_CLOSE, SDL_WINDOWEVENT_ENTER, SDL_WINDOWEVENT_EXPOSED, SDL_WINDOWEVENT_FOCUS_GAINED, SDL_WINDOWEVENT_FOCUS_LOST, SDL_WINDOWEVENT_HIDDEN, SDL_WINDOWEVENT_HIT_TEST, SDL_WINDOWEVENT_LEAVE, SDL_WINDOWEVENT_MAXIMIZED, SDL_WINDOWEVENT_MINIMIZED, SDL_WINDOWEVENT_MOVED, SDL_WINDOWEVENT_NONE, SDL_WINDOWEVENT_RESIZED, SDL_WINDOWEVENT_RESTORED, SDL_WINDOWEVENT_SHOWN, SDL_WINDOWEVENT_SIZE_CHANGED, SDL_WINDOWEVENT_TAKE_FOCUS, and uint.

Referenced by SDL_AddEvent().

◆ 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 536 of file SDL_events.c.

538{
539 int i, used;
540
541 /* Don't look after we've quit */
542 if (!SDL_AtomicGet(&SDL_EventQ.active)) {
543 /* We get a few spurious events at shutdown, so don't warn then */
544 if (action != SDL_ADDEVENT) {
545 SDL_SetError("The event system has been shut down");
546 }
547 return (-1);
548 }
549 /* Lock the event queue */
550 used = 0;
551 if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
552 if (action == SDL_ADDEVENT) {
553 for (i = 0; i < numevents; ++i) {
554 used += SDL_AddEvent(&events[i]);
555 }
556 } else {
557 SDL_EventEntry *entry, *next;
558 SDL_SysWMEntry *wmmsg, *wmmsg_next;
559 Uint32 type;
560
561 if (action == SDL_GETEVENT) {
562 /* Clean out any used wmmsg data
563 FIXME: Do we want to retain the data for some period of time?
564 */
565 for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; wmmsg = wmmsg_next) {
566 wmmsg_next = wmmsg->next;
567 wmmsg->next = SDL_EventQ.wmmsg_free;
568 SDL_EventQ.wmmsg_free = wmmsg;
569 }
570 SDL_EventQ.wmmsg_used = NULL;
571 }
572
573 for (entry = SDL_EventQ.head; entry && (!events || used < numevents); entry = next) {
574 next = entry->next;
575 type = entry->event.type;
576 if (minType <= type && type <= maxType) {
577 if (events) {
578 events[used] = entry->event;
579 if (entry->event.type == SDL_SYSWMEVENT) {
580 /* We need to copy the wmmsg somewhere safe.
581 For now we'll guarantee it's valid at least until
582 the next call to SDL_PeepEvents()
583 */
584 if (SDL_EventQ.wmmsg_free) {
585 wmmsg = SDL_EventQ.wmmsg_free;
586 SDL_EventQ.wmmsg_free = wmmsg->next;
587 } else {
588 wmmsg = (SDL_SysWMEntry *)SDL_malloc(sizeof(*wmmsg));
589 }
590 wmmsg->msg = *entry->event.syswm.msg;
591 wmmsg->next = SDL_EventQ.wmmsg_used;
592 SDL_EventQ.wmmsg_used = wmmsg;
593 events[used].syswm.msg = &wmmsg->msg;
594 }
595
596 if (action == SDL_GETEVENT) {
597 SDL_CutEvent(entry);
598 }
599 }
600 ++used;
601 }
602 }
603 }
604 if (SDL_EventQ.lock) {
606 }
607 } else {
608 return SDL_SetError("Couldn't lock event queue");
609 }
610 return (used);
611}
static int SDL_AddEvent(SDL_Event *event)
Definition: SDL_events.c:456
@ SDL_ADDEVENT
Definition: SDL_events.h:615
@ SDL_GETEVENT
Definition: SDL_events.h:617
Definition: SDL_events.c:69
SDL_SysWMmsg msg
Definition: SDL_events.c:70
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:71
static SDL_Event events[EVENT_BUF_SIZE]
Definition: testgesture.c:39

References SDL_EventEntry::event, events, i, SDL_SysWMEvent::msg, SDL_SysWMEntry::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().

◆ 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
eventIf not NULL, the next event is removed from the queue and stored in that area.

Definition at line 698 of file SDL_events.c.

699{
700 return SDL_WaitEventTimeout(event, 0);
701}
int SDL_WaitEventTimeout(SDL_Event *event, int timeout)
Waits until the specified timeout (in milliseconds) for the next available event.
Definition: SDL_events.c:710

References SDL_WaitEventTimeout().

◆ 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 670 of file SDL_events.c.

671{
673
674 /* Get events from the video subsystem */
675 if (_this) {
677 }
678#if !SDL_JOYSTICK_DISABLED
679 /* Check for joystick state change */
682 }
683#endif
684
685#if !SDL_SENSOR_DISABLED
686 /* Check for sensor state change */
689 }
690#endif
691
692 SDL_SendPendingSignalEvents(); /* in case we had a signal handler fire, etc. */
693}
#define SDL_JoystickUpdate
#define SDL_SensorUpdate
#define SDL_JoystickEventState
@ SDL_SENSORUPDATE
Definition: SDL_events.h:151
#define SDL_QUERY
Definition: SDL_events.h:756
void SDL_SendPendingSignalEvents(void)
Definition: SDL_quit.c:175
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:583
static SDL_VideoDevice * _this
Definition: SDL_video.c:118
void(* PumpEvents)(_THIS)
Definition: SDL_sysvideo.h:281

References _this, SDL_VideoDevice::PumpEvents, SDL_disabled_events, SDL_GetVideoDevice(), SDL_JOYAXISMOTION, SDL_JoystickEventState, SDL_JoystickUpdate, SDL_QUERY, SDL_SendPendingSignalEvents(), SDL_SENSORUPDATE, and SDL_SensorUpdate.

Referenced by SDL_FlushEvents(), and SDL_WaitEventTimeout().

◆ 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 741 of file SDL_events.c.

742{
743 event->common.timestamp = SDL_GetTicks();
744
750 }
751 return 0;
752 }
753
754 if (SDL_event_watchers_count > 0) {
755 /* Make sure we only dispatch the current watcher list */
756 int i, event_watchers_count = SDL_event_watchers_count;
757
759 for (i = 0; i < event_watchers_count; ++i) {
760 if (!SDL_event_watchers[i].removed) {
762 }
763 }
765
767 for (i = SDL_event_watchers_count; i--; ) {
768 if (SDL_event_watchers[i].removed) {
772 }
773 }
774 }
776 }
777 }
778
781 }
782 }
783 }
784
785 if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {
786 return -1;
787 }
788
790
791 return 1;
792}
void SDL_GestureProcessEvent(SDL_Event *event)
Definition: SDL_gesture.c:542
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.

References SDL_EventWatcher::callback, i, SDL_ADDEVENT, SDL_event_watchers, SDL_event_watchers_count, SDL_event_watchers_dispatching, SDL_event_watchers_lock, SDL_event_watchers_removed, SDL_EventOK, 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().

◆ 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 951 of file SDL_events.c.

952{
953 Uint32 event_base;
954
955 if ((numevents > 0) && (SDL_userevents+numevents <= SDL_LASTEVENT)) {
956 event_base = SDL_userevents;
957 SDL_userevents += numevents;
958 } else {
959 event_base = (Uint32)-1;
960 }
961 return event_base;
962}
static Uint32 SDL_userevents
Definition: SDL_events.c:57

References SDL_LASTEVENT, and SDL_userevents.

◆ SDL_SendAppEvent()

int SDL_SendAppEvent ( SDL_EventType  eventType)

Definition at line 965 of file SDL_events.c.

966{
967 int posted;
968
969 posted = 0;
970 if (SDL_GetEventState(eventType) == SDL_ENABLE) {
972 event.type = eventType;
973 posted = (SDL_PushEvent(&event) > 0);
974 }
975 return (posted);
976}
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:741
#define SDL_GetEventState(type)
Definition: SDL_events.h:772
General event structure.
Definition: SDL_events.h:558

References SDL_ENABLE, SDL_GetEventState, and SDL_PushEvent().

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

◆ SDL_SendKeymapChangedEvent()

int SDL_SendKeymapChangedEvent ( void  )

Definition at line 996 of file SDL_events.c.

997{
999}
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:965

References SDL_KEYMAPCHANGED, and SDL_SendAppEvent().

◆ SDL_SendSysWMEvent()

int SDL_SendSysWMEvent ( SDL_SysWMmsg message)

Definition at line 979 of file SDL_events.c.

980{
981 int posted;
982
983 posted = 0;
986 SDL_memset(&event, 0, sizeof(event));
987 event.type = SDL_SYSWMEVENT;
988 event.syswm.msg = message;
989 posted = (SDL_PushEvent(&event) > 0);
990 }
991 /* Update internal event state */
992 return (posted);
993}
#define SDL_memset
GLuint GLsizei const GLchar * message

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

◆ 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);
int(* SDL_EventFilter)(void *userdata, SDL_Event *event)
Definition: SDL_events.h:699

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 795 of file SDL_events.c.

796{
798 /* Set filter and discard pending events */
800 SDL_EventOK.userdata = userdata;
802
805 }
806 }
807}

References SDL_EventWatcher::callback, SDL_event_watchers_lock, SDL_EventOK, SDL_FIRSTEVENT, SDL_FlushEvents(), SDL_LASTEVENT, SDL_LockMutex, SDL_UnlockMutex, and SDL_EventWatcher::userdata.

◆ SDL_StartEventLoop()

int SDL_StartEventLoop ( void  )

Definition at line 414 of file SDL_events.c.

415{
416 /* We'll leave the event queue alone, since we might have gotten
417 some important events at launch (like SDL_DROPFILE)
418
419 FIXME: Does this introduce any other bugs with events at startup?
420 */
421
422 /* Create the lock and set ourselves active */
423#if !SDL_THREADS_DISABLED
424 if (!SDL_EventQ.lock) {
426 if (SDL_EventQ.lock == NULL) {
427 return -1;
428 }
429 }
430
434 return -1;
435 }
436 }
437#endif /* !SDL_THREADS_DISABLED */
438
439 /* Process most event types */
443#if 0 /* Leave these events enabled so apps can respond to items being dragged onto them at startup */
446#endif
447
448 SDL_AtomicSet(&SDL_EventQ.active, 1);
449
450 return 0;
451}
#define SDL_AtomicSet
#define SDL_CreateMutex
Uint8 SDL_EventState(Uint32 type, int state)
Definition: SDL_events.c:902

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

Referenced by SDL_EventsInit().

◆ SDL_StopEventLoop()

void SDL_StopEventLoop ( void  )

Definition at line 340 of file SDL_events.c.

341{
342 const char *report = SDL_GetHint("SDL_EVENT_QUEUE_STATISTICS");
343 int i;
344 SDL_EventEntry *entry;
345 SDL_SysWMEntry *wmmsg;
346
347 if (SDL_EventQ.lock) {
349 }
350
351 SDL_AtomicSet(&SDL_EventQ.active, 0);
352
353 if (report && SDL_atoi(report)) {
354 SDL_Log("SDL EVENT QUEUE: Maximum events in-flight: %d\n",
355 SDL_EventQ.max_events_seen);
356 }
357
358 /* Clean out EventQ */
359 for (entry = SDL_EventQ.head; entry; ) {
360 SDL_EventEntry *next = entry->next;
361 SDL_free(entry);
362 entry = next;
363 }
364 for (entry = SDL_EventQ.free; entry; ) {
365 SDL_EventEntry *next = entry->next;
366 SDL_free(entry);
367 entry = next;
368 }
369 for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; ) {
370 SDL_SysWMEntry *next = wmmsg->next;
371 SDL_free(wmmsg);
372 wmmsg = next;
373 }
374 for (wmmsg = SDL_EventQ.wmmsg_free; wmmsg; ) {
375 SDL_SysWMEntry *next = wmmsg->next;
376 SDL_free(wmmsg);
377 wmmsg = next;
378 }
379
380 SDL_AtomicSet(&SDL_EventQ.count, 0);
381 SDL_EventQ.max_events_seen = 0;
382 SDL_EventQ.head = NULL;
383 SDL_EventQ.tail = NULL;
384 SDL_EventQ.free = NULL;
385 SDL_EventQ.wmmsg_used = NULL;
386 SDL_EventQ.wmmsg_free = NULL;
387
388 /* Clear disabled event state */
389 for (i = 0; i < SDL_arraysize(SDL_disabled_events); ++i) {
392 }
393
397 }
398 if (SDL_event_watchers) {
402 }
404
405 if (SDL_EventQ.lock) {
408 SDL_EventQ.lock = NULL;
409 }
410}
#define SDL_free
#define SDL_DestroyMutex
#define SDL_GetHint
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:115

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

Referenced by SDL_EventsQuit().

◆ 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
eventIf not NULL, the next event is removed from the queue and stored in that area.

Definition at line 704 of file SDL_events.c.

705{
706 return SDL_WaitEventTimeout(event, -1);
707}

References SDL_WaitEventTimeout().

◆ 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
eventIf not NULL, the next event is removed from the queue and stored in that area.
timeoutThe timeout (in milliseconds) to wait for next event.

Definition at line 710 of file SDL_events.c.

711{
712 Uint32 expiration = 0;
713
714 if (timeout > 0)
715 expiration = SDL_GetTicks() + timeout;
716
717 for (;;) {
720 case -1:
721 return 0;
722 case 0:
723 if (timeout == 0) {
724 /* Polling and no events, just return */
725 return 0;
726 }
727 if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) {
728 /* Timeout expired and no events */
729 return 0;
730 }
731 SDL_Delay(10);
732 break;
733 default:
734 /* Has events */
735 return 1;
736 }
737 }
738}
#define SDL_Delay
GLbitfield GLuint64 timeout
#define SDL_TICKS_PASSED(A, B)
Compare SDL ticks values, and return true if A has passed B.
Definition: SDL_timer.h:56

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().

Variable Documentation

◆ active

SDL_atomic_t active

Definition at line 77 of file SDL_events.c.

Referenced by SDL_BWin::WindowActivated().

◆ count

Definition at line 78 of file SDL_events.c.

◆ free

◆ head

Definition at line 80 of file SDL_events.c.

Referenced by mmap_alloc().

◆ lock

◆ max_events_seen

int max_events_seen

Definition at line 79 of file SDL_events.c.

◆ SDL_disabled_events

SDL_DisabledEventBlock* SDL_disabled_events[256]
static

Definition at line 56 of file SDL_events.c.

Referenced by SDL_EventState(), SDL_PumpEvents(), and SDL_StopEventLoop().

◆ SDL_DoEventLogging

int SDL_DoEventLogging = 0
static

Definition at line 89 of file SDL_events.c.

Referenced by SDL_AddEvent(), SDL_EventLoggingChanged(), and SDL_LogEvent().

◆ SDL_event_watchers

SDL_EventWatcher* SDL_event_watchers = NULL
static

◆ SDL_event_watchers_count

int SDL_event_watchers_count = 0
static

◆ SDL_event_watchers_dispatching

SDL_bool SDL_event_watchers_dispatching = SDL_FALSE
static

Definition at line 49 of file SDL_events.c.

Referenced by SDL_DelEventWatch(), and SDL_PushEvent().

◆ SDL_event_watchers_lock

◆ SDL_event_watchers_removed

SDL_bool SDL_event_watchers_removed = SDL_FALSE
static

Definition at line 50 of file SDL_events.c.

Referenced by SDL_DelEventWatch(), and SDL_PushEvent().

◆ SDL_EventOK

SDL_EventWatcher SDL_EventOK
static

◆ 

◆ SDL_userevents

Uint32 SDL_userevents = SDL_USEREVENT
static

Definition at line 57 of file SDL_events.c.

Referenced by SDL_RegisterEvents().

◆ tail

Definition at line 81 of file SDL_events.c.

◆ wmmsg_free

SDL_SysWMEntry* wmmsg_free

Definition at line 84 of file SDL_events.c.

◆ wmmsg_used

SDL_SysWMEntry* wmmsg_used

Definition at line 83 of file SDL_events.c.