SDL  2.0
SDL_events.c File Reference
#include "../SDL_internal.h"
#include "SDL.h"
#include "SDL_events.h"
#include "SDL_syswm.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 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
 
   volatile SDL_bool   active
 
   volatile int   count
 
   volatile int   max_events_seen
 
   SDL_EventEntry *   head
 
   SDL_EventEntry *   tail
 
   SDL_EventEntry *   free
 
   SDL_SysWMEntry *   wmmsg_used
 
   SDL_SysWMEntry *   wmmsg_free
 
SDL_EventQ = { NULL, SDL_TRUE, 0, 0, NULL, NULL, NULL, NULL, NULL }
 

Macro Definition Documentation

#define SDL_MAX_QUEUED_EVENTS   65535

Definition at line 37 of file SDL_events.c.

Referenced by SDL_AddEvent().

Function Documentation

static int SDL_AddEvent ( SDL_Event event)
static

Definition at line 191 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_EventQ, SDL_malloc, SDL_MAX_QUEUED_EVENTS, SDL_SetError, SDL_SYSWMEVENT, SDL_Event::syswm, and SDL_Event::type.

Referenced by SDL_PeepEvents().

192 {
193  SDL_EventEntry *entry;
194 
195  if (SDL_EventQ.count >= SDL_MAX_QUEUED_EVENTS) {
196  SDL_SetError("Event queue is full (%d events)", SDL_EventQ.count);
197  return 0;
198  }
199 
200  if (SDL_EventQ.free == NULL) {
201  entry = (SDL_EventEntry *)SDL_malloc(sizeof(*entry));
202  if (!entry) {
203  return 0;
204  }
205  } else {
206  entry = SDL_EventQ.free;
207  SDL_EventQ.free = entry->next;
208  }
209 
210  entry->event = *event;
211  if (event->type == SDL_SYSWMEVENT) {
212  entry->msg = *event->syswm.msg;
213  entry->event.syswm.msg = &entry->msg;
214  }
215 
216  if (SDL_EventQ.tail) {
217  SDL_EventQ.tail->next = entry;
218  entry->prev = SDL_EventQ.tail;
219  SDL_EventQ.tail = entry;
220  entry->next = NULL;
221  } else {
222  SDL_assert(!SDL_EventQ.head);
223  SDL_EventQ.head = entry;
224  SDL_EventQ.tail = entry;
225  entry->prev = NULL;
226  entry->next = NULL;
227  }
228  ++SDL_EventQ.count;
229 
230  if (SDL_EventQ.count > SDL_EventQ.max_events_seen) {
231  SDL_EventQ.max_events_seen = SDL_EventQ.count;
232  }
233 
234  return 1;
235 }
struct _SDL_EventEntry * next
Definition: SDL_events.c:64
SDL_SysWMmsg * msg
Definition: SDL_events.h:515
#define SDL_MAX_QUEUED_EVENTS
Definition: SDL_events.c:37
SDL_Event event
Definition: SDL_events.c:61
union SDL_SysWMmsg::@16 msg
struct _cl_event * event
Definition: SDL_events.c:59
#define SDL_assert(condition)
Definition: SDL_assert.h:167
#define NULL
Definition: begin_code.h:143
#define SDL_SetError
SDL_SysWMEvent syswm
Definition: SDL_events.h:543
struct _SDL_EventEntry * prev
Definition: SDL_events.c:63
#define SDL_malloc
static struct @21 SDL_EventQ
Uint32 type
Definition: SDL_events.h:523
SDL_SysWMmsg msg
Definition: SDL_events.c:62
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 505 of file SDL_events.c.

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

506 {
507  SDL_EventWatcher *watcher, *tail;
508 
509  watcher = (SDL_EventWatcher *)SDL_malloc(sizeof(*watcher));
510  if (!watcher) {
511  /* Uh oh... */
512  return;
513  }
514 
515  /* create the watcher */
516  watcher->callback = filter;
517  watcher->userdata = userdata;
518  watcher->next = NULL;
519 
520  /* add the watcher to the end of the list */
521  if (SDL_event_watchers) {
522  for (tail = SDL_event_watchers; tail->next; tail = tail->next) {
523  continue;
524  }
525  tail->next = watcher;
526  } else {
527  SDL_event_watchers = watcher;
528  }
529 }
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_EventFilter callback
Definition: SDL_events.c:44
struct SDL_EventWatcher * next
Definition: SDL_events.c:46
#define NULL
Definition: begin_code.h:143
SDL_EventEntry * tail
Definition: SDL_events.c:80
#define SDL_malloc
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
static void SDL_CutEvent ( SDL_EventEntry entry)
static

