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

SDL_EventFilter SDL_EventOK = NULL
 
voidSDL_EventOKParam
 
static SDL_EventWatcherSDL_event_watchers = NULL
 
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 417 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().

418 {
419  SDL_EventEntry *entry;
420  const int initial_count = SDL_AtomicGet(&SDL_EventQ.count);
421  int final_count;
422 
423  if (initial_count >= SDL_MAX_QUEUED_EVENTS) {
424  SDL_SetError("Event queue is full (%d events)", initial_count);
425  return 0;
426  }
427 
428  if (SDL_EventQ.free == NULL) {
429  entry = (SDL_EventEntry *)SDL_malloc(sizeof(*entry));
430  if (!entry) {
431  return 0;
432  }
433  } else {
434  entry = SDL_EventQ.free;
435  SDL_EventQ.free = entry->next;
436  }
437 
438  #ifdef SDL_DEBUG_EVENTS
439  SDL_DebugPrintEvent(event);
440  #endif
441 
442  entry->event = *event;
443  if (event->type == SDL_SYSWMEVENT) {
444  entry->msg = *event->syswm.msg;
445  entry->event.syswm.msg = &entry->msg;
446  }
447 
448  if (SDL_EventQ.tail) {
449  SDL_EventQ.tail->next = entry;
450  entry->prev = SDL_EventQ.tail;
451  SDL_EventQ.tail = entry;
452  entry->next = NULL;
453  } else {
454  SDL_assert(!SDL_EventQ.head);
455  SDL_EventQ.head = entry;
456  SDL_EventQ.tail = entry;
457  entry->prev = NULL;
458  entry->next = NULL;
459  }
460 
461  final_count = SDL_AtomicAdd(&SDL_EventQ.count, 1) + 1;
462  if (final_count > SDL_EventQ.max_events_seen) {
463  SDL_EventQ.max_events_seen = final_count;
464  }
465 
466  return 1;
467 }
struct _SDL_EventEntry * next
Definition: SDL_events.c:66
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:63
union SDL_SysWMmsg::@16 msg
struct _cl_event * event
Definition: SDL_events.c:61
#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:65
#define SDL_AtomicGet
#define SDL_malloc
static struct @21 SDL_EventQ
Uint32 type
Definition: SDL_events.h:527
SDL_SysWMmsg msg
Definition: SDL_events.c:64

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

References SDL_EventWatcher::callback, SDL_EventWatcher::next, NULL, SDL_malloc, tail, and SDL_EventWatcher::userdata.

737 {
738  SDL_EventWatcher *watcher, *tail;
739 
740  watcher = (SDL_EventWatcher *)SDL_malloc(sizeof(*watcher));
741  if (!watcher) {
742  /* Uh oh... */
743  return;
744  }
745 
746  /* create the watcher */
747  watcher->callback = filter;
748  watcher->userdata = userdata;
749  watcher->next = NULL;
750 
751  /* add the watcher to the end of the list */
752  if (SDL_event_watchers) {
753  for (tail = SDL_event_watchers; tail->next; tail = tail->next) {
754  continue;
755  }
756  tail->next = watcher;
757  } else {
758  SDL_event_watchers = watcher;
759  }
760 }
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:51
SDL_EventFilter callback
Definition: SDL_events.c:46
struct SDL_EventWatcher * next
Definition: SDL_events.c:48
#define NULL
Definition: begin_code.h:164
SDL_EventEntry * tail
Definition: SDL_events.c:82
#define SDL_malloc
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter

◆ SDL_CutEvent()

static void SDL_CutEvent ( SDL_EventEntry entry)
static

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

