SDL  2.0
SDL_events.h File Reference
#include "SDL_stdinc.h"
#include "SDL_error.h"
#include "SDL_video.h"
#include "SDL_keyboard.h"
#include "SDL_mouse.h"
#include "SDL_joystick.h"
#include "SDL_gamecontroller.h"
#include "SDL_quit.h"
#include "SDL_gesture.h"
#include "SDL_touch.h"
#include "begin_code.h"
#include "close_code.h"
+ Include dependency graph for SDL_events.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  SDL_CommonEvent
 Fields shared by every event. More...
 
struct  SDL_WindowEvent
 Window state change event data (event.window.*) More...
 
struct  SDL_KeyboardEvent
 Keyboard button event structure (event.key.*) More...
 
struct  SDL_TextEditingEvent
 Keyboard text editing event structure (event.edit.*) More...
 
struct  SDL_TextInputEvent
 Keyboard text input event structure (event.text.*) More...
 
struct  SDL_MouseMotionEvent
 Mouse motion event structure (event.motion.*) More...
 
struct  SDL_MouseButtonEvent
 Mouse button event structure (event.button.*) More...
 
struct  SDL_MouseWheelEvent
 Mouse wheel event structure (event.wheel.*) More...
 
struct  SDL_JoyAxisEvent
 Joystick axis motion event structure (event.jaxis.*) More...
 
struct  SDL_JoyBallEvent
 Joystick trackball motion event structure (event.jball.*) More...
 
struct  SDL_JoyHatEvent
 Joystick hat position change event structure (event.jhat.*) More...
 
struct  SDL_JoyButtonEvent
 Joystick button event structure (event.jbutton.*) More...
 
struct  SDL_JoyDeviceEvent
 Joystick device event structure (event.jdevice.*) More...
 
struct  SDL_ControllerAxisEvent
 Game controller axis motion event structure (event.caxis.*) More...
 
struct  SDL_ControllerButtonEvent
 Game controller button event structure (event.cbutton.*) More...
 
struct  SDL_ControllerDeviceEvent
 Controller device event structure (event.cdevice.*) More...
 
struct  SDL_AudioDeviceEvent
 Audio device event structure (event.adevice.*) More...
 
struct  SDL_TouchFingerEvent
 Touch finger event structure (event.tfinger.*) More...
 
struct  SDL_MultiGestureEvent
 Multiple Finger Gesture Event (event.mgesture.*) More...
 
struct  SDL_DollarGestureEvent
 Dollar Gesture Event (event.dgesture.*) More...
 
struct  SDL_DropEvent
 An event used to request a file open by the system (event.drop.*) This event is enabled by default, you can disable it with SDL_EventState(). More...
 
struct  SDL_QuitEvent
 The "quit requested" event. More...
 
struct  SDL_OSEvent
 OS Specific event. More...
 
struct  SDL_UserEvent
 A user-defined event type (event.user.*) More...
 
struct  SDL_SysWMEvent
 A video driver dependent system event (event.syswm.*) This event is disabled by default, you can enable it with SDL_EventState() More...
 
union  SDL_Event
 General event structure. More...
 

Macros

#define SDL_RELEASED   0
 
#define SDL_PRESSED   1
 
#define SDL_TEXTEDITINGEVENT_TEXT_SIZE   (32)
 
#define SDL_TEXTINPUTEVENT_TEXT_SIZE   (32)
 
#define SDL_GetEventState(type)   SDL_EventState(type, SDL_QUERY)
 

Typedefs

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

Enumerations

