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
 

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_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 }
 

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

431 {
432  SDL_EventEntry *entry;
433  const int initial_count = SDL_AtomicGet(&SDL_EventQ.count);
434  int final_count;
435 
436  if (initial_count >= SDL_MAX_QUEUED_EVENTS) {
437  SDL_SetError("Event queue is full (%d events)", initial_count);
438  return 0;
439  }
440 
441  if (SDL_EventQ.free == NULL) {
442  entry = (SDL_EventEntry *)SDL_malloc(sizeof(*entry));
443  if (!entry) {
444  return 0;
445  }
446  } else {
447  entry = SDL_EventQ.free;
448  SDL_EventQ.free = entry->next;
449  }
450 
451  #ifdef SDL_DEBUG_EVENTS
452  SDL_DebugPrintEvent(event);
453  #endif
454 
455  entry->event = *event;
456  if (event->type == SDL_SYSWMEVENT) {
457  entry->msg = *event->syswm.msg;
458  entry->event.syswm.msg = &entry->msg;
459  }
460 
461  if (SDL_EventQ.tail) {
462  SDL_EventQ.tail->next = entry;
463  entry->prev = SDL_EventQ.tail;
464  SDL_EventQ.tail = entry;
465  entry->next = NULL;
466  } else {
467  SDL_assert(!SDL_EventQ.head);
468  SDL_EventQ.head = entry;
469  SDL_EventQ.tail = entry;
470  entry->prev = NULL;
471  entry->next = NULL;
472  }
473 
474  final_count = SDL_AtomicAdd(&SDL_EventQ.count, 1) + 1;
475  if (final_count > SDL_EventQ.max_events_seen) {
476  SDL_EventQ.max_events_seen = final_count;
477  }
478 
479  return 1;
480 }
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_SysWMmsg * msg
Definition: SDL_events.h:519
#define SDL_MAX_QUEUED_EVENTS
Definition: SDL_events.c:39
SDL_Event event
Definition: SDL_events.c:64
union SDL_SysWMmsg::@16 msg
static struct @22 SDL_EventQ
struct _cl_event * event
Definition: SDL_events.c:62
#define SDL_assert(condition)
Definition: SDL_assert.h:169
#define NULL
Definition: begin_code.h:164
#define SDL_AtomicAdd
#define SDL_SetError
SDL_SysWMEvent syswm
Definition: SDL_events.h:547
struct _SDL_EventEntry * prev
Definition: SDL_events.c:66
#define SDL_AtomicGet
#define SDL_malloc
Uint32 type
Definition: SDL_events.h:527
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 797 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.

798 {
800  SDL_EventWatcher *event_watchers;
801 
802  event_watchers = SDL_realloc(SDL_event_watchers, (SDL_event_watchers_count + 1) * sizeof(*event_watchers));
803  if (event_watchers) {
804  SDL_EventWatcher *watcher;
805 
806  SDL_event_watchers = event_watchers;
808  watcher->callback = filter;
809  watcher->userdata = userdata;
810  watcher->removed = SDL_FALSE;
812  }
813 
816  }
817  }
818 }
#define SDL_LockMutex
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_bool removed
Definition: SDL_events.c:44
SDL_EventFilter callback
Definition: SDL_events.c:42
static int SDL_event_watchers_count
Definition: SDL_events.c:50
#define SDL_realloc
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
#define SDL_UnlockMutex
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter

◆ SDL_CutEvent()

static void SDL_CutEvent ( SDL_EventEntry entry)
static

Definition at line 484 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().