472 {
473  if (entry->prev) {
474  entry->prev->next = entry->next;
475  }
476  if (entry->next) {
477  entry->next->prev = entry->prev;
478  }
479 
480  if (entry == SDL_EventQ.head) {
481  SDL_assert(entry->prev == NULL);
482  SDL_EventQ.head = entry->next;
483  }
484  if (entry == SDL_EventQ.tail) {
485  SDL_assert(entry->next == NULL);
486  SDL_EventQ.tail = entry->prev;
487  }
488 
489  entry->next = SDL_EventQ.free;
490  SDL_EventQ.free = entry;
491  SDL_assert(SDL_AtomicGet(&SDL_EventQ.count) > 0);
492  SDL_AtomicAdd(&SDL_EventQ.count, -1);
493 }
struct _SDL_EventEntry * next
Definition: SDL_events.c:66
#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:65
#define SDL_AtomicGet
static struct @21 SDL_EventQ

◆ SDL_DelEventWatch()

void SDL_DelEventWatch ( SDL_EventFilter  filter,
void userdata 
)

Remove an event watch function added with SDL_AddEventWatch()

Definition at line 764 of file SDL_events.c.

References SDL_EventWatcher::next, NULL, and SDL_free().

765 {
766  SDL_EventWatcher *prev = NULL;
767  SDL_EventWatcher *curr;
768 
769  for (curr = SDL_event_watchers; curr; prev = curr, curr = curr->next) {
770  if (curr->callback == filter && curr->userdata == userdata) {
771  if (prev) {
772  prev->next = curr->next;
773  } else {
774  SDL_event_watchers = curr->next;
775  }
776  SDL_free(curr);
777  break;
778  }
779  }
780 }
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:51
struct SDL_EventWatcher * next
Definition: SDL_events.c:48
void SDL_free(void *mem)
#define NULL
Definition: begin_code.h:164
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 798 of file SDL_events.c.

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

Referenced by SDL_StartEventLoop().

799 {
800  Uint8 current_state;
801  Uint8 hi = ((type >> 8) & 0xff);
802  Uint8 lo = (type & 0xff);
803 
804  if (SDL_disabled_events[hi] &&
805  (SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) {
806  current_state = SDL_DISABLE;
807  } else {
808  current_state = SDL_ENABLE;
809  }
810 
811  if (state != current_state)
812  {
813  switch (state) {
814  case SDL_DISABLE:
815  /* Disable this event type and discard pending events */
816  if (!SDL_disabled_events[hi]) {
818  if (!SDL_disabled_events[hi]) {
819  /* Out of memory, nothing we can do... */
820  break;
821  }
822  }
823  SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31));
825  break;
826  case SDL_ENABLE:
827  SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31));
828  break;
829  default:
830  /* Querying state... */
831  break;
832  }
833  }
834 
835  return current_state;
836 }
struct xkb_state * state
#define SDL_ENABLE
Definition: SDL_events.h:722
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
void * SDL_calloc(size_t nmemb, size_t size)
uint8_t Uint8
Definition: SDL_stdinc.h:157
void SDL_FlushEvent(Uint32 type)
Definition: SDL_events.c:587
#define SDL_DISABLE
Definition: SDL_events.h:721
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:57
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 783 of file SDL_events.c.

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

784 {
785  if (SDL_EventQ.lock && SDL_LockMutex(SDL_EventQ.lock) == 0) {
786  SDL_EventEntry *entry, *next;
787  for (entry = SDL_EventQ.head; entry; entry = next) {
788  next = entry->next;
789  if (!filter(userdata, &entry->event)) {
790  SDL_CutEvent(entry);
791  }
792  }
794  }
795 }
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:66
SDL_Event event
Definition: SDL_events.c:63
Definition: SDL_events.c:61
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:471
#define SDL_UnlockMutex
static struct @21 SDL_EventQ
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 587 of file SDL_events.c.

References SDL_FlushEvents().

Referenced by SDL_EventState().

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

◆ SDL_FlushEvents()

void SDL_FlushEvents ( Uint32  minType,
Uint32  maxType 
)

Definition at line 593 of file SDL_events.c.

References SDL_EventEntry::event, SDL_EventWatcher::next, 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().