enum  SDL_EventType {
  SDL_FIRSTEVENT = 0,
  SDL_QUIT = 0x100,
  SDL_APP_TERMINATING,
  SDL_APP_LOWMEMORY,
  SDL_APP_WILLENTERBACKGROUND,
  SDL_APP_DIDENTERBACKGROUND,
  SDL_APP_WILLENTERFOREGROUND,
  SDL_APP_DIDENTERFOREGROUND,
  SDL_WINDOWEVENT = 0x200,
  SDL_SYSWMEVENT,
  SDL_KEYDOWN = 0x300,
  SDL_KEYUP,
  SDL_TEXTEDITING,
  SDL_TEXTINPUT,
  SDL_KEYMAPCHANGED,
  SDL_MOUSEMOTION = 0x400,
  SDL_MOUSEBUTTONDOWN,
  SDL_MOUSEBUTTONUP,
  SDL_MOUSEWHEEL,
  SDL_JOYAXISMOTION = 0x600,
  SDL_JOYBALLMOTION,
  SDL_JOYHATMOTION,
  SDL_JOYBUTTONDOWN,
  SDL_JOYBUTTONUP,
  SDL_JOYDEVICEADDED,
  SDL_JOYDEVICEREMOVED,
  SDL_CONTROLLERAXISMOTION = 0x650,
  SDL_CONTROLLERBUTTONDOWN,
  SDL_CONTROLLERBUTTONUP,
  SDL_CONTROLLERDEVICEADDED,
  SDL_CONTROLLERDEVICEREMOVED,
  SDL_CONTROLLERDEVICEREMAPPED,
  SDL_FINGERDOWN = 0x700,
  SDL_FINGERUP,
  SDL_FINGERMOTION,
  SDL_DOLLARGESTURE = 0x800,
  SDL_DOLLARRECORD,
  SDL_MULTIGESTURE,
  SDL_CLIPBOARDUPDATE = 0x900,
  SDL_DROPFILE = 0x1000,
  SDL_DROPTEXT,
  SDL_DROPBEGIN,
  SDL_DROPCOMPLETE,
  SDL_AUDIODEVICEADDED = 0x1100,
  SDL_AUDIODEVICEREMOVED,
  SDL_RENDER_TARGETS_RESET = 0x2000,
  SDL_RENDER_DEVICE_RESET,
  SDL_USEREVENT = 0x8000,
  SDL_LASTEVENT = 0xFFFF
}
 The types of events that can be delivered. More...
 

Functions

void SDL_PumpEvents (void)
 
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)
 
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)
 
Uint32 SDL_RegisterEvents (int numevents)
 
enum  SDL_eventaction {
  SDL_ADDEVENT,
  SDL_PEEKEVENT,
  SDL_GETEVENT
}
 