Definition at line 239 of file SDL_events.c.

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

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

240 {
241  if (entry->prev) {
242  entry->prev->next = entry->next;
243  }
244  if (entry->next) {
245  entry->next->prev = entry->prev;
246  }
247 
248  if (entry == SDL_EventQ.head) {
249  SDL_assert(entry->prev == NULL);
250  SDL_EventQ.head = entry->next;
251  }
252  if (entry == SDL_EventQ.tail) {
253  SDL_assert(entry->next == NULL);
254  SDL_EventQ.tail = entry->prev;
255  }
256 
257  entry->next = SDL_EventQ.free;
258  SDL_EventQ.free = entry;
259  SDL_assert(SDL_EventQ.count > 0);
260  --SDL_EventQ.count;
261 }
struct _SDL_EventEntry * next
Definition: SDL_events.c:64
#define SDL_assert(condition)
Definition: SDL_assert.h:167
#define NULL
Definition: begin_code.h:143
struct _SDL_EventEntry * prev
Definition: SDL_events.c:63
static struct @21 SDL_EventQ
void SDL_DelEventWatch ( SDL_EventFilter  filter,
void userdata 
)

Remove an event watch function added with SDL_AddEventWatch()

Definition at line 533 of file SDL_events.c.

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

534 {
535  SDL_EventWatcher *prev = NULL;
536  SDL_EventWatcher *curr;
537 
538  for (curr = SDL_event_watchers; curr; prev = curr, curr = curr->next) {
539  if (curr->callback == filter && curr->userdata == userdata) {
540  if (prev) {
541  prev->next = curr->next;
542  } else {
543  SDL_event_watchers = curr->next;
544  }
545  SDL_free(curr);
546  break;
547  }
548  }
549 }
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
struct SDL_EventWatcher * next
Definition: SDL_events.c:46
void SDL_free(void *mem)
#define NULL
Definition: begin_code.h:143
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
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 event 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 567 of file SDL_events.c.

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

Referenced by SDL_StartEventLoop().

568 {
569  Uint8 current_state;
570  Uint8 hi = ((type >> 8) & 0xff);
571  Uint8 lo = (type & 0xff);
572 
573  if (SDL_disabled_events[hi] &&
574  (SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) {
575  current_state = SDL_DISABLE;
576  } else {
577  current_state = SDL_ENABLE;
578  }
579 
580  if (state != current_state)
581  {
582  switch (state) {
583  case SDL_DISABLE:
584  /* Disable this event type and discard pending events */
585  if (!SDL_disabled_events[hi]) {
587  if (!SDL_disabled_events[hi]) {
588  /* Out of memory, nothing we can do... */
589  break;
590  }
591  }
592  SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31));
594  break;
595  case SDL_ENABLE:
596  SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31));
597  break;
598  default:
599  /* Querying state... */
600  break;
601  }
602  }
603 
604  return current_state;
605 }
struct xkb_state * state
#define SDL_ENABLE
Definition: SDL_events.h:718
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1564
void * SDL_calloc(size_t nmemb, size_t size)
uint8_t Uint8
An unsigned 8-bit integer type.
Definition: SDL_stdinc.h:139
void SDL_FlushEvent(Uint32 type)
Definition: SDL_events.c:357
#define SDL_DISABLE
Definition: SDL_events.h:717
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:55
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 552 of file SDL_events.c.

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

553 {
554  if (SDL_EventQ.lock && SDL_LockMutex(SDL_EventQ.lock) == 0) {
555  SDL_EventEntry *entry, *next;
556  for (entry = SDL_EventQ.head; entry; entry = next) {
557  next = entry->next;
558  if (!filter(userdata, &entry->event)) {
559  SDL_CutEvent(entry);
560  }
561  }
563  }
564 }
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:64
SDL_Event event
Definition: SDL_events.c:61
Definition: SDL_events.c:59
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:239
#define SDL_UnlockMutex
static struct @21 SDL_EventQ
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
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 357 of file SDL_events.c.

References SDL_FlushEvents().

Referenced by SDL_EventState().

358 {
360 }
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1564
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:363
void SDL_FlushEvents ( Uint32  minType,
Uint32  maxType 
)

Definition at line 363 of file SDL_events.c.

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