594 {
595  /* Don't look after we've quit */
596  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
597  return;
598  }
599 
600  /* Make sure the events are current */
601 #if 0
602  /* Actually, we can't do this since we might be flushing while processing
603  a resize event, and calling this might trigger further resize events.
604  */
605  SDL_PumpEvents();
606 #endif
607 
608  /* Lock the event queue */
609  if (SDL_EventQ.lock && SDL_LockMutex(SDL_EventQ.lock) == 0) {
610  SDL_EventEntry *entry, *next;
611  Uint32 type;
612  for (entry = SDL_EventQ.head; entry; entry = next) {
613  next = entry->next;
614  type = entry->event.type;
615  if (minType <= type && type <= maxType) {
616  SDL_CutEvent(entry);
617  }
618  }
620  }
621 }
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:66
void SDL_PumpEvents(void)
Definition: SDL_events.c:625
SDL_Event event
Definition: SDL_events.c:63
uint32_t Uint32
Definition: SDL_stdinc.h:181
Definition: SDL_events.c:61
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:471
#define SDL_AtomicGet
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1571
#define SDL_UnlockMutex
static struct @21 SDL_EventQ
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 723 of file SDL_events.c.

References SDL_EventOK, SDL_EventOKParam, SDL_FALSE, and SDL_TRUE.

724 {
725  if (filter) {
726  *filter = SDL_EventOK;
727  }
728  if (userdata) {
729  *userdata = SDL_EventOKParam;
730  }
731  return SDL_EventOK ? SDL_TRUE : SDL_FALSE;
732 }
SDL_EventFilter SDL_EventOK
Definition: SDL_events.c:42
void * SDL_EventOKParam
Definition: SDL_events.c:43
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 575 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

576 {
577  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0);
578 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:497
#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 581 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

582 {
583  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0);
584 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:497
#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 497 of file SDL_events.c.

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

499 {
500  int i, used;
501 
502  /* Don't look after we've quit */
503  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
504  /* We get a few spurious events at shutdown, so don't warn then */
505  if (action != SDL_ADDEVENT) {
506  SDL_SetError("The event system has been shut down");
507  }
508  return (-1);
509  }
510  /* Lock the event queue */
511  used = 0;
512  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
513  if (action == SDL_ADDEVENT) {
514  for (i = 0; i < numevents; ++i) {
515  used += SDL_AddEvent(&events[i]);
516  }
517  } else {
518  SDL_EventEntry *entry, *next;
519  SDL_SysWMEntry *wmmsg, *wmmsg_next;
520  Uint32 type;
521 
522  if (action == SDL_GETEVENT) {
523  /* Clean out any used wmmsg data
524  FIXME: Do we want to retain the data for some period of time?
525  */
526  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; wmmsg = wmmsg_next) {
527  wmmsg_next = wmmsg->next;
528  wmmsg->next = SDL_EventQ.wmmsg_free;
529  SDL_EventQ.wmmsg_free = wmmsg;
530  }
531  SDL_EventQ.wmmsg_used = NULL;
532  }
533 
534  for (entry = SDL_EventQ.head; entry && (!events || used < numevents); entry = next) {
535  next = entry->next;
536  type = entry->event.type;
537  if (minType <= type && type <= maxType) {
538  if (events) {
539  events[used] = entry->event;
540  if (entry->event.type == SDL_SYSWMEVENT) {
541  /* We need to copy the wmmsg somewhere safe.
542  For now we'll guarantee it's valid at least until
543  the next call to SDL_PeepEvents()
544  */
545  if (SDL_EventQ.wmmsg_free) {
546  wmmsg = SDL_EventQ.wmmsg_free;
547  SDL_EventQ.wmmsg_free = wmmsg->next;
548  } else {
549  wmmsg = (SDL_SysWMEntry *)SDL_malloc(sizeof(*wmmsg));
550  }
551  wmmsg->msg = *entry->event.syswm.msg;
552  wmmsg->next = SDL_EventQ.wmmsg_used;
553  SDL_EventQ.wmmsg_used = wmmsg;
554  events[used].syswm.msg = &wmmsg->msg;
555  }
556 
557  if (action == SDL_GETEVENT) {
558  SDL_CutEvent(entry);
559  }
560  }
561  ++used;
562  }
563  }
564  }
565  if (SDL_EventQ.lock) {
567  }
568  } else {
569  return SDL_SetError("Couldn't lock event queue");
570  }
571  return (used);
572 }
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:66
SDL_SysWMmsg msg
Definition: SDL_events.c:71
static int SDL_AddEvent(SDL_Event *event)
Definition: SDL_events.c:417
SDL_SysWMmsg * msg
Definition: SDL_events.h:519
SDL_Event event
Definition: SDL_events.c:63
Definition: SDL_events.c:69
uint32_t Uint32
Definition: SDL_stdinc.h:181
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:72
Definition: SDL_events.c:61
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:471
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
static struct @21 SDL_EventQ
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 646 of file SDL_events.c.