485 {
486  if (entry->prev) {
487  entry->prev->next = entry->next;
488  }
489  if (entry->next) {
490  entry->next->prev = entry->prev;
491  }
492 
493  if (entry == SDL_EventQ.head) {
494  SDL_assert(entry->prev == NULL);
495  SDL_EventQ.head = entry->next;
496  }
497  if (entry == SDL_EventQ.tail) {
498  SDL_assert(entry->next == NULL);
499  SDL_EventQ.tail = entry->prev;
500  }
501 
502  entry->next = SDL_EventQ.free;
503  SDL_EventQ.free = entry;
504  SDL_assert(SDL_AtomicGet(&SDL_EventQ.count) > 0);
505  SDL_AtomicAdd(&SDL_EventQ.count, -1);
506 }
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
static struct @22 SDL_EventQ
#define SDL_assert(condition)
Definition: SDL_assert.h:169
#define NULL
Definition: begin_code.h:164
#define SDL_AtomicAdd
struct _SDL_EventEntry * prev
Definition: SDL_events.c:66
#define SDL_AtomicGet

◆ SDL_DelEventWatch()

void SDL_DelEventWatch ( SDL_EventFilter  filter,
void userdata 
)

Remove an event watch function added with SDL_AddEventWatch()

Definition at line 821 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.

822 {
824  int i;
825 
826  for (i = 0; i < SDL_event_watchers_count; ++i) {
827  if (SDL_event_watchers[i].callback == filter && SDL_event_watchers[i].userdata == userdata) {
831  } else {
833  if (i < SDL_event_watchers_count) {
834  SDL_memmove(&SDL_event_watchers[i], &SDL_event_watchers[i+1], (SDL_event_watchers_count - i) * sizeof(SDL_event_watchers[i]));
835  }
836  }
837  break;
838  }
839  }
840 
843  }
844  }
845 }
#define SDL_LockMutex
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_bool removed
Definition: SDL_events.c:44
static int SDL_event_watchers_count
Definition: SDL_events.c:50
static SDL_bool SDL_event_watchers_dispatching
Definition: SDL_events.c:51
static SDL_bool SDL_event_watchers_removed
Definition: SDL_events.c:52
static Uint32 callback(Uint32 interval, void *param)
Definition: testtimer.c:34
#define SDL_memmove
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 SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
#define SDL_UnlockMutex
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter

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

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

Referenced by SDL_StartEventLoop().

866 {
867  Uint8 current_state;
868  Uint8 hi = ((type >> 8) & 0xff);
869  Uint8 lo = (type & 0xff);
870 
871  if (SDL_disabled_events[hi] &&
872  (SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) {
873  current_state = SDL_DISABLE;
874  } else {
875  current_state = SDL_ENABLE;
876  }
877 
878  if (state != current_state)
879  {
880  switch (state) {
881  case SDL_DISABLE:
882  /* Disable this event type and discard pending events */
883  if (!SDL_disabled_events[hi]) {
885  if (!SDL_disabled_events[hi]) {
886  /* Out of memory, nothing we can do... */
887  break;
888  }
889  }
890  SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31));
892  break;
893  case SDL_ENABLE:
894  SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31));
895  break;
896  default:
897  /* Querying state... */
898  break;
899  }
900  }
901 
902  return current_state;
903 }
struct xkb_state * state
#define SDL_ENABLE
Definition: SDL_events.h:722
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
uint8_t Uint8
Definition: SDL_stdinc.h:157
void SDL_FlushEvent(Uint32 type)
Definition: SDL_events.c:600
#define SDL_DISABLE
Definition: SDL_events.h:721
#define SDL_calloc
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:58
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 848 of file SDL_events.c.

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

849 {
850  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
851  SDL_EventEntry *entry, *next;
852  for (entry = SDL_EventQ.head; entry; entry = next) {
853  next = entry->next;
854  if (!filter(userdata, &entry->event)) {
855  SDL_CutEvent(entry);
856  }
857  }
858  if (SDL_EventQ.lock) {
860  }
861  }
862 }
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_Event event
Definition: SDL_events.c:64
static struct @22 SDL_EventQ
Definition: SDL_events.c:62
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:484
#define SDL_UnlockMutex
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter

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

References SDL_FlushEvents().

Referenced by SDL_EventState().

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

◆ SDL_FlushEvents()

void SDL_FlushEvents ( Uint32  minType,
Uint32  maxType 
)

Definition at line 606 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().