int SDL_PeepEvents (SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
 
#define SDL_QUERY   -1
 
#define SDL_IGNORE   0
 
#define SDL_DISABLE   0
 
#define SDL_ENABLE   1
 
Uint8 SDL_EventState (Uint32 type, int state)
 

Detailed Description

Include file for SDL event handling.

Definition in file SDL_events.h.

Macro Definition Documentation

◆ SDL_DISABLE

#define SDL_DISABLE   0

◆ SDL_ENABLE

◆ SDL_GetEventState

◆ SDL_IGNORE

#define SDL_IGNORE   0

Definition at line 720 of file SDL_events.h.

Referenced by main(), and SDL_GameControllerEventState().

◆ SDL_PRESSED

◆ SDL_QUERY

◆ SDL_RELEASED

◆ SDL_TEXTEDITINGEVENT_TEXT_SIZE

#define SDL_TEXTEDITINGEVENT_TEXT_SIZE   (32)

Definition at line 202 of file SDL_events.h.

Referenced by main().

◆ SDL_TEXTINPUTEVENT_TEXT_SIZE

#define SDL_TEXTINPUTEVENT_TEXT_SIZE   (32)

Definition at line 217 of file SDL_events.h.

Referenced by SDL_BApp::_HandleKey().

Typedef Documentation

◆ SDL_EventFilter

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

Definition at line 662 of file SDL_events.h.

Enumeration Type Documentation

◆ SDL_eventaction

Enumerator
SDL_ADDEVENT 
SDL_PEEKEVENT 
SDL_GETEVENT 

Definition at line 576 of file SDL_events.h.

◆ SDL_EventType

The types of events that can be delivered.

Enumerator
SDL_FIRSTEVENT 

Unused (do not remove)

SDL_QUIT 

User-requested quit

SDL_APP_TERMINATING 

The application is being terminated by the OS Called on iOS in applicationWillTerminate() Called on Android in onDestroy()

SDL_APP_LOWMEMORY 

The application is low on memory, free memory if possible. Called on iOS in applicationDidReceiveMemoryWarning() Called on Android in onLowMemory()

SDL_APP_WILLENTERBACKGROUND 

The application is about to enter the background Called on iOS in applicationWillResignActive() Called on Android in onPause()

SDL_APP_DIDENTERBACKGROUND 

The application did enter the background and may not get CPU for some time Called on iOS in applicationDidEnterBackground() Called on Android in onPause()

SDL_APP_WILLENTERFOREGROUND 

The application is about to enter the foreground Called on iOS in applicationWillEnterForeground() Called on Android in onResume()

SDL_APP_DIDENTERFOREGROUND 

The application is now interactive Called on iOS in applicationDidBecomeActive() Called on Android in onResume()

SDL_WINDOWEVENT 

Window state change

SDL_SYSWMEVENT 

System specific event

SDL_KEYDOWN 

Key pressed

SDL_KEYUP 

Key released

SDL_TEXTEDITING 

Keyboard text editing (composition)

SDL_TEXTINPUT 

Keyboard text input

SDL_KEYMAPCHANGED 

Keymap changed due to a system event such as an input language or keyboard layout change.

SDL_MOUSEMOTION 

Mouse moved

SDL_MOUSEBUTTONDOWN 

Mouse button pressed

SDL_MOUSEBUTTONUP 

Mouse button released

SDL_MOUSEWHEEL 

Mouse wheel motion

SDL_JOYAXISMOTION 

Joystick axis motion

SDL_JOYBALLMOTION 

Joystick trackball motion

SDL_JOYHATMOTION 

Joystick hat position change

SDL_JOYBUTTONDOWN 

Joystick button pressed

SDL_JOYBUTTONUP 

Joystick button released

SDL_JOYDEVICEADDED 

A new joystick has been inserted into the system

SDL_JOYDEVICEREMOVED 

An opened joystick has been removed

SDL_CONTROLLERAXISMOTION 

Game controller axis motion

SDL_CONTROLLERBUTTONDOWN 

Game controller button pressed

SDL_CONTROLLERBUTTONUP 

Game controller button released

SDL_CONTROLLERDEVICEADDED 

A new Game controller has been inserted into the system

SDL_CONTROLLERDEVICEREMOVED 

An opened Game controller has been removed

SDL_CONTROLLERDEVICEREMAPPED 

The controller mapping was updated

SDL_FINGERDOWN 
SDL_FINGERUP 
SDL_FINGERMOTION 
SDL_DOLLARGESTURE 
SDL_DOLLARRECORD 
SDL_MULTIGESTURE 
SDL_CLIPBOARDUPDATE 

The clipboard changed

SDL_DROPFILE 

The system requests a file open

SDL_DROPTEXT 

text/plain drag-and-drop event

SDL_DROPBEGIN 

A new set of drops is beginning (NULL filename)

SDL_DROPCOMPLETE 

Current set of drops is now complete (NULL filename)

SDL_AUDIODEVICEADDED 

A new audio device is available

SDL_AUDIODEVICEREMOVED 

An audio device has been removed.

SDL_RENDER_TARGETS_RESET 

The render targets have been reset and their contents need to be updated

SDL_RENDER_DEVICE_RESET 

The device has been reset and all textures need to be recreated

SDL_USEREVENT 

Events SDL_USEREVENT through SDL_LASTEVENT are for your use, and should be allocated with SDL_RegisterEvents()

SDL_LASTEVENT 

This last event is only for bounding internal arrays

Definition at line 55 of file SDL_events.h.

56 {
57  SDL_FIRSTEVENT = 0, /**< Unused (do not remove) */
58 
59  /* Application events */
60  SDL_QUIT = 0x100, /**< User-requested quit */
61 
62  /* These application events have special meaning on iOS, see README-ios.md for details */
63  SDL_APP_TERMINATING, /**< The application is being terminated by the OS
64  Called on iOS in applicationWillTerminate()
65  Called on Android in onDestroy()
66  */
67  SDL_APP_LOWMEMORY, /**< The application is low on memory, free memory if possible.
68  Called on iOS in applicationDidReceiveMemoryWarning()
69  Called on Android in onLowMemory()
70  */
71  SDL_APP_WILLENTERBACKGROUND, /**< The application is about to enter the background
72  Called on iOS in applicationWillResignActive()
73  Called on Android in onPause()
74  */
75  SDL_APP_DIDENTERBACKGROUND, /**< The application did enter the background and may not get CPU for some time
76  Called on iOS in applicationDidEnterBackground()
77  Called on Android in onPause()
78  */
79  SDL_APP_WILLENTERFOREGROUND, /**< The application is about to enter the foreground
80  Called on iOS in applicationWillEnterForeground()
81  Called on Android in onResume()
82  */
83  SDL_APP_DIDENTERFOREGROUND, /**< The application is now interactive
84  Called on iOS in applicationDidBecomeActive()
85  Called on Android in onResume()
86  */
87 
88  /* Window events */
89  SDL_WINDOWEVENT = 0x200, /**< Window state change */
90  SDL_SYSWMEVENT, /**< System specific event */
91 
92  /* Keyboard events */
93  SDL_KEYDOWN = 0x300, /**< Key pressed */
94  SDL_KEYUP, /**< Key released */
95  SDL_TEXTEDITING, /**< Keyboard text editing (composition) */
96  SDL_TEXTINPUT, /**< Keyboard text input */
97  SDL_KEYMAPCHANGED, /**< Keymap changed due to a system event such as an
98  input language or keyboard layout change.
99  */
100 
101  /* Mouse events */
102  SDL_MOUSEMOTION = 0x400, /**< Mouse moved */
103  SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */
104  SDL_MOUSEBUTTONUP, /**< Mouse button released */
105  SDL_MOUSEWHEEL, /**< Mouse wheel motion */
106 
107  /* Joystick events */
108  SDL_JOYAXISMOTION = 0x600, /**< Joystick axis motion */
109  SDL_JOYBALLMOTION, /**< Joystick trackball motion */
110  SDL_JOYHATMOTION, /**< Joystick hat position change */
111  SDL_JOYBUTTONDOWN, /**< Joystick button pressed */
112  SDL_JOYBUTTONUP, /**< Joystick button released */
113  SDL_JOYDEVICEADDED, /**< A new joystick has been inserted into the system */
114  SDL_JOYDEVICEREMOVED, /**< An opened joystick has been removed */
115 
116  /* Game controller events */
117  SDL_CONTROLLERAXISMOTION = 0x650, /**< Game controller axis motion */
118  SDL_CONTROLLERBUTTONDOWN, /**< Game controller button pressed */
119  SDL_CONTROLLERBUTTONUP, /**< Game controller button released */
120  SDL_CONTROLLERDEVICEADDED, /**< A new Game controller has been inserted into the system */
121  SDL_CONTROLLERDEVICEREMOVED, /**< An opened Game controller has been removed */
122  SDL_CONTROLLERDEVICEREMAPPED, /**< The controller mapping was updated */
123 
124  /* Touch events */
125  SDL_FINGERDOWN = 0x700,
126  SDL_FINGERUP,
128 
129  /* Gesture events */
130  SDL_DOLLARGESTURE = 0x800,
133 
134  /* Clipboard events */
135  SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard changed */
136 
137  /* Drag and drop events */
138  SDL_DROPFILE = 0x1000, /**< The system requests a file open */
139  SDL_DROPTEXT, /**< text/plain drag-and-drop event */
140  SDL_DROPBEGIN, /**< A new set of drops is beginning (NULL filename) */
141  SDL_DROPCOMPLETE, /**< Current set of drops is now complete (NULL filename) */
142 
143  /* Audio hotplug events */
144  SDL_AUDIODEVICEADDED = 0x1100, /**< A new audio device is available */
145  SDL_AUDIODEVICEREMOVED, /**< An audio device has been removed. */
146 
147  /* Render events */
148  SDL_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset and their contents need to be updated */
149  SDL_RENDER_DEVICE_RESET, /**< The device has been reset and all textures need to be recreated */
150 
151  /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use,
152  * and should be allocated with SDL_RegisterEvents()
153  */
154  SDL_USEREVENT = 0x8000,
155 
156  /**
157  * This last event is only for bounding internal arrays
158  */
159  SDL_LASTEVENT = 0xFFFF
160 } SDL_EventType;
SDL_EventType
The types of events that can be delivered.
Definition: SDL_events.h:55

Function Documentation

◆ SDL_AddEventWatch()

void SDL_AddEventWatch ( SDL_EventFilter  filter,
void userdata 
)

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

Definition at line 796 of file SDL_events.c.

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

797 {
799  SDL_EventWatcher *event_watchers;
800 
801  event_watchers = SDL_realloc(SDL_event_watchers, (SDL_event_watchers_count + 1) * sizeof(*event_watchers));
802  if (event_watchers) {
803  SDL_EventWatcher *watcher;
804 
805  SDL_event_watchers = event_watchers;
807  watcher->callback = filter;
808  watcher->userdata = userdata;
809  watcher->removed = SDL_FALSE;
811  }
812 
815  }
816  }
817 }
#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_DelEventWatch()