References SDL_WaitEventTimeout().

647 {
648  return SDL_WaitEventTimeout(event, 0);
649 }
int SDL_WaitEventTimeout(SDL_Event *event, int timeout)
Waits until the specified timeout (in milliseconds) for the next available event. ...
Definition: SDL_events.c:658

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

626 {
628 
629  /* Get events from the video subsystem */
630  if (_this) {
631  _this->PumpEvents(_this);
632  }
633 #if !SDL_JOYSTICK_DISABLED
634  /* Check for joystick state change */
637  }
638 #endif
639 
640  SDL_SendPendingQuit(); /* in case we had a signal handler fire, etc. */
641 }
static SDL_VideoDevice * _this
Definition: SDL_video.c:121
#define SDL_JoystickUpdate
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:57
#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 689 of file SDL_events.c.

References SDL_EventWatcher::callback, SDL_EventWatcher::next, SDL_ADDEVENT, SDL_EventOK, SDL_EventOKParam, SDL_GestureProcessEvent(), SDL_GetTicks(), SDL_PeepEvents(), and SDL_EventWatcher::userdata.

Referenced by SDL_SendAppEvent(), and SDL_SendSysWMEvent().

690 {
691  SDL_EventWatcher *curr;
692 
693  event->common.timestamp = SDL_GetTicks();
694 
695  if (SDL_EventOK && !SDL_EventOK(SDL_EventOKParam, event)) {
696  return 0;
697  }
698 
699  for (curr = SDL_event_watchers; curr; curr = curr->next) {
700  curr->callback(curr->userdata, event);
701  }
702 
703  if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {
704  return -1;
705  }
706 
708 
709  return 1;
710 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:497
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:51
SDL_EventFilter callback
Definition: SDL_events.c:46
void SDL_GestureProcessEvent(SDL_Event *event)
Definition: SDL_gesture.c:538
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
struct SDL_EventWatcher * next
Definition: SDL_events.c:48
SDL_EventFilter SDL_EventOK
Definition: SDL_events.c:42
void * SDL_EventOKParam
Definition: SDL_events.c:43

◆ SDL_RegisterEvents()

Uint32 SDL_RegisterEvents ( int  numevents)

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

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

Definition at line 839 of file SDL_events.c.

References SDL_LASTEVENT, and SDL_userevents.

840 {
841  Uint32 event_base;
842 
843  if ((numevents > 0) && (SDL_userevents+numevents <= SDL_LASTEVENT)) {
844  event_base = SDL_userevents;
845  SDL_userevents += numevents;
846  } else {
847  event_base = (Uint32)-1;
848  }
849  return event_base;
850 }
uint32_t Uint32
Definition: SDL_stdinc.h:181
static Uint32 SDL_userevents
Definition: SDL_events.c:58

◆ SDL_SendAppEvent()

int SDL_SendAppEvent ( SDL_EventType  eventType)

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

854 {
855  int posted;
856 
857  posted = 0;
858  if (SDL_GetEventState(eventType) == SDL_ENABLE) {
860  event.type = eventType;
861  posted = (SDL_PushEvent(&event) > 0);
862  }
863  return (posted);
864 }
#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:689
General event structure.
Definition: SDL_events.h:525

◆ SDL_SendKeymapChangedEvent()

int SDL_SendKeymapChangedEvent ( void  )

Definition at line 884 of file SDL_events.c.

References SDL_KEYMAPCHANGED, and SDL_SendAppEvent().

885 {
887 }
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:853

◆ SDL_SendSysWMEvent()

int SDL_SendSysWMEvent ( SDL_SysWMmsg message)

Definition at line 867 of file SDL_events.c.

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

868 {
869  int posted;
870 
871  posted = 0;
874  SDL_memset(&event, 0, sizeof(event));
875  event.type = SDL_SYSWMEVENT;
876  event.syswm.msg = message;
877  posted = (SDL_PushEvent(&event) > 0);
878  }
879  /* Update internal event state */
880  return (posted);
881 }
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:689
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 713 of file SDL_events.c.