607 {
608  /* Don't look after we've quit */
609  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
610  return;
611  }
612 
613  /* Make sure the events are current */
614 #if 0
615  /* Actually, we can't do this since we might be flushing while processing
616  a resize event, and calling this might trigger further resize events.
617  */
618  SDL_PumpEvents();
619 #endif
620 
621  /* Lock the event queue */
622  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
623  SDL_EventEntry *entry, *next;
624  Uint32 type;
625  for (entry = SDL_EventQ.head; entry; entry = next) {
626  next = entry->next;
627  type = entry->event.type;
628  if (minType <= type && type <= maxType) {
629  SDL_CutEvent(entry);
630  }
631  }
632  if (SDL_EventQ.lock) {
634  }
635  }
636 }
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
void SDL_PumpEvents(void)
Definition: SDL_events.c:640
SDL_Event event
Definition: SDL_events.c:64
uint32_t Uint32
Definition: SDL_stdinc.h:181
static struct @22 SDL_EventQ
Definition: SDL_events.c:62
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:484
#define SDL_AtomicGet
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
#define SDL_UnlockMutex
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 773 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.

774 {
775  SDL_EventWatcher event_ok;
776 
778  event_ok = SDL_EventOK;
779 
782  }
783  } else {
784  SDL_zero(event_ok);
785  }
786 
787  if (filter) {
788  *filter = event_ok.callback;
789  }
790  if (userdata) {
791  *userdata = event_ok.userdata;
792  }
793  return event_ok.callback ? SDL_TRUE : SDL_FALSE;
794 }
#define SDL_LockMutex
SDL_EventFilter callback
Definition: SDL_events.c:42
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
#define SDL_UnlockMutex
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter

◆ SDL_HasEvent()

SDL_bool SDL_HasEvent ( Uint32  type)

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

Definition at line 588 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

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

◆ SDL_HasEvents()

SDL_bool SDL_HasEvents ( Uint32  minType,
Uint32  maxType 
)

Definition at line 594 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

595 {
596  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0);
597 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:510
#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 510 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().

512 {
513  int i, used;
514 
515  /* Don't look after we've quit */
516  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
517  /* We get a few spurious events at shutdown, so don't warn then */
518  if (action != SDL_ADDEVENT) {
519  SDL_SetError("The event system has been shut down");
520  }
521  return (-1);
522  }
523  /* Lock the event queue */
524  used = 0;
525  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
526  if (action == SDL_ADDEVENT) {
527  for (i = 0; i < numevents; ++i) {
528  used += SDL_AddEvent(&events[i]);
529  }
530  } else {
531  SDL_EventEntry *entry, *next;
532  SDL_SysWMEntry *wmmsg, *wmmsg_next;
533  Uint32 type;
534 
535  if (action == SDL_GETEVENT) {
536  /* Clean out any used wmmsg data
537  FIXME: Do we want to retain the data for some period of time?
538  */
539  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; wmmsg = wmmsg_next) {
540  wmmsg_next = wmmsg->next;
541  wmmsg->next = SDL_EventQ.wmmsg_free;
542  SDL_EventQ.wmmsg_free = wmmsg;
543  }
544  SDL_EventQ.wmmsg_used = NULL;
545  }
546 
547  for (entry = SDL_EventQ.head; entry && (!events || used < numevents); entry = next) {
548  next = entry->next;
549  type = entry->event.type;
550  if (minType <= type && type <= maxType) {
551  if (events) {
552  events[used] = entry->event;
553  if (entry->event.type == SDL_SYSWMEVENT) {
554  /* We need to copy the wmmsg somewhere safe.
555  For now we'll guarantee it's valid at least until
556  the next call to SDL_PeepEvents()
557  */
558  if (SDL_EventQ.wmmsg_free) {
559  wmmsg = SDL_EventQ.wmmsg_free;
560  SDL_EventQ.wmmsg_free = wmmsg->next;
561  } else {
562  wmmsg = (SDL_SysWMEntry *)SDL_malloc(sizeof(*wmmsg));
563  }
564  wmmsg->msg = *entry->event.syswm.msg;
565  wmmsg->next = SDL_EventQ.wmmsg_used;
566  SDL_EventQ.wmmsg_used = wmmsg;
567  events[used].syswm.msg = &wmmsg->msg;
568  }
569 
570  if (action == SDL_GETEVENT) {
571  SDL_CutEvent(entry);
572  }
573  }
574  ++used;
575  }
576  }
577  }
578  if (SDL_EventQ.lock) {
580  }
581  } else {
582  return SDL_SetError("Couldn't lock event queue");
583  }
584  return (used);
585 }
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
SDL_SysWMmsg msg
Definition: SDL_events.c:72
static int SDL_AddEvent(SDL_Event *event)
Definition: SDL_events.c:430
SDL_SysWMmsg * msg
Definition: SDL_events.h:519
SDL_Event event
Definition: SDL_events.c:64
Definition: SDL_events.c:70
uint32_t Uint32
Definition: SDL_stdinc.h:181
static struct @22 SDL_EventQ
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:73
Definition: SDL_events.c:62
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:484
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
#define NULL
Definition: begin_code.h:164
#define SDL_SetError
SDL_SysWMEvent syswm
Definition: SDL_events.h:547
#define SDL_AtomicGet
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
#define SDL_UnlockMutex
#define SDL_malloc
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
eventIf not NULL, the next event is removed from the queue and stored in that area.