void SDL_DelEventWatch ( SDL_EventFilter  filter,
void userdata 
)

Remove an event watch function added with SDL_AddEventWatch()

Definition at line 820 of file SDL_events.c.

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

821 {
823  int i;
824 
825  for (i = 0; i < SDL_event_watchers_count; ++i) {
826  if (SDL_event_watchers[i].callback == filter && SDL_event_watchers[i].userdata == userdata) {
830  } else {
832  if (i < SDL_event_watchers_count) {
833  SDL_memmove(&SDL_event_watchers[i], &SDL_event_watchers[i+1], (SDL_event_watchers_count - i) * sizeof(SDL_event_watchers[i]));
834  }
835  }
836  break;
837  }
838  }
839 
842  }
843  }
844 }
#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 864 of file SDL_events.c.

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

Referenced by SDL_StartEventLoop().

865 {
866  Uint8 current_state;
867  Uint8 hi = ((type >> 8) & 0xff);
868  Uint8 lo = (type & 0xff);
869 
870  if (SDL_disabled_events[hi] &&
871  (SDL_disabled_events[hi]->bits[lo/32] & (1 << (lo&31)))) {
872  current_state = SDL_DISABLE;
873  } else {
874  current_state = SDL_ENABLE;
875  }
876 
877  if (state != current_state)
878  {
879  switch (state) {
880  case SDL_DISABLE:
881  /* Disable this event type and discard pending events */
882  if (!SDL_disabled_events[hi]) {
884  if (!SDL_disabled_events[hi]) {
885  /* Out of memory, nothing we can do... */
886  break;
887  }
888  }
889  SDL_disabled_events[hi]->bits[lo/32] |= (1 << (lo&31));
891  break;
892  case SDL_ENABLE:
893  SDL_disabled_events[hi]->bits[lo/32] &= ~(1 << (lo&31));
894  break;
895  default:
896  /* Querying state... */
897  break;
898  }
899  }
900 
901  return current_state;
902 }
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:599
#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 847 of file SDL_events.c.

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