References NULL, SDL_EventOK, SDL_EventOKParam, SDL_FIRSTEVENT, SDL_FlushEvents(), SDL_LASTEVENT, and SDL_EventWatcher::userdata.

714 {
715  /* Set filter and discard pending events */
716  SDL_EventOK = NULL;
718  SDL_EventOKParam = userdata;
720 }
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:593
SDL_EventFilter SDL_EventOK
Definition: SDL_events.c:42
void * SDL_EventOKParam
Definition: SDL_events.c:43
#define NULL
Definition: begin_code.h:164
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter

◆ SDL_StartEventLoop()

int SDL_StartEventLoop ( void  )

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

387 {
388  /* We'll leave the event queue alone, since we might have gotten
389  some important events at launch (like SDL_DROPFILE)
390 
391  FIXME: Does this introduce any other bugs with events at startup?
392  */
393 
394  /* Create the lock and set ourselves active */
395 #if !SDL_THREADS_DISABLED
396  if (!SDL_EventQ.lock) {
397  SDL_EventQ.lock = SDL_CreateMutex();
398  }
399  if (SDL_EventQ.lock == NULL) {
400  return -1;
401  }
402 #endif /* !SDL_THREADS_DISABLED */
403 
404  /* Process most event types */
408 
409  SDL_AtomicSet(&SDL_EventQ.active, 1);
410 
411  return 0;
412 }
#define SDL_CreateMutex
Uint8 SDL_EventState(Uint32 type, int state)
Definition: SDL_events.c:798
#define SDL_DISABLE
Definition: SDL_events.h:721
#define NULL
Definition: begin_code.h:164
#define SDL_AtomicSet
static struct @21 SDL_EventQ

◆ SDL_StopEventLoop()

void SDL_StopEventLoop ( void  )

Definition at line 316 of file SDL_events.c.

References i, SDL_EventWatcher::next, SDL_EventEntry::next, SDL_SysWMEntry::next, NULL, SDL_arraysize, SDL_atoi, SDL_AtomicSet, SDL_DestroyMutex, SDL_event_watchers, SDL_EventOK, SDL_EventQ, SDL_free(), SDL_GetHint, SDL_LockMutex, SDL_Log, and SDL_UnlockMutex.

Referenced by SDL_QuitSubSystem().