Definition at line 661 of file SDL_events.c.

References SDL_WaitEventTimeout().

662 {
663  return SDL_WaitEventTimeout(event, 0);
664 }
int SDL_WaitEventTimeout(SDL_Event *event, int timeout)
Waits until the specified timeout (in milliseconds) for the next available event. ...
Definition: SDL_events.c:673

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

641 {
643 
644  /* Get events from the video subsystem */
645  if (_this) {
646  _this->PumpEvents(_this);
647  }
648 #if !SDL_JOYSTICK_DISABLED
649  /* Check for joystick state change */
652  }
653 #endif
654 
655  SDL_SendPendingQuit(); /* in case we had a signal handler fire, etc. */
656 }
static SDL_VideoDevice * _this
Definition: SDL_video.c:121
#define SDL_JoystickUpdate
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:58
#define SDL_JoystickEventState
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:586
void SDL_SendPendingQuit(void)
Definition: SDL_quit.c:144
#define SDL_QUERY
Definition: SDL_events.h:719
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 704 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().

705 {
706  event->common.timestamp = SDL_GetTicks();
707 
713  }
714  return 0;
715  }
716 
717  if (SDL_event_watchers_count > 0) {
718  /* Make sure we only dispatch the current watcher list */
719  int i, event_watchers_count = SDL_event_watchers_count;
720 
722  for (i = 0; i < event_watchers_count; ++i) {
723  if (!SDL_event_watchers[i].removed) {
724  SDL_event_watchers[i].callback(SDL_event_watchers[i].userdata, event);
725  }
726  }
728 
730  for (i = SDL_event_watchers_count; i--; ) {
731  if (SDL_event_watchers[i].removed) {
733  if (i < SDL_event_watchers_count) {
735  }
736  }
737  }
739  }
740  }
741 
744  }
745  }
746  }
747 
748  if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {
749  return -1;
750  }
751 
753 
754  return 1;
755 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:510
#define SDL_LockMutex
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_EventFilter callback
Definition: SDL_events.c:42
static int SDL_event_watchers_count
Definition: SDL_events.c:50
static SDL_bool SDL_event_watchers_dispatching
Definition: SDL_events.c:51
void SDL_GestureProcessEvent(SDL_Event *event)
Definition: SDL_gesture.c:538
static SDL_bool SDL_event_watchers_removed
Definition: SDL_events.c:52
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#define SDL_memmove
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 SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
#define SDL_UnlockMutex

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

References SDL_LASTEVENT, and SDL_userevents.