Referenced by SDL_FlushEvent(), and SDL_SetEventFilter().

364 {
365  /* Don't look after we've quit */
366  if (!SDL_EventQ.active) {
367  return;
368  }
369 
370  /* Make sure the events are current */
371 #if 0
372  /* Actually, we can't do this since we might be flushing while processing
373  a resize event, and calling this might trigger further resize events.
374  */
375  SDL_PumpEvents();
376 #endif
377 
378  /* Lock the event queue */
379  if (SDL_LockMutex(SDL_EventQ.lock) == 0) {
380  SDL_EventEntry *entry, *next;
381  Uint32 type;
382  for (entry = SDL_EventQ.head; entry; entry = next) {
383  next = entry->next;
384  type = entry->event.type;
385  if (minType <= type && type <= maxType) {
386  SDL_CutEvent(entry);
387  }
388  }
390  }
391 }
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:64
void SDL_PumpEvents(void)
Definition: SDL_events.c:395
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:155
SDL_Event event
Definition: SDL_events.c:61
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1564
Definition: SDL_events.c:59
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:239
#define SDL_UnlockMutex
static struct @21 SDL_EventQ
Uint32 type
Definition: SDL_events.h:523
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 492 of file SDL_events.c.

References SDL_EventOK, SDL_EventOKParam, SDL_FALSE, and SDL_TRUE.

493 {
494  if (filter) {
495  *filter = SDL_EventOK;
496  }
497  if (userdata) {
498  *userdata = SDL_EventOKParam;
499  }
500  return SDL_EventOK ? SDL_TRUE : SDL_FALSE;
501 }
SDL_EventFilter SDL_EventOK
Definition: SDL_events.c:40
void * SDL_EventOKParam
Definition: SDL_events.c:41
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
SDL_bool SDL_HasEvent ( Uint32  type)

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

Definition at line 345 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

346 {
347  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0);
348 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:265
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1564
#define NULL
Definition: begin_code.h:143
SDL_bool SDL_HasEvents ( Uint32  minType,
Uint32  maxType 
)

Definition at line 351 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

352 {
353  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, minType, maxType) > 0);
354 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:265
#define NULL
Definition: begin_code.h:143
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 265 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_CutEvent(), SDL_EventQ, SDL_GETEVENT, SDL_LockMutex, SDL_malloc, SDL_PEEKEVENT, SDL_SetError, SDL_SYSWMEVENT, SDL_UnlockMutex, SDL_Event::syswm, and SDL_Event::type.

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

267 {
268  int i, used;
269 
270  /* Don't look after we've quit */
271  if (!SDL_EventQ.active) {
272  /* We get a few spurious events at shutdown, so don't warn then */
273  if (action != SDL_ADDEVENT) {
274  SDL_SetError("The event system has been shut down");
275  }
276  return (-1);
277  }
278  /* Lock the event queue */
279  used = 0;
280  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
281  if (action == SDL_ADDEVENT) {
282  for (i = 0; i < numevents; ++i) {
283  used += SDL_AddEvent(&events[i]);
284  }
285  } else {
286  SDL_EventEntry *entry, *next;
287  SDL_SysWMEntry *wmmsg, *wmmsg_next;
288  SDL_Event tmpevent;
289  Uint32 type;
290 
291  /* If 'events' is NULL, just see if they exist */
292  if (events == NULL) {
293  action = SDL_PEEKEVENT;
294  numevents = 1;
295  events = &tmpevent;
296  }
297 
298  /* Clean out any used wmmsg data
299  FIXME: Do we want to retain the data for some period of time?
300  */
301  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; wmmsg = wmmsg_next) {
302  wmmsg_next = wmmsg->next;
303  wmmsg->next = SDL_EventQ.wmmsg_free;
304  SDL_EventQ.wmmsg_free = wmmsg;
305  }
306  SDL_EventQ.wmmsg_used = NULL;
307 
308  for (entry = SDL_EventQ.head; entry && used < numevents; entry = next) {
309  next = entry->next;
310  type = entry->event.type;
311  if (minType <= type && type <= maxType) {
312  events[used] = entry->event;
313  if (entry->event.type == SDL_SYSWMEVENT) {
314  /* We need to copy the wmmsg somewhere safe.
315  For now we'll guarantee it's valid at least until
316  the next call to SDL_PeepEvents()
317  */
318  if (SDL_EventQ.wmmsg_free) {
319  wmmsg = SDL_EventQ.wmmsg_free;
320  SDL_EventQ.wmmsg_free = wmmsg->next;
321  } else {
322  wmmsg = (SDL_SysWMEntry *)SDL_malloc(sizeof(*wmmsg));
323  }
324  wmmsg->msg = *entry->event.syswm.msg;
325  wmmsg->next = SDL_EventQ.wmmsg_used;
326  SDL_EventQ.wmmsg_used = wmmsg;
327  events[used].syswm.msg = &wmmsg->msg;
328  }
329  ++used;
330 
331  if (action == SDL_GETEVENT) {
332  SDL_CutEvent(entry);
333  }
334  }
335  }
336  }
338  } else {
339  return SDL_SetError("Couldn't lock event queue");
340  }
341  return (used);
342 }
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:64
SDL_SysWMmsg msg
Definition: SDL_events.c:69
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:155
static int SDL_AddEvent(SDL_Event *event)
Definition: SDL_events.c:191
SDL_SysWMmsg * msg
Definition: SDL_events.h:515
SDL_Event event
Definition: SDL_events.c:61
Definition: SDL_events.c:67
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:70
GLuint GLuint GLsizei GLenum type
Definition: SDL_opengl.h:1564
Definition: SDL_events.c:59
static void SDL_CutEvent(SDL_EventEntry *entry)
Definition: SDL_events.c:239
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:42
#define NULL
Definition: begin_code.h:143
#define SDL_SetError
SDL_SysWMEvent syswm
Definition: SDL_events.h:543
#define SDL_UnlockMutex
General event structure.
Definition: SDL_events.h:521
#define SDL_malloc
static struct @21 SDL_EventQ
Uint32 type
Definition: SDL_events.h:523
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 416 of file SDL_events.c.