848 {
849  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
850  SDL_EventEntry *entry, *next;
851  for (entry = SDL_EventQ.head; entry; entry = next) {
852  next = entry->next;
853  if (!filter(userdata, &entry->event)) {
854  SDL_CutEvent(entry);
855  }
856  }
857  if (SDL_EventQ.lock) {
859  }
860  }
861 }
const struct SDL_AssertData * next
Definition: SDL_assert.h:119
#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:483
#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 599 of file SDL_events.c.

References SDL_FlushEvents().

Referenced by SDL_EventState().

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

◆ SDL_FlushEvents()

void SDL_FlushEvents ( Uint32  minType,
Uint32  maxType 
)

Definition at line 605 of file SDL_events.c.

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

Referenced by SDL_FlushEvent(), and SDL_SetEventFilter().

606 {
607  /* Don't look after we've quit */
608  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
609  return;
610  }
611 
612  /* Make sure the events are current */
613 #if 0
614  /* Actually, we can't do this since we might be flushing while processing
615  a resize event, and calling this might trigger further resize events.
616  */
617  SDL_PumpEvents();
618 #endif
619 
620  /* Lock the event queue */
621  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
622  SDL_EventEntry *entry, *next;
623  Uint32 type;
624  for (entry = SDL_EventQ.head; entry; entry = next) {
625  next = entry->next;
626  type = entry->event.type;
627  if (minType <= type && type <= maxType) {
628  SDL_CutEvent(entry);
629  }
630  }
631  if (SDL_EventQ.lock) {
633  }
634  }
635 }
const struct SDL_AssertData * next
Definition: SDL_assert.h:119
#define SDL_LockMutex
struct _SDL_EventEntry * next
Definition: SDL_events.c:67
void SDL_PumpEvents(void)
Definition: SDL_events.c:639
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:483
#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 772 of file SDL_events.c.

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