907 {
908  Uint32 event_base;
909 
910  if ((numevents > 0) && (SDL_userevents+numevents <= SDL_LASTEVENT)) {
911  event_base = SDL_userevents;
912  SDL_userevents += numevents;
913  } else {
914  event_base = (Uint32)-1;
915  }
916  return event_base;
917 }
uint32_t Uint32
Definition: SDL_stdinc.h:181
static Uint32 SDL_userevents
Definition: SDL_events.c:59

◆ SDL_SendAppEvent()

int SDL_SendAppEvent ( SDL_EventType  eventType)

Definition at line 920 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().

921 {
922  int posted;
923 
924  posted = 0;
925  if (SDL_GetEventState(eventType) == SDL_ENABLE) {
927  event.type = eventType;
928  posted = (SDL_PushEvent(&event) > 0);
929  }
930  return (posted);
931 }
#define SDL_ENABLE
Definition: SDL_events.h:722
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
struct _cl_event * event
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:704
General event structure.
Definition: SDL_events.h:525

◆ SDL_SendKeymapChangedEvent()

int SDL_SendKeymapChangedEvent ( void  )

Definition at line 951 of file SDL_events.c.

References SDL_KEYMAPCHANGED, and SDL_SendAppEvent().

952 {
954 }
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:920

◆ SDL_SendSysWMEvent()

int SDL_SendSysWMEvent ( SDL_SysWMmsg message)

Definition at line 934 of file SDL_events.c.

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

935 {
936  int posted;
937 
938  posted = 0;
941  SDL_memset(&event, 0, sizeof(event));
942  event.type = SDL_SYSWMEVENT;
943  event.syswm.msg = message;
944  posted = (SDL_PushEvent(&event) > 0);
945  }
946  /* Update internal event state */
947  return (posted);
948 }
GLuint GLsizei const GLchar * message
#define SDL_ENABLE
Definition: SDL_events.h:722
#define SDL_GetEventState(type)
Definition: SDL_events.h:735
struct _cl_event * event
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:704
General event structure.
Definition: SDL_events.h:525
#define SDL_memset

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

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

759 {
761  /* Set filter and discard pending events */
763  SDL_EventOK.userdata = userdata;
765 
768  }
769  }
770 }
#define SDL_LockMutex
SDL_EventFilter callback
Definition: SDL_events.c:42
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:606
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
#define SDL_UnlockMutex
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter

◆ SDL_StartEventLoop()

int SDL_StartEventLoop ( void  )

Definition at line 392 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().

393 {
394  /* We'll leave the event queue alone, since we might have gotten
395  some important events at launch (like SDL_DROPFILE)
396 
397  FIXME: Does this introduce any other bugs with events at startup?
398  */
399 
400  /* Create the lock and set ourselves active */
401 #if !SDL_THREADS_DISABLED
402  if (!SDL_EventQ.lock) {
403  SDL_EventQ.lock = SDL_CreateMutex();
404  if (SDL_EventQ.lock == NULL) {
405  return -1;
406  }
407  }
408 
411  if (SDL_event_watchers_lock == NULL) {
412  return -1;
413  }
414  }
415 #endif /* !SDL_THREADS_DISABLED */
416 
417  /* Process most event types */
421 
422  SDL_AtomicSet(&SDL_EventQ.active, 1);
423 
424  return 0;
425 }
#define SDL_CreateMutex
static struct @22 SDL_EventQ
Uint8 SDL_EventState(Uint32 type, int state)
Definition: SDL_events.c:865
#define SDL_DISABLE
Definition: SDL_events.h:721
#define NULL
Definition: begin_code.h:164
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
#define SDL_AtomicSet

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