References SDL_WaitEventTimeout().

417 {
418  return SDL_WaitEventTimeout(event, 0);
419 }
int SDL_WaitEventTimeout(SDL_Event *event, int timeout)
Waits until the specified timeout (in milliseconds) for the next available event. ...
Definition: SDL_events.c:428
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 395 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().

396 {
398 
399  /* Get events from the video subsystem */
400  if (_this) {
401  _this->PumpEvents(_this);
402  }
403 #if !SDL_JOYSTICK_DISABLED
404  /* Check for joystick state change */
407  }
408 #endif
409 
410  SDL_SendPendingQuit(); /* in case we had a signal handler fire, etc. */
411 }
static SDL_VideoDevice * _this
Definition: SDL_video.c:114
#define SDL_JoystickUpdate
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:55
#define SDL_JoystickEventState
SDL_VideoDevice * SDL_GetVideoDevice(void)
Definition: SDL_video.c:573
void SDL_SendPendingQuit(void)
Definition: SDL_quit.c:146
#define SDL_QUERY
Definition: SDL_events.h:715
void(* PumpEvents)(_THIS)
Definition: SDL_sysvideo.h:249
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 458 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().

459 {
460  SDL_EventWatcher *curr;
461 
462  event->common.timestamp = SDL_GetTicks();
463 
464  if (SDL_EventOK && !SDL_EventOK(SDL_EventOKParam, event)) {
465  return 0;
466  }
467 
468  for (curr = SDL_event_watchers; curr; curr = curr->next) {
469  curr->callback(curr->userdata, event);
470  }
471 
472  if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {
473  return -1;
474  }
475 
477 
478  return 1;
479 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:265
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
SDL_EventFilter callback
Definition: SDL_events.c:44
void SDL_GestureProcessEvent(SDL_Event *event)
Definition: SDL_gesture.c:510
Uint32 SDL_GetTicks(void)
Get the number of milliseconds since the SDL library initialization.
struct SDL_EventWatcher * next
Definition: SDL_events.c:46
SDL_EventFilter SDL_EventOK
Definition: SDL_events.c:40
void * SDL_EventOKParam
Definition: SDL_events.c:41
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 608 of file SDL_events.c.

References SDL_LASTEVENT, and SDL_userevents.

609 {
610  Uint32 event_base;
611 
612  if ((numevents > 0) && (SDL_userevents+numevents <= SDL_LASTEVENT)) {
613  event_base = SDL_userevents;
614  SDL_userevents += numevents;
615  } else {
616  event_base = (Uint32)-1;
617  }
618  return event_base;
619 }
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:155
static Uint32 SDL_userevents
Definition: SDL_events.c:56
int SDL_SendAppEvent ( SDL_EventType  eventType)

Definition at line 622 of file SDL_events.c.

References SDL_ENABLE, SDL_GetEventState, and SDL_PushEvent().

Referenced by IsSDLWindowEventPending(), SDL_SendKeymapChangedEvent(), and SDL_SendQuit().

623 {
624  int posted;
625 
626  posted = 0;
627  if (SDL_GetEventState(eventType) == SDL_ENABLE) {
629  event.type = eventType;
630  posted = (SDL_PushEvent(&event) > 0);
631  }
632  return (posted);
633 }
#define SDL_ENABLE
Definition: SDL_events.h:718
#define SDL_GetEventState(type)
Definition: SDL_events.h:731
struct _cl_event * event
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:458
General event structure.
Definition: SDL_events.h:521
int SDL_SendKeymapChangedEvent ( void  )

Definition at line 653 of file SDL_events.c.

References SDL_KEYMAPCHANGED, and SDL_SendAppEvent().

654 {
656 }
int SDL_SendAppEvent(SDL_EventType eventType)
Definition: SDL_events.c:622
int SDL_SendSysWMEvent ( SDL_SysWMmsg message)

Definition at line 636 of file SDL_events.c.

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

637 {
638  int posted;
639 
640  posted = 0;
643  SDL_memset(&event, 0, sizeof(event));
644  event.type = SDL_SYSWMEVENT;
645  event.syswm.msg = message;
646  posted = (SDL_PushEvent(&event) > 0);
647  }
648  /* Update internal event state */
649  return (posted);
650 }
GLuint GLsizei const GLchar * message
#define SDL_ENABLE
Definition: SDL_events.h:718
#define SDL_GetEventState(type)
Definition: SDL_events.h:731
struct _cl_event * event
int SDL_PushEvent(SDL_Event *event)
Add an event to the event queue.
Definition: SDL_events.c:458
General event structure.
Definition: SDL_events.h:521
#define SDL_memset
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:

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

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