317 {
318  const char *report = SDL_GetHint("SDL_EVENT_QUEUE_STATISTICS");
319  int i;
320  SDL_EventEntry *entry;
321  SDL_SysWMEntry *wmmsg;
322 
323  if (SDL_EventQ.lock) {
325  }
326 
327  SDL_AtomicSet(&SDL_EventQ.active, 0);
328 
329  if (report && SDL_atoi(report)) {
330  SDL_Log("SDL EVENT QUEUE: Maximum events in-flight: %d\n",
331  SDL_EventQ.max_events_seen);
332  }
333 
334  /* Clean out EventQ */
335  for (entry = SDL_EventQ.head; entry; ) {
336  SDL_EventEntry *next = entry->next;
337  SDL_free(entry);
338  entry = next;
339  }
340  for (entry = SDL_EventQ.free; entry; ) {
341  SDL_EventEntry *next = entry->next;
342  SDL_free(entry);
343  entry = next;
344  }
345  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; ) {
346  SDL_SysWMEntry *next = wmmsg->next;
347  SDL_free(wmmsg);
348  wmmsg = next;
349  }
350  for (wmmsg = SDL_EventQ.wmmsg_free; wmmsg; ) {
351  SDL_SysWMEntry *next = wmmsg->next;
352  SDL_free(wmmsg);
353  wmmsg = next;
354  }
355 
356  SDL_AtomicSet(&SDL_EventQ.count, 0);
357  SDL_EventQ.max_events_seen = 0;
358  SDL_EventQ.head = NULL;
359  SDL_EventQ.tail = NULL;
360  SDL_EventQ.free = NULL;
361  SDL_EventQ.wmmsg_used = NULL;
362  SDL_EventQ.wmmsg_free = NULL;
363 
364  /* Clear disabled event state */
365  for (i = 0; i < SDL_arraysize(SDL_disabled_events); ++i) {
368  }
369 
370  while (SDL_event_watchers) {
372  SDL_event_watchers = tmp->next;
373  SDL_free(tmp);
374  }
375  SDL_EventOK = NULL;
376 
377  if (SDL_EventQ.lock) {
380  SDL_EventQ.lock = NULL;
381  }
382 }
#define SDL_LockMutex
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:51
struct _SDL_EventEntry * next
Definition: SDL_events.c:66
#define SDL_GetHint
Definition: SDL_events.c:69
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:72
#define SDL_Log
struct SDL_EventWatcher * next
Definition: SDL_events.c:48
void SDL_free(void *mem)
SDL_EventFilter SDL_EventOK
Definition: SDL_events.c:42
Definition: SDL_events.c:61
#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:57
#define SDL_AtomicSet
#define SDL_UnlockMutex
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
static struct @21 SDL_EventQ

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

References SDL_WaitEventTimeout().

653 {
654  return SDL_WaitEventTimeout(event, -1);
655 }
int SDL_WaitEventTimeout(SDL_Event *event, int timeout)
Waits until the specified timeout (in milliseconds) for the next available event. ...
Definition: SDL_events.c:658

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

659 {
660  Uint32 expiration = 0;
661 
662  if (timeout > 0)
663  expiration = SDL_GetTicks() + timeout;
664 
665  for (;;) {
666  SDL_PumpEvents();
668  case -1:
669  return 0;
670  case 0:
671  if (timeout == 0) {
672  /* Polling and no events, just return */
673  return 0;
674  }
675  if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) {
676  /* Timeout expired and no events */
677  return 0;
678  }
679  SDL_Delay(10);
680  break;
681  default:
682  /* Has events */
683  return 1;
684  }
685  }
686 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:497
void SDL_PumpEvents(void)
Definition: SDL_events.c:625
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 78 of file SDL_events.c.

◆ count

Definition at line 79 of file SDL_events.c.

◆ free

◆ head

Definition at line 81 of file SDL_events.c.

Referenced by change_mparam(), and mmap_alloc().

◆ lock

SDL_mutex* lock

Definition at line 77 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 80 of file SDL_events.c.

◆ SDL_disabled_events

SDL_DisabledEventBlock* SDL_disabled_events[256]
static

Definition at line 57 of file SDL_events.c.

◆ SDL_event_watchers

SDL_EventWatcher* SDL_event_watchers = NULL
static

Definition at line 51 of file SDL_events.c.

Referenced by SDL_StopEventLoop().

◆ SDL_EventOK

◆ SDL_EventOKParam

◆ SDL_EventQ

◆ SDL_userevents

Uint32 SDL_userevents = SDL_USEREVENT
static

Definition at line 58 of file SDL_events.c.

Referenced by SDL_RegisterEvents().

◆ tail

Definition at line 82 of file SDL_events.c.

Referenced by SDL_AddEventWatch().

◆ wmmsg_free

SDL_SysWMEntry* wmmsg_free

Definition at line 85 of file SDL_events.c.

◆ wmmsg_used

SDL_SysWMEntry* wmmsg_used

Definition at line 84 of file SDL_events.c.