2021-04-18 07:35:25 +04:00
/*
Simple DirectMedia Layer
2021-05-09 13:30:38 +04:00
Copyright ( C ) 1997 - 2021 Sam Lantinga < slouken @ libsdl . org >
2021-04-18 07:35:25 +04:00
This software is provided ' as - is ' , without any express or implied
warranty . In no event will the authors be held liable for any damages
arising from the use of this software .
Permission is granted to anyone to use this software for any purpose ,
including commercial applications , and to alter it and redistribute it
freely , subject to the following restrictions :
1. The origin of this software must not be misrepresented ; you must not
claim that you wrote the original software . If you use this software
in a product , an acknowledgment in the product documentation would be
appreciated but is not required .
2. Altered source versions must be plainly marked as such , and must not be
misrepresented as being the original software .
3. This notice may not be removed or altered from any source distribution .
*/
/**
* \ file SDL_events . h
*
* Include file for SDL event handling .
*/
# ifndef SDL_events_h_
# define SDL_events_h_
# 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"
/* Set up for C function definitions, even when using C++ */
# ifdef __cplusplus
extern " C " {
# endif
/* General keyboard/mouse state definitions */
# define SDL_RELEASED 0
# define SDL_PRESSED 1
/**
2021-05-09 13:30:38 +04:00
* The types of events that can be delivered .
2021-04-18 07:35:25 +04:00
*/
typedef enum
{
SDL_FIRSTEVENT = 0 , /**< Unused (do not remove) */
/* Application events */
SDL_QUIT = 0x100 , /**< User-requested quit */
/* These application events have special meaning on iOS, see README-ios.md for details */
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 ( )
*/
2021-04-20 23:40:33 +04:00
SDL_LOCALECHANGED , /**< The user's locale preferences have changed. */
2021-04-18 07:35:25 +04:00
/* Display events */
SDL_DISPLAYEVENT = 0x150 , /**< Display state change */
/* Window events */
SDL_WINDOWEVENT = 0x200 , /**< Window state change */
SDL_SYSWMEVENT , /**< System specific event */
/* Keyboard events */
SDL_KEYDOWN = 0x300 , /**< 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 .
*/
/* Mouse events */
SDL_MOUSEMOTION = 0x400 , /**< Mouse moved */
SDL_MOUSEBUTTONDOWN , /**< Mouse button pressed */
SDL_MOUSEBUTTONUP , /**< Mouse button released */
SDL_MOUSEWHEEL , /**< Mouse wheel motion */
/* Joystick events */
SDL_JOYAXISMOTION = 0x600 , /**< 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 */
/* Game controller events */
SDL_CONTROLLERAXISMOTION = 0x650 , /**< 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 */
2021-04-20 23:40:33 +04:00
SDL_CONTROLLERTOUCHPADDOWN , /**< Game controller touchpad was touched */
SDL_CONTROLLERTOUCHPADMOTION , /**< Game controller touchpad finger was moved */
SDL_CONTROLLERTOUCHPADUP , /**< Game controller touchpad finger was lifted */
SDL_CONTROLLERSENSORUPDATE , /**< Game controller sensor was updated */
2021-04-18 07:35:25 +04:00
/* Touch events */
SDL_FINGERDOWN = 0x700 ,
SDL_FINGERUP ,
SDL_FINGERMOTION ,
/* Gesture events */
SDL_DOLLARGESTURE = 0x800 ,
SDL_DOLLARRECORD ,
SDL_MULTIGESTURE ,
/* Clipboard events */
SDL_CLIPBOARDUPDATE = 0x900 , /**< The clipboard changed */
/* Drag and drop events */
SDL_DROPFILE = 0x1000 , /**< 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) */
/* Audio hotplug events */
SDL_AUDIODEVICEADDED = 0x1100 , /**< A new audio device is available */
SDL_AUDIODEVICEREMOVED , /**< An audio device has been removed. */
/* Sensor events */
SDL_SENSORUPDATE = 0x1200 , /**< A sensor was updated */
/* Render events */
SDL_RENDER_TARGETS_RESET = 0x2000 , /**< 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 */
/** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use,
* and should be allocated with SDL_RegisterEvents ( )
*/
SDL_USEREVENT = 0x8000 ,
/**
* This last event is only for bounding internal arrays
*/
SDL_LASTEVENT = 0xFFFF
} SDL_EventType ;
/**
* \ brief Fields shared by every event
*/
typedef struct SDL_CommonEvent
{
Uint32 type ;
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
} SDL_CommonEvent ;
/**
* \ brief Display state change event data ( event . display . * )
*/
typedef struct SDL_DisplayEvent
{
Uint32 type ; /**< ::SDL_DISPLAYEVENT */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 display ; /**< The associated display index */
Uint8 event ; /**< ::SDL_DisplayEventID */
Uint8 padding1 ;
Uint8 padding2 ;
Uint8 padding3 ;
Sint32 data1 ; /**< event dependent data */
} SDL_DisplayEvent ;
/**
* \ brief Window state change event data ( event . window . * )
*/
typedef struct SDL_WindowEvent
{
Uint32 type ; /**< ::SDL_WINDOWEVENT */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID ; /**< The associated window */
Uint8 event ; /**< ::SDL_WindowEventID */
Uint8 padding1 ;
Uint8 padding2 ;
Uint8 padding3 ;
Sint32 data1 ; /**< event dependent data */
Sint32 data2 ; /**< event dependent data */
} SDL_WindowEvent ;
/**
* \ brief Keyboard button event structure ( event . key . * )
*/
typedef struct SDL_KeyboardEvent
{
Uint32 type ; /**< ::SDL_KEYDOWN or ::SDL_KEYUP */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID ; /**< The window with keyboard focus, if any */
Uint8 state ; /**< ::SDL_PRESSED or ::SDL_RELEASED */
Uint8 repeat ; /**< Non-zero if this is a key repeat */
Uint8 padding2 ;
Uint8 padding3 ;
SDL_Keysym keysym ; /**< The key that was pressed or released */
} SDL_KeyboardEvent ;
# define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32)
/**
* \ brief Keyboard text editing event structure ( event . edit . * )
*/
typedef struct SDL_TextEditingEvent
{
Uint32 type ; /**< ::SDL_TEXTEDITING */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID ; /**< The window with keyboard focus, if any */
char text [ SDL_TEXTEDITINGEVENT_TEXT_SIZE ] ; /**< The editing text */
Sint32 start ; /**< The start cursor of selected editing text */
Sint32 length ; /**< The length of selected editing text */
} SDL_TextEditingEvent ;
# define SDL_TEXTINPUTEVENT_TEXT_SIZE (32)
/**
* \ brief Keyboard text input event structure ( event . text . * )
*/
typedef struct SDL_TextInputEvent
{
Uint32 type ; /**< ::SDL_TEXTINPUT */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID ; /**< The window with keyboard focus, if any */
char text [ SDL_TEXTINPUTEVENT_TEXT_SIZE ] ; /**< The input text */
} SDL_TextInputEvent ;
/**
* \ brief Mouse motion event structure ( event . motion . * )
*/
typedef struct SDL_MouseMotionEvent
{
Uint32 type ; /**< ::SDL_MOUSEMOTION */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID ; /**< The window with mouse focus, if any */
Uint32 which ; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */
Uint32 state ; /**< The current button state */
Sint32 x ; /**< X coordinate, relative to window */
Sint32 y ; /**< Y coordinate, relative to window */
Sint32 xrel ; /**< The relative motion in the X direction */
Sint32 yrel ; /**< The relative motion in the Y direction */
} SDL_MouseMotionEvent ;
/**
* \ brief Mouse button event structure ( event . button . * )
*/
typedef struct SDL_MouseButtonEvent
{
Uint32 type ; /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID ; /**< The window with mouse focus, if any */
Uint32 which ; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */
Uint8 button ; /**< The mouse button index */
Uint8 state ; /**< ::SDL_PRESSED or ::SDL_RELEASED */
Uint8 clicks ; /**< 1 for single-click, 2 for double-click, etc. */
Uint8 padding1 ;
Sint32 x ; /**< X coordinate, relative to window */
Sint32 y ; /**< Y coordinate, relative to window */
} SDL_MouseButtonEvent ;
/**
* \ brief Mouse wheel event structure ( event . wheel . * )
*/
typedef struct SDL_MouseWheelEvent
{
Uint32 type ; /**< ::SDL_MOUSEWHEEL */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID ; /**< The window with mouse focus, if any */
Uint32 which ; /**< The mouse instance id, or SDL_TOUCH_MOUSEID */
Sint32 x ; /**< The amount scrolled horizontally, positive to the right and negative to the left */
Sint32 y ; /**< The amount scrolled vertically, positive away from the user and negative toward the user */
Uint32 direction ; /**< Set to one of the SDL_MOUSEWHEEL_* defines. When FLIPPED the values in X and Y will be opposite. Multiply by -1 to change them back */
} SDL_MouseWheelEvent ;
/**
* \ brief Joystick axis motion event structure ( event . jaxis . * )
*/
typedef struct SDL_JoyAxisEvent
{
Uint32 type ; /**< ::SDL_JOYAXISMOTION */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which ; /**< The joystick instance id */
Uint8 axis ; /**< The joystick axis index */
Uint8 padding1 ;
Uint8 padding2 ;
Uint8 padding3 ;
Sint16 value ; /**< The axis value (range: -32768 to 32767) */
Uint16 padding4 ;
} SDL_JoyAxisEvent ;
/**
* \ brief Joystick trackball motion event structure ( event . jball . * )
*/
typedef struct SDL_JoyBallEvent
{
Uint32 type ; /**< ::SDL_JOYBALLMOTION */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which ; /**< The joystick instance id */
Uint8 ball ; /**< The joystick trackball index */
Uint8 padding1 ;
Uint8 padding2 ;
Uint8 padding3 ;
Sint16 xrel ; /**< The relative motion in the X direction */
Sint16 yrel ; /**< The relative motion in the Y direction */
} SDL_JoyBallEvent ;
/**
* \ brief Joystick hat position change event structure ( event . jhat . * )
*/
typedef struct SDL_JoyHatEvent
{
Uint32 type ; /**< ::SDL_JOYHATMOTION */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which ; /**< The joystick instance id */
Uint8 hat ; /**< The joystick hat index */
Uint8 value ; /**< The hat position value.
* \ sa : : SDL_HAT_LEFTUP : : SDL_HAT_UP : : SDL_HAT_RIGHTUP
* \ sa : : SDL_HAT_LEFT : : SDL_HAT_CENTERED : : SDL_HAT_RIGHT
* \ sa : : SDL_HAT_LEFTDOWN : : SDL_HAT_DOWN : : SDL_HAT_RIGHTDOWN
*
* Note that zero means the POV is centered .
*/
Uint8 padding1 ;
Uint8 padding2 ;
} SDL_JoyHatEvent ;
/**
* \ brief Joystick button event structure ( event . jbutton . * )
*/
typedef struct SDL_JoyButtonEvent
{
Uint32 type ; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which ; /**< The joystick instance id */
Uint8 button ; /**< The joystick button index */
Uint8 state ; /**< ::SDL_PRESSED or ::SDL_RELEASED */
Uint8 padding1 ;
Uint8 padding2 ;
} SDL_JoyButtonEvent ;
/**
* \ brief Joystick device event structure ( event . jdevice . * )
*/
typedef struct SDL_JoyDeviceEvent
{
Uint32 type ; /**< ::SDL_JOYDEVICEADDED or ::SDL_JOYDEVICEREMOVED */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Sint32 which ; /**< The joystick device index for the ADDED event, instance id for the REMOVED event */
} SDL_JoyDeviceEvent ;
/**
* \ brief Game controller axis motion event structure ( event . caxis . * )
*/
typedef struct SDL_ControllerAxisEvent
{
Uint32 type ; /**< ::SDL_CONTROLLERAXISMOTION */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which ; /**< The joystick instance id */
Uint8 axis ; /**< The controller axis (SDL_GameControllerAxis) */
Uint8 padding1 ;
Uint8 padding2 ;
Uint8 padding3 ;
Sint16 value ; /**< The axis value (range: -32768 to 32767) */
Uint16 padding4 ;
} SDL_ControllerAxisEvent ;
/**
* \ brief Game controller button event structure ( event . cbutton . * )
*/
typedef struct SDL_ControllerButtonEvent
{
Uint32 type ; /**< ::SDL_CONTROLLERBUTTONDOWN or ::SDL_CONTROLLERBUTTONUP */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which ; /**< The joystick instance id */
Uint8 button ; /**< The controller button (SDL_GameControllerButton) */
Uint8 state ; /**< ::SDL_PRESSED or ::SDL_RELEASED */
Uint8 padding1 ;
Uint8 padding2 ;
} SDL_ControllerButtonEvent ;
/**
* \ brief Controller device event structure ( event . cdevice . * )
*/
typedef struct SDL_ControllerDeviceEvent
{
Uint32 type ; /**< ::SDL_CONTROLLERDEVICEADDED, ::SDL_CONTROLLERDEVICEREMOVED, or ::SDL_CONTROLLERDEVICEREMAPPED */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Sint32 which ; /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */
} SDL_ControllerDeviceEvent ;
2021-04-20 23:40:33 +04:00
/**
* \ brief Game controller touchpad event structure ( event . ctouchpad . * )
*/
typedef struct SDL_ControllerTouchpadEvent
{
Uint32 type ; /**< ::SDL_CONTROLLERTOUCHPADDOWN or ::SDL_CONTROLLERTOUCHPADMOTION or ::SDL_CONTROLLERTOUCHPADUP */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which ; /**< The joystick instance id */
Sint32 touchpad ; /**< The index of the touchpad */
Sint32 finger ; /**< The index of the finger on the touchpad */
float x ; /**< Normalized in the range 0...1 with 0 being on the left */
float y ; /**< Normalized in the range 0...1 with 0 being at the top */
float pressure ; /**< Normalized in the range 0...1 */
} SDL_ControllerTouchpadEvent ;
/**
* \ brief Game controller sensor event structure ( event . csensor . * )
*/
typedef struct SDL_ControllerSensorEvent
{
Uint32 type ; /**< ::SDL_CONTROLLERSENSORUPDATE */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_JoystickID which ; /**< The joystick instance id */
Sint32 sensor ; /**< The type of the sensor, one of the values of ::SDL_SensorType */
float data [ 3 ] ; /**< Up to 3 values from the sensor, as defined in SDL_sensor.h */
} SDL_ControllerSensorEvent ;
2021-04-18 07:35:25 +04:00
/**
* \ brief Audio device event structure ( event . adevice . * )
*/
typedef struct SDL_AudioDeviceEvent
{
Uint32 type ; /**< ::SDL_AUDIODEVICEADDED, or ::SDL_AUDIODEVICEREMOVED */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 which ; /**< The audio device index for the ADDED event (valid until next SDL_GetNumAudioDevices() call), SDL_AudioDeviceID for the REMOVED event */
Uint8 iscapture ; /**< zero if an output device, non-zero if a capture device. */
Uint8 padding1 ;
Uint8 padding2 ;
Uint8 padding3 ;
} SDL_AudioDeviceEvent ;
/**
* \ brief Touch finger event structure ( event . tfinger . * )
*/
typedef struct SDL_TouchFingerEvent
{
Uint32 type ; /**< ::SDL_FINGERMOTION or ::SDL_FINGERDOWN or ::SDL_FINGERUP */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_TouchID touchId ; /**< The touch device id */
SDL_FingerID fingerId ;
float x ; /**< Normalized in the range 0...1 */
float y ; /**< Normalized in the range 0...1 */
float dx ; /**< Normalized in the range -1...1 */
float dy ; /**< Normalized in the range -1...1 */
float pressure ; /**< Normalized in the range 0...1 */
Uint32 windowID ; /**< The window underneath the finger, if any */
} SDL_TouchFingerEvent ;
/**
* \ brief Multiple Finger Gesture Event ( event . mgesture . * )
*/
typedef struct SDL_MultiGestureEvent
{
Uint32 type ; /**< ::SDL_MULTIGESTURE */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_TouchID touchId ; /**< The touch device id */
float dTheta ;
float dDist ;
float x ;
float y ;
Uint16 numFingers ;
Uint16 padding ;
} SDL_MultiGestureEvent ;
/**
* \ brief Dollar Gesture Event ( event . dgesture . * )
*/
typedef struct SDL_DollarGestureEvent
{
Uint32 type ; /**< ::SDL_DOLLARGESTURE or ::SDL_DOLLARRECORD */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_TouchID touchId ; /**< The touch device id */
SDL_GestureID gestureId ;
Uint32 numFingers ;
float error ;
float x ; /**< Normalized center of gesture */
float y ; /**< Normalized center of gesture */
} SDL_DollarGestureEvent ;
/**
* \ brief 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 ( ) .
* \ note If this event is enabled , you must free the filename in the event .
*/
typedef struct SDL_DropEvent
{
Uint32 type ; /**< ::SDL_DROPBEGIN or ::SDL_DROPFILE or ::SDL_DROPTEXT or ::SDL_DROPCOMPLETE */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
char * file ; /**< The file name, which should be freed with SDL_free(), is NULL on begin/complete */
Uint32 windowID ; /**< The window that was dropped on, if any */
} SDL_DropEvent ;
/**
* \ brief Sensor event structure ( event . sensor . * )
*/
typedef struct SDL_SensorEvent
{
Uint32 type ; /**< ::SDL_SENSORUPDATE */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Sint32 which ; /**< The instance ID of the sensor */
float data [ 6 ] ; /**< Up to 6 values from the sensor - additional values can be queried using SDL_SensorGetData() */
} SDL_SensorEvent ;
/**
* \ brief The " quit requested " event
*/
typedef struct SDL_QuitEvent
{
Uint32 type ; /**< ::SDL_QUIT */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
} SDL_QuitEvent ;
/**
* \ brief OS Specific event
*/
typedef struct SDL_OSEvent
{
Uint32 type ; /**< ::SDL_QUIT */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
} SDL_OSEvent ;
/**
* \ brief A user - defined event type ( event . user . * )
*/
typedef struct SDL_UserEvent
{
Uint32 type ; /**< ::SDL_USEREVENT through ::SDL_LASTEVENT-1 */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
Uint32 windowID ; /**< The associated window if any */
Sint32 code ; /**< User defined event code */
void * data1 ; /**< User defined data pointer */
void * data2 ; /**< User defined data pointer */
} SDL_UserEvent ;
struct SDL_SysWMmsg ;
typedef struct SDL_SysWMmsg SDL_SysWMmsg ;
/**
* \ brief A video driver dependent system event ( event . syswm . * )
* This event is disabled by default , you can enable it with SDL_EventState ( )
*
* \ note If you want to use this event , you should include SDL_syswm . h .
*/
typedef struct SDL_SysWMEvent
{
Uint32 type ; /**< ::SDL_SYSWMEVENT */
Uint32 timestamp ; /**< In milliseconds, populated using SDL_GetTicks() */
SDL_SysWMmsg * msg ; /**< driver dependent data, defined in SDL_syswm.h */
} SDL_SysWMEvent ;
/**
* \ brief General event structure
*/
typedef union SDL_Event
{
2021-04-20 23:40:33 +04:00
Uint32 type ; /**< Event type, shared with all events */
SDL_CommonEvent common ; /**< Common event data */
SDL_DisplayEvent display ; /**< Display event data */
SDL_WindowEvent window ; /**< Window event data */
SDL_KeyboardEvent key ; /**< Keyboard event data */
SDL_TextEditingEvent edit ; /**< Text editing event data */
SDL_TextInputEvent text ; /**< Text input event data */
SDL_MouseMotionEvent motion ; /**< Mouse motion event data */
SDL_MouseButtonEvent button ; /**< Mouse button event data */
SDL_MouseWheelEvent wheel ; /**< Mouse wheel event data */
SDL_JoyAxisEvent jaxis ; /**< Joystick axis event data */
SDL_JoyBallEvent jball ; /**< Joystick ball event data */
SDL_JoyHatEvent jhat ; /**< Joystick hat event data */
SDL_JoyButtonEvent jbutton ; /**< Joystick button event data */
SDL_JoyDeviceEvent jdevice ; /**< Joystick device change event data */
SDL_ControllerAxisEvent caxis ; /**< Game Controller axis event data */
SDL_ControllerButtonEvent cbutton ; /**< Game Controller button event data */
SDL_ControllerDeviceEvent cdevice ; /**< Game Controller device event data */
SDL_ControllerTouchpadEvent ctouchpad ; /**< Game Controller touchpad event data */
SDL_ControllerSensorEvent csensor ; /**< Game Controller sensor event data */
SDL_AudioDeviceEvent adevice ; /**< Audio device event data */
SDL_SensorEvent sensor ; /**< Sensor event data */
SDL_QuitEvent quit ; /**< Quit request event data */
SDL_UserEvent user ; /**< Custom event data */
SDL_SysWMEvent syswm ; /**< System dependent window event data */
SDL_TouchFingerEvent tfinger ; /**< Touch finger event data */
SDL_MultiGestureEvent mgesture ; /**< Gesture event data */
SDL_DollarGestureEvent dgesture ; /**< Gesture event data */
SDL_DropEvent drop ; /**< Drag and drop event data */
2021-04-18 07:35:25 +04:00
/* This is necessary for ABI compatibility between Visual C++ and GCC
Visual C + + will respect the push pack pragma and use 52 bytes for
this structure , and GCC will use the alignment of the largest datatype
within the union , which is 8 bytes .
So . . . we ' ll add padding to force the size to be 56 bytes for both .
*/
Uint8 padding [ 56 ] ;
} SDL_Event ;
/* Make sure we haven't broken binary compatibility */
SDL_COMPILE_TIME_ASSERT ( SDL_Event , sizeof ( SDL_Event ) = = 56 ) ;
/* Function prototypes */
/**
2021-05-09 13:30:38 +04:00
* Pump the event loop , gathering events from the input devices .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* This function updates the event queue and internal input device state .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* * * WARNING * * : This should only be run in the thread that initialized the
* video subsystem , and for extra safety , you should consider only doing those
* things on the main thread in any case .
*
* SDL_PumpEvents ( ) gathers all the pending input information from devices and
* places it in the event queue . Without calls to SDL_PumpEvents ( ) no events
* would ever be placed on the queue . Often the need for calls to
* SDL_PumpEvents ( ) is hidden from the user since SDL_PollEvent ( ) and
* SDL_WaitEvent ( ) implicitly call SDL_PumpEvents ( ) . However , if you are not
* polling or waiting for events ( e . g . you are filtering them ) , then you must
* call SDL_PumpEvents ( ) to force an event queue update .
*
* \ sa SDL_PollEvent
* \ sa SDL_WaitEvent
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC void SDLCALL SDL_PumpEvents ( void ) ;
/* @{ */
typedef enum
{
SDL_ADDEVENT ,
SDL_PEEKEVENT ,
SDL_GETEVENT
} SDL_eventaction ;
/**
2021-05-09 13:30:38 +04:00
* Check the event queue for messages and optionally return them .
*
* ` action ` may be any of the following :
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* - ` SDL_ADDEVENT ` : up to ` numevents ` events will be added to the back of
* the event queue .
* - ` SDL_PEEKEVENT ` : ` numevents ` events at the front of the event queue ,
* within the specified minimum and maximum type , will be returned to the
* caller and will _not_ be removed from the queue .
* - ` SDL_GETEVENT ` : up to ` numevents ` events at the front of the event queue ,
* within the specified minimum and maximum type , will be returned to the
* caller and will be removed from the queue .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* You may have to call SDL_PumpEvents ( ) before calling this function .
* Otherwise , the events may not be ready to be filtered when you call
* SDL_PeepEvents ( ) .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* This function is thread - safe .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* \ param events destination buffer for the retrieved events
* \ param numevents if action is SDL_ADDEVENT , the number of events to add
* back to the event queue ; if action is SDL_PEEKEVENT or
* SDL_GETEVENT , the maximum number of events to retrieve
* \ param action action to take ; see [ [ # action | Remarks ] ] for details
* \ param minType minimum value of the event type to be considered ;
* SDL_FIRSTEVENT is a safe choice
* \ param maxType maximum value of the event type to be considered ;
* SDL_LASTEVENT is a safe choice
* \ returns the number of events actually stored or a negative error code on
* failure ; call SDL_GetError ( ) for more information .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* \ sa SDL_PollEvent
* \ sa SDL_PumpEvents
* \ sa SDL_PushEvent
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC int SDLCALL SDL_PeepEvents ( SDL_Event * events , int numevents ,
SDL_eventaction action ,
Uint32 minType , Uint32 maxType ) ;
/* @} */
/**
2021-05-09 13:30:38 +04:00
* Check for the existence of a certain event type in the event queue .
*
* If you need to check for a range of event types , use SDL_HasEvents ( )
* instead .
*
* \ param type the type of event to be queried ; see SDL_EventType for details
* \ returns SDL_TRUE if events matching ` type ` are present , or SDL_FALSE if
* events matching ` type ` are not present .
*
* \ sa SDL_HasEvents
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent ( Uint32 type ) ;
2021-05-09 13:30:38 +04:00
/**
* Check for the existence of certain event types in the event queue .
*
* If you need to check for a single event type , use SDL_HasEvent ( ) instead .
*
* \ param minType the low end of event type to be queried , inclusive ; see
* SDL_EventType for details
* \ param maxType the high end of event type to be queried , inclusive ; see
* SDL_EventType for details
* \ returns SDL_TRUE if events with type > = ` minType ` and < = ` maxType ` are
* present , or SDL_FALSE if not .
*
* \ sa SDL_HasEvents
*/
2021-04-18 07:35:25 +04:00
extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents ( Uint32 minType , Uint32 maxType ) ;
/**
2021-05-09 13:30:38 +04:00
* Clear events of a specific type from the event queue .
*
* This will unconditionally remove any events from the queue that match
* ` type ` . If you need to remove a range of event types , use SDL_FlushEvents ( )
* instead .
*
* It ' s also normal to just ignore events you don ' t care about in your event
* loop without calling this function .
*
* 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 .
*
* \ param type the type of event to be cleared ; see SDL_EventType for details
*
* \ sa SDL_FlushEvents
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC void SDLCALL SDL_FlushEvent ( Uint32 type ) ;
2021-05-09 13:30:38 +04:00
/**
* Clear events of a range of types from the event queue .
*
* This will unconditionally remove any events from the queue that are in the
* range of ` minType ` to ` maxType ` , inclusive . If you need to remove a single
* event type , use SDL_FlushEvent ( ) instead .
*
* It ' s also normal to just ignore events you don ' t care about in your event
* loop without calling this function .
*
* 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 .
*
* \ param minType the low end of event type to be cleared , inclusive ; see
* SDL_EventType for details
* \ param maxType the high end of event type to be cleared , inclusive ; see
* SDL_EventType for details
*
* \ sa SDL_FlushEvent
*/
2021-04-18 07:35:25 +04:00
extern DECLSPEC void SDLCALL SDL_FlushEvents ( Uint32 minType , Uint32 maxType ) ;
/**
2021-05-09 13:30:38 +04:00
* Poll for currently pending events .
*
* If ` event ` is not NULL , the next event is removed from the queue and
* stored in the SDL_Event structure pointed to by ` event ` . The 1 returned
* refers to this event , immediately stored in the SDL Event structure - - not
* an event to follow .
*
* If ` event ` is NULL , it simply returns 1 if there is an event in the queue ,
* but will not remove it from the queue .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* As this function implicitly calls SDL_PumpEvents ( ) , you can only call this
* function in the thread that set the video mode .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* SDL_PollEvent ( ) is the favored way of receiving system events since it can
* be done from the main loop and does not suspend the main loop while waiting
* on an event to be posted .
*
* The common practice is to fully process the event queue once every frame ,
* usually as a first step before updating the game ' s state :
*
* ` ` ` c
* while ( game_is_still_running ) {
* SDL_Event event ;
* while ( SDL_PollEvent ( & event ) ) { // poll until all events are handled!
* // decide what to do with this event.
* }
*
* // update game state, draw the current frame
* }
* ` ` `
*
* \ param event the SDL_Event structure to be filled with the next event from
* the queue , or NULL
* \ returns 1 if there is a pending event or 0 if there are none available .
*
* \ sa SDL_GetEventFilter
* \ sa SDL_PeepEvents
* \ sa SDL_PushEvent
* \ sa SDL_SetEventFilter
* \ sa SDL_WaitEvent
* \ sa SDL_WaitEventTimeout
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC int SDLCALL SDL_PollEvent ( SDL_Event * event ) ;
/**
2021-05-09 13:30:38 +04:00
* Wait indefinitely for the next available event .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* If ` event ` is not NULL , the next event is removed from the queue and
* stored in the SDL_Event structure pointed to by ` event ` .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* As this function implicitly calls SDL_PumpEvents ( ) , you can only call this
* function in the thread that initialized the video subsystem .
*
* \ param event the SDL_Event structure to be filled in with the next event
* from the queue , or NULL
* \ returns 1 on success or 0 if there was an error while waiting for events ;
* call SDL_GetError ( ) for more information .
*
* \ sa SDL_PollEvent
* \ sa SDL_PumpEvents
* \ sa SDL_WaitEventTimeout
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC int SDLCALL SDL_WaitEvent ( SDL_Event * event ) ;
/**
2021-05-09 13:30:38 +04:00
* Wait until the specified timeout ( in milliseconds ) for
* the next available event .
*
* If ` event ` is not NULL , the next event is removed from the queue and
* stored in the SDL_Event structure pointed to by ` event ` .
*
* As this function implicitly calls SDL_PumpEvents ( ) , you can only call this
* function in the thread that initialized the video subsystem .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* \ param event the SDL_Event structure to be filled in with the next event
* from the queue , or NULL
* \ param timeout the maximum number of milliseconds to wait for the next
* available event
* \ returns 1 on success or 0 if there was an error while waiting for events ;
* call SDL_GetError ( ) for more information . This also returns 0 if
* the timeout elapsed without an event arriving .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* \ sa SDL_PollEvent
* \ sa SDL_PumpEvents
* \ sa SDL_WaitEvent
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC int SDLCALL SDL_WaitEventTimeout ( SDL_Event * event ,
int timeout ) ;
/**
2021-05-09 13:30:38 +04:00
* Add an event to the event queue .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* The event queue can actually be used as a two way communication channel .
* Not only can events be read from the queue , but the user can also push
* their own events onto it . ` event ` is a pointer to the event structure you
* wish to push onto the queue . The event is copied into the queue , and the
* caller may dispose of the memory pointed to after SDL_PushEvent ( ) returns .
*
* Note : Pushing device input events onto the queue doesn ' t modify the state
* of the device within SDL .
*
* This function is thread - safe , and can be called from other threads safely .
*
* Note : Events pushed onto the queue with SDL_PushEvent ( ) get passed through
* the event filter but events added with SDL_PeepEvents ( ) do not .
*
* For pushing application - specific events , please use SDL_RegisterEvents ( ) to
* get an event type that does not conflict with other code that also wants
* its own custom event types .
*
* \ param event the SDL_Event to be added to the queue
* \ returns 1 on success , 0 if the event was filtered , or a negative error
* code on failure ; call SDL_GetError ( ) for more information . A
* common reason for error is the event queue being full .
*
* \ sa SDL_PeepEvents
* \ sa SDL_PollEvent
* \ sa SDL_RegisterEvents
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC int SDLCALL SDL_PushEvent ( SDL_Event * event ) ;
2021-05-09 13:30:38 +04:00
/**
* A function pointer used for callbacks that watch the event queue .
*
* \ param userdata what was passed as ` userdata ` to SDL_SetEventFilter ( )
* or SDL_AddEventWatch , etc
* \ param event the event that triggered the callback
* \ returns Filters return 1 to permit event to be added to the queue , and
* 0 to disallow it . When used with SDL_AddEventWatch , the return
* value is ignored .
*
* \ sa SDL_SetEventFilter
* \ sa SDL_AddEventWatch
*/
2021-04-18 07:35:25 +04:00
typedef int ( SDLCALL * SDL_EventFilter ) ( void * userdata , SDL_Event * event ) ;
/**
2021-05-09 13:30:38 +04:00
* Set up a filter to process all events before they change internal state and
* are posted to the internal event queue .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* If the filter function returns 1 when called , 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 .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* * * WARNING * * : Be very careful of what you do in the event filter function ,
* as it may run in a different thread !
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* On platforms that support it , if the quit event is generated by an
* interrupt signal ( e . g . pressing Ctrl - C ) , it will be delivered to the
* application at the next event poll .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* 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 .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* Note : Disabled events never make it to the event filter function ; see
* SDL_EventState ( ) .
*
* Note : If you just want to inspect events without filtering , you should use
* SDL_AddEventWatch ( ) instead .
*
* Note : Events pushed onto the queue with SDL_PushEvent ( ) get passed through
* the event filter , but events pushed onto the queue with SDL_PeepEvents ( ) do
* not .
*
* \ param filter An SDL_EventFilter function to call when an event happens
* \ param userdata a pointer that is passed to ` filter `
*
* \ sa SDL_AddEventWatch
* \ sa SDL_EventState
* \ sa SDL_GetEventFilter
* \ sa SDL_PeepEvents
* \ sa SDL_PushEvent
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC void SDLCALL SDL_SetEventFilter ( SDL_EventFilter filter ,
void * userdata ) ;
/**
2021-05-09 13:30:38 +04:00
* Query the current event filter .
*
* This function can be used to " chain " filters , by saving the existing filter
* before replacing it with a function that will call that saved filter .
*
* \ param filter the current callback function will be stored here
* \ param userdata the pointer that is passed to the current event filter will
* be stored here
* \ returns SDL_TRUE on success or SDL_FALSE if there is no event filter set .
*
* \ sa SDL_SetEventFilter
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter ( SDL_EventFilter * filter ,
void * * userdata ) ;
/**
2021-05-09 13:30:38 +04:00
* Add a callback to be triggered when an event is added to the event queue .
*
* ` filter ` will be called when an event happens , and its return value is
* ignored .
*
* * * WARNING * * : Be very careful of what you do in the event filter function ,
* as it may run in a different thread !
*
* If the quit event is generated by a signal ( e . g . SIGINT ) , it will bypass
* the internal queue and be delivered to the watch callback immediately , and
* arrive at the next event poll .
*
* Note : the callback is called for events posted by the user through
* SDL_PushEvent ( ) , but not for disabled events , nor for events by a filter
* callback set with SDL_SetEventFilter ( ) , nor for events posted by the user
* through SDL_PeepEvents ( ) .
*
* \ param filter an SDL_EventFilter function to call when an event happens .
* \ param userdata a pointer that is passed to ` filter `
*
* \ sa SDL_DelEventWatch
* \ sa SDL_SetEventFilter
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC void SDLCALL SDL_AddEventWatch ( SDL_EventFilter filter ,
void * userdata ) ;
/**
2021-05-09 13:30:38 +04:00
* Remove an event watch callback added with
* SDL_AddEventWatch ( ) .
*
* This function takes the same input as SDL_AddEventWatch ( ) to identify and
* delete the corresponding callback .
*
* \ param filter the function originally passed to SDL_AddEventWatch ( )
* \ param userdata the pointer originally passed to SDL_AddEventWatch ( )
*
* \ sa SDL_AddEventWatch
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC void SDLCALL SDL_DelEventWatch ( SDL_EventFilter filter ,
void * userdata ) ;
/**
2021-05-09 13:30:38 +04:00
* Run a specific filter function on the current event
* queue , removing any events for which the filter returns 0.
*
* See SDL_SetEventFilter ( ) for more information . Unlike SDL_SetEventFilter ( ) ,
* this function does not change the filter permanently , it only uses the
* supplied filter until this function returns .
*
* \ param filter the SDL_EventFilter function to call when an event happens
* \ param userdata a pointer that is passed to ` filter `
*
* \ sa SDL_GetEventFilter
* \ sa SDL_SetEventFilter
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC void SDLCALL SDL_FilterEvents ( SDL_EventFilter filter ,
void * userdata ) ;
/* @{ */
# define SDL_QUERY -1
# define SDL_IGNORE 0
# define SDL_DISABLE 0
# define SDL_ENABLE 1
/**
2021-05-09 13:30:38 +04:00
* Set the state of processing events by type .
*
* ` state ` may be any of the following :
*
* - ` SDL_QUERY ` : returns the current processing state of the specified event
* - ` SDL_IGNORE ` ( aka ` SDL_DISABLE ` ) : the event will automatically be dropped
* from the event queue and will not be filtered
* - ` SDL_ENABLE ` : the event will be processed normally
*
* \ param type the type of event ; see SDL_EventType for details
* \ param state how to process the event
* \ returns ` SDL_DISABLE ` or ` SDL_ENABLE ` , representing the processing state
* of the event before this function makes any changes to it .
*
* \ sa SDL_GetEventState
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC Uint8 SDLCALL SDL_EventState ( Uint32 type , int state ) ;
/* @} */
# define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY)
/**
2021-05-09 13:30:38 +04:00
* Allocate a set of user - defined events , and return the beginning event
* number for that set of events .
*
* Calling this function with ` numevents ` < = 0 is an error and will return
* ( Uint32 ) - 1.
*
* Note , ( Uint32 ) - 1 means the maximum unsigned 32 - bit integer value ( or
* 0xFFFFFFFF ) , but is clearer to write .
*
* \ param numevents the number of events to be allocated
* \ returns The beginning event number , or ( Uint32 ) - 1 if there are not enough
* user - defined events left .
*
* \ since This function is available since SDL 2.0 .0 .
2021-04-18 07:35:25 +04:00
*
2021-05-09 13:30:38 +04:00
* \ sa SDL_PushEvent
2021-04-18 07:35:25 +04:00
*/
extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents ( int numevents ) ;
/* Ends C function definitions when using C++ */
# ifdef __cplusplus
}
# endif
# include "close_code.h"
# endif /* SDL_events_h_ */
/* vi: set ts=4 sw=4 expandtab: */