483 {
484  /* Set filter and discard pending events */
485  SDL_EventOK = NULL;
487  SDL_EventOKParam = userdata;
489 }
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:363
SDL_EventFilter SDL_EventOK
Definition: SDL_events.c:40
void * SDL_EventOKParam
Definition: SDL_events.c:41
#define NULL
Definition: begin_code.h:143
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
int SDL_StartEventLoop ( void  )

Definition at line 160 of file SDL_events.c.

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

Referenced by SDL_InitSubSystem().

161 {
162  /* We'll leave the event queue alone, since we might have gotten
163  some important events at launch (like SDL_DROPFILE)
164 
165  FIXME: Does this introduce any other bugs with events at startup?
166  */
167 
168  /* Create the lock and set ourselves active */
169 #if !SDL_THREADS_DISABLED
170  if (!SDL_EventQ.lock) {
171  SDL_EventQ.lock = SDL_CreateMutex();
172  }
173  if (SDL_EventQ.lock == NULL) {
174  return (-1);
175  }
176 #endif /* !SDL_THREADS_DISABLED */
177 
178  /* Process most event types */
182 
183  SDL_EventQ.active = SDL_TRUE;
184 
185  return (0);
186 }
#define SDL_CreateMutex
Uint8 SDL_EventState(Uint32 type, int state)
Definition: SDL_events.c:567
#define SDL_DISABLE
Definition: SDL_events.h:717
#define NULL
Definition: begin_code.h:143
static struct @21 SDL_EventQ
void SDL_StopEventLoop ( void  )

Definition at line 90 of file SDL_events.c.

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

Referenced by SDL_QuitSubSystem().