318 {
319  const char *report = SDL_GetHint("SDL_EVENT_QUEUE_STATISTICS");
320  int i;
321  SDL_EventEntry *entry;
322  SDL_SysWMEntry *wmmsg;
323 
324  if (SDL_EventQ.lock) {
326  }
327 
328  SDL_AtomicSet(&SDL_EventQ.active, 0);
329 
330  if (report && SDL_atoi(report)) {
331  SDL_Log("SDL EVENT QUEUE: Maximum events in-flight: %d\n",
332  SDL_EventQ.max_events_seen);
333  }
334 
335  /* Clean out EventQ */
336  for (entry = SDL_EventQ.head; entry; ) {
337  SDL_EventEntry *next = entry->next;
338  SDL_free(entry);
339  entry = next;
340  }
341  for (entry = SDL_EventQ.free; entry; ) {
342  SDL_EventEntry *next = entry->next;
343  SDL_free(entry);
344  entry = next;
345  }
346  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; ) {
347  SDL_SysWMEntry *next = wmmsg->next;
348  SDL_free(wmmsg);
349  wmmsg = next;
350  }
351  for (wmmsg = SDL_EventQ.wmmsg_free; wmmsg; ) {
352  SDL_SysWMEntry *next = wmmsg->next;
353  SDL_free(wmmsg);
354  wmmsg = next;
355  }
356 
357  SDL_AtomicSet(&SDL_EventQ.count, 0);
358  SDL_EventQ.max_events_seen = 0;
359  SDL_EventQ.head = NULL;
360  SDL_EventQ.tail = NULL;
361  SDL_EventQ.free = NULL;
362  SDL_EventQ.wmmsg_used = NULL;
363  SDL_EventQ.wmmsg_free = NULL;
364 
365  /* Clear disabled event state */
366  for (i = 0; i < SDL_arraysize(SDL_disabled_events); ++i) {
369  }
370 
375  }
376  if (SDL_event_watchers) {
380  }
382 
383  if (SDL_EventQ.lock) {
386  SDL_EventQ.lock = NULL;
387  }
388 }
#define SDL_LockMutex
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
static int SDL_event_watchers_count
Definition: SDL_events.c:50
#define SDL_GetHint
Definition: SDL_events.c:70
static struct @22 SDL_EventQ
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:73
#define SDL_Log
#define SDL_free
#define SDL_zero(x)
Definition: SDL_stdinc.h:416
Definition: SDL_events.c:62
#define SDL_atoi
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
#define NULL
Definition: begin_code.h:164
#define SDL_DestroyMutex
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:58
static SDL_mutex * SDL_event_watchers_lock
Definition: SDL_events.c:47
#define SDL_AtomicSet
static SDL_EventWatcher SDL_EventOK
Definition: SDL_events.c:48
#define SDL_UnlockMutex
#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
eventIf not NULL, the next event is removed from the queue and stored in that area.

Definition at line 667 of file SDL_events.c.

References SDL_WaitEventTimeout().

668 {
669  return SDL_WaitEventTimeout(event, -1);
670 }
int SDL_WaitEventTimeout(SDL_Event *event, int timeout)
Waits until the specified timeout (in milliseconds) for the next available event. ...
Definition: SDL_events.c:673

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

674 {
675  Uint32 expiration = 0;
676 
677  if (timeout > 0)
678  expiration = SDL_GetTicks() + timeout;
679 
680  for (;;) {
681  SDL_PumpEvents();
683  case -1:
684  return 0;
685  case 0:
686  if (timeout == 0) {
687  /* Polling and no events, just return */
688  return 0;
689  }
690  if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) {
691  /* Timeout expired and no events */
692  return 0;
693  }
694  SDL_Delay(10);
695  break;
696  default:
697  /* Has events */
698  return 1;
699  }
700  }
701 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:510
void SDL_PumpEvents(void)
Definition: SDL_events.c:640
uint32_t Uint32
Definition: SDL_stdinc.h:181
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
#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

Variable Documentation

◆ active

SDL_atomic_t active

Definition at line 79 of file SDL_events.c.

◆ count

Definition at line 80 of file SDL_events.c.

◆ free

◆ 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

◆ 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

◆ SDL_userevents

Uint32 SDL_userevents = SDL_USEREVENT
static

Definition at line 59 of file SDL_events.c.

Referenced by SDL_RegisterEvents().

◆ 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.