773 {
774  SDL_EventWatcher event_ok;
775 
777  event_ok = SDL_EventOK;
778 
781  }
782  } else {
783  SDL_zero(event_ok);
784  }
785 
786  if (filter) {
787  *filter = event_ok.callback;
788  }
789  if (userdata) {
790  *userdata = event_ok.userdata;
791  }
792  return event_ok.callback ? SDL_TRUE : SDL_FALSE;
793 }
#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 587 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

588 {
589  return (SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, type, type) > 0);
590 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:509
#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 593 of file SDL_events.c.

References NULL, SDL_PEEKEVENT, and SDL_PeepEvents().

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

◆ SDL_PeepEvents()

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

Checks the event queue for messages and optionally returns them.

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

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

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

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

This function is thread-safe.

Definition at line 509 of file SDL_events.c.

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

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

511 {
512  int i, used;
513 
514  /* Don't look after we've quit */
515  if (!SDL_AtomicGet(&SDL_EventQ.active)) {
516  /* We get a few spurious events at shutdown, so don't warn then */
517  if (action != SDL_ADDEVENT) {
518  SDL_SetError("The event system has been shut down");
519  }
520  return (-1);
521  }
522  /* Lock the event queue */
523  used = 0;
524  if (!SDL_EventQ.lock || SDL_LockMutex(SDL_EventQ.lock) == 0) {
525  if (action == SDL_ADDEVENT) {
526  for (i = 0; i < numevents; ++i) {
527  used += SDL_AddEvent(&events[i]);
528  }
529  } else {
530  SDL_EventEntry *entry, *next;
531  SDL_SysWMEntry *wmmsg, *wmmsg_next;
532  Uint32 type;
533 
534  if (action == SDL_GETEVENT) {
535  /* Clean out any used wmmsg data
536  FIXME: Do we want to retain the data for some period of time?
537  */
538  for (wmmsg = SDL_EventQ.wmmsg_used; wmmsg; wmmsg = wmmsg_next) {
539  wmmsg_next = wmmsg->next;
540  wmmsg->next = SDL_EventQ.wmmsg_free;
541  SDL_EventQ.wmmsg_free = wmmsg;
542  }
543  SDL_EventQ.wmmsg_used = NULL;
544  }
545 
546  for (entry = SDL_EventQ.head; entry && (!events || used < numevents); entry = next) {
547  next = entry->next;
548  type = entry->event.type;
549  if (minType <= type && type <= maxType) {
550  if (events) {
551  events[used] = entry->event;
552  if (entry->event.type == SDL_SYSWMEVENT) {
553  /* We need to copy the wmmsg somewhere safe.
554  For now we'll guarantee it's valid at least until
555  the next call to SDL_PeepEvents()
556  */
557  if (SDL_EventQ.wmmsg_free) {
558  wmmsg = SDL_EventQ.wmmsg_free;
559  SDL_EventQ.wmmsg_free = wmmsg->next;
560  } else {
561  wmmsg = (SDL_SysWMEntry *)SDL_malloc(sizeof(*wmmsg));
562  }
563  wmmsg->msg = *entry->event.syswm.msg;
564  wmmsg->next = SDL_EventQ.wmmsg_used;
565  SDL_EventQ.wmmsg_used = wmmsg;
566  events[used].syswm.msg = &wmmsg->msg;
567  }
568 
569  if (action == SDL_GETEVENT) {
570  SDL_CutEvent(entry);
571  }
572  }
573  ++used;
574  }
575  }
576  }
577  if (SDL_EventQ.lock) {
579  }
580  } else {
581  return SDL_SetError("Couldn't lock event queue");
582  }
583  return (used);
584 }
const struct SDL_AssertData * next
Definition: SDL_assert.h:119
#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:429
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:483
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 660 of file SDL_events.c.

References SDL_WaitEventTimeout().

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

◆ SDL_PumpEvents()

void SDL_PumpEvents ( void  )

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

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

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

Definition at line 639 of file SDL_events.c.

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

Referenced by SDL_FlushEvents(), and SDL_WaitEventTimeout().

640 {
642 
643  /* Get events from the video subsystem */
644  if (_this) {
645  _this->PumpEvents(_this);
646  }
647 #if !SDL_JOYSTICK_DISABLED
648  /* Check for joystick state change */
651  }
652 #endif
653 
654  SDL_SendPendingQuit(); /* in case we had a signal handler fire, etc. */
655 }
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 703 of file SDL_events.c.

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

Referenced by SDL_SendAppEvent(), and SDL_SendSysWMEvent().

704 {
705  event->common.timestamp = SDL_GetTicks();
706 
712  }
713  return 0;
714  }
715 
716  if (SDL_event_watchers_count > 0) {
717  /* Make sure we only dispatch the current watcher list */
718  int i, event_watchers_count = SDL_event_watchers_count;
719 
721  for (i = 0; i < event_watchers_count; ++i) {
722  if (!SDL_event_watchers[i].removed) {
723  SDL_event_watchers[i].callback(SDL_event_watchers[i].userdata, event);
724  }
725  }
727 
729  for (i = SDL_event_watchers_count; i--; ) {
730  if (SDL_event_watchers[i].removed) {
732  if (i < SDL_event_watchers_count) {
734  }
735  }
736  }
738  }
739  }
740 
743  }
744  }
745  }
746 
747  if (SDL_PeepEvents(event, 1, SDL_ADDEVENT, 0, 0) <= 0) {
748  return -1;
749  }
750 
752 
753  return 1;
754 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:509
#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 905 of file SDL_events.c.

References SDL_LASTEVENT, and SDL_userevents.

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

◆ SDL_SetEventFilter()

void SDL_SetEventFilter ( SDL_EventFilter  filter,
void userdata 
)

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

The filter is prototyped as:

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

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

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

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

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

Definition at line 757 of file SDL_events.c.

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

758 {
760  /* Set filter and discard pending events */
762  SDL_EventOK.userdata = userdata;
764 
767  }
768  }
769 }
#define SDL_LockMutex
SDL_EventFilter callback
Definition: SDL_events.c:42
void SDL_FlushEvents(Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:605
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_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 666 of file SDL_events.c.

References SDL_WaitEventTimeout().

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

◆ SDL_WaitEventTimeout()

int SDL_WaitEventTimeout ( SDL_Event event,
int  timeout 
)

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

Returns
1, or 0 if there was an error while waiting for events.
Parameters
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 672 of file SDL_events.c.

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

Referenced by SDL_PollEvent(), and SDL_WaitEvent().

673 {
674  Uint32 expiration = 0;
675 
676  if (timeout > 0)
677  expiration = SDL_GetTicks() + timeout;
678 
679  for (;;) {
680  SDL_PumpEvents();
682  case -1:
683  return 0;
684  case 0:
685  if (timeout == 0) {
686  /* Polling and no events, just return */
687  return 0;
688  }
689  if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)) {
690  /* Timeout expired and no events */
691  return 0;
692  }
693  SDL_Delay(10);
694  break;
695  default:
696  /* Has events */
697  return 1;
698  }
699  }
700 }
int SDL_PeepEvents(SDL_Event *events, int numevents, SDL_eventaction action, Uint32 minType, Uint32 maxType)
Definition: SDL_events.c:509
void SDL_PumpEvents(void)
Definition: SDL_events.c:639
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