91 {
92  const char *report = SDL_GetHint("SDL_EVENT_QUEUE_STATISTICS");
93  int i;
94  SDL_EventEntry *entry;
95  SDL_SysWMEntry *wmmsg;
96 
97  if (SDL_EventQ.lock) {
99  }
100 
101  SDL_EventQ.active = SDL_FALSE;
102 
103  if (report && SDL_atoi(report)) {
104  SDL_Log("SDL EVENT QUEUE: Maximum events in-flight: %d\n",
105  SDL_EventQ.max_events_seen);
106  }
107 
108  /* Clean out EventQ */
109  for (entry = SDL_EventQ.head; entry; ) {
110  SDL_EventEntry *next = entry->next;
111  SDL_free(entry);
112  entry = next;
113  }
114  for (entry = SDL_EventQ.free; entry; ) {
115  SDL_EventEntry *next = entry->next;
116  SDL_free(entry);
117  entry = next;
118  }
119  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; ) {
120  SDL_SysWMEntry *next = wmmsg->next;
121  SDL_free(wmmsg);
122  wmmsg = next;
123  }
124  for (wmmsg = SDL_EventQ.wmmsg_free; wmmsg; ) {
125  SDL_SysWMEntry *next = wmmsg->next;
126  SDL_free(wmmsg);
127  wmmsg = next;
128  }
129 
130  SDL_EventQ.count = 0;
131  SDL_EventQ.max_events_seen = 0;
132  SDL_EventQ.head = NULL;
133  SDL_EventQ.tail = NULL;
134  SDL_EventQ.free = NULL;
135  SDL_EventQ.wmmsg_used = NULL;
136  SDL_EventQ.wmmsg_free = NULL;
137 
138  /* Clear disabled event state */
139  for (i = 0; i < SDL_arraysize(SDL_disabled_events); ++i) {
142  }
143 
144  while (SDL_event_watchers) {
146  SDL_event_watchers = tmp->next;
147  SDL_free(tmp);
148  }
149  SDL_EventOK = NULL;
150 
151  if (SDL_EventQ.lock) {
154  SDL_EventQ.lock = NULL;
155  }
156 }
#define SDL_LockMutex
static SDL_EventWatcher * SDL_event_watchers
Definition: SDL_events.c:49
struct _SDL_EventEntry * next
Definition: SDL_events.c:64
#define SDL_GetHint
Definition: SDL_events.c:67
struct _SDL_SysWMEntry * next
Definition: SDL_events.c:70
#define SDL_Log
struct SDL_EventWatcher * next
Definition: SDL_events.c:46
void SDL_free(void *mem)
SDL_EventFilter SDL_EventOK
Definition: SDL_events.c:40
Definition: SDL_events.c:59
#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:42
#define NULL
Definition: begin_code.h:143
#define SDL_DestroyMutex
static SDL_DisabledEventBlock * SDL_disabled_events[256]
Definition: SDL_events.c:55
#define SDL_UnlockMutex
#define SDL_arraysize(array)
Definition: SDL_stdinc.h:93
static struct @21 SDL_EventQ
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 422 of file SDL_events.c.

References SDL_WaitEventTimeout().

423 {
424  return SDL_WaitEventTimeout(event, -1);
425 }
int SDL_WaitEventTimeout(SDL_Event *event, int timeout)
Waits until the specified timeout (in milliseconds) for the next available event. ...
Definition: SDL_events.c:428
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 428 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().

429 {
430  Uint32 expiration = 0;
431 
432  if (timeout > 0)
433  expiration = SDL_GetTicks() + timeout;
434 
435  for (;;) {
436  SDL_PumpEvents();
438  case -1:
439  return 0;
440  case 1:
441  return 1;
442  case 0:
443  if (timeout == 0) {
444  /* Polling and no events, just return */
445  return 0;
446  }
447  if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) {
448  /* Timeout expired and no events */
449  return 0;
450  }
451  SDL_Delay(10);
452  break;
453  }
454  }
455 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:265
void SDL_PumpEvents(void)
Definition: SDL_events.c:395
uint32_t Uint32
An unsigned 32-bit integer type.
Definition: SDL_stdinc.h:155
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

volatile SDL_bool active

Definition at line 76 of file SDL_events.c.

volatile int count

Definition at line 77 of file SDL_events.c.

Definition at line 81 of file SDL_events.c.

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

Definition at line 79 of file SDL_events.c.

Referenced by change_mparam(), and mmap_alloc().

SDL_mutex* lock

Definition at line 75 of file SDL_events.c.

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

volatile int max_events_seen

Definition at line 78 of file SDL_events.c.

SDL_DisabledEventBlock* SDL_disabled_events[256]
static

Definition at line 55 of file SDL_events.c.

SDL_EventWatcher* SDL_event_watchers = NULL
static

Definition at line 49 of file SDL_events.c.

Referenced by SDL_StopEventLoop().

Uint32 SDL_userevents = SDL_USEREVENT
static

Definition at line 56 of file SDL_events.c.

Referenced by SDL_RegisterEvents().

Definition at line 80 of file SDL_events.c.

Referenced by SDL_AddEventWatch().

SDL_SysWMEntry* wmmsg_free

Definition at line 83 of file SDL_events.c.

SDL_SysWMEntry* wmmsg_used

Definition at line 82 of file SDL_events.c.