2
Simple DirectMedia Layer
3
Copyright (C) 1997-2011 Sam Lantinga <slouken@libsdl.org>
5
This software is provided 'as-is', without any express or implied
6
warranty. In no event will the authors be held liable for any damages
7
arising from the use of this software.
9
Permission is granted to anyone to use this software for any purpose,
10
including commercial applications, and to alter it and redistribute it
11
freely, subject to the following restrictions:
13
1. The origin of this software must not be misrepresented; you must not
14
claim that you wrote the original software. If you use this software
15
in a product, an acknowledgment in the product documentation would be
16
appreciated but is not required.
17
2. Altered source versions must be plainly marked as such, and must not be
18
misrepresented as being the original software.
19
3. This notice may not be removed or altered from any source distribution.
25
* Include file for SDL event handling.
31
#include "SDL_stdinc.h"
32
#include "SDL_error.h"
33
#include "SDL_video.h"
34
#include "SDL_keyboard.h"
35
#include "SDL_mouse.h"
36
#include "SDL_joystick.h"
38
#include "SDL_gesture.h"
39
#include "SDL_touch.h"
41
#include "begin_code.h"
42
/* Set up for C function definitions, even when using C++ */
49
/* General keyboard/mouse state definitions */
50
#define SDL_RELEASED 0
54
* \brief The types of events that can be delivered.
58
SDL_FIRSTEVENT = 0, /**< Unused (do not remove) */
60
/* Application events */
61
SDL_QUIT = 0x100, /**< User-requested quit */
64
SDL_WINDOWEVENT = 0x200, /**< Window state change */
65
SDL_SYSWMEVENT, /**< System specific event */
68
SDL_KEYDOWN = 0x300, /**< Key pressed */
69
SDL_KEYUP, /**< Key released */
70
SDL_TEXTEDITING, /**< Keyboard text editing (composition) */
71
SDL_TEXTINPUT, /**< Keyboard text input */
74
SDL_MOUSEMOTION = 0x400, /**< Mouse moved */
75
SDL_MOUSEBUTTONDOWN, /**< Mouse button pressed */
76
SDL_MOUSEBUTTONUP, /**< Mouse button released */
77
SDL_MOUSEWHEEL, /**< Mouse wheel motion */
79
/* Tablet or multiple mice input device events */
80
SDL_INPUTMOTION = 0x500, /**< Input moved */
81
SDL_INPUTBUTTONDOWN, /**< Input button pressed */
82
SDL_INPUTBUTTONUP, /**< Input button released */
83
SDL_INPUTWHEEL, /**< Input wheel motion */
84
SDL_INPUTPROXIMITYIN, /**< Input pen entered proximity */
85
SDL_INPUTPROXIMITYOUT, /**< Input pen left proximity */
88
SDL_JOYAXISMOTION = 0x600, /**< Joystick axis motion */
89
SDL_JOYBALLMOTION, /**< Joystick trackball motion */
90
SDL_JOYHATMOTION, /**< Joystick hat position change */
91
SDL_JOYBUTTONDOWN, /**< Joystick button pressed */
92
SDL_JOYBUTTONUP, /**< Joystick button released */
95
SDL_FINGERDOWN = 0x700,
102
SDL_DOLLARGESTURE = 0x800,
106
/* Clipboard events */
108
SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard changed */
110
/* Obsolete events */
111
SDL_EVENT_COMPAT1 = 0x7000, /**< SDL 1.2 events for compatibility */
116
/** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use,
117
* and should be allocated with SDL_RegisterEvents()
119
SDL_USEREVENT = 0x8000,
122
* This last event is only for bounding internal arrays
124
SDL_LASTEVENT = 0xFFFF
128
* \brief Window state change event data (event.window.*)
130
typedef struct SDL_WindowEvent
132
Uint32 type; /**< ::SDL_WINDOWEVENT */
133
Uint32 windowID; /**< The associated window */
134
Uint8 event; /**< ::SDL_WindowEventID */
138
int data1; /**< event dependent data */
139
int data2; /**< event dependent data */
143
* \brief Keyboard button event structure (event.key.*)
145
typedef struct SDL_KeyboardEvent
147
Uint32 type; /**< ::SDL_KEYDOWN or ::SDL_KEYUP */
148
Uint32 windowID; /**< The window with keyboard focus, if any */
149
Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */
150
Uint8 repeat; /**< Non-zero if this is a key repeat */
153
SDL_Keysym keysym; /**< The key that was pressed or released */
156
#define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32)
158
* \brief Keyboard text editing event structure (event.edit.*)
160
typedef struct SDL_TextEditingEvent
162
Uint32 type; /**< ::SDL_TEXTEDITING */
163
Uint32 windowID; /**< The window with keyboard focus, if any */
164
char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE]; /**< The editing text */
165
int start; /**< The start cursor of selected editing text */
166
int length; /**< The length of selected editing text */
167
} SDL_TextEditingEvent;
170
#define SDL_TEXTINPUTEVENT_TEXT_SIZE (32)
172
* \brief Keyboard text input event structure (event.text.*)
174
typedef struct SDL_TextInputEvent
176
Uint32 type; /**< ::SDL_TEXTINPUT */
177
Uint32 windowID; /**< The window with keyboard focus, if any */
178
char text[SDL_TEXTINPUTEVENT_TEXT_SIZE]; /**< The input text */
179
} SDL_TextInputEvent;
182
* \brief Mouse motion event structure (event.motion.*)
184
typedef struct SDL_MouseMotionEvent
186
Uint32 type; /**< ::SDL_MOUSEMOTION */
187
Uint32 windowID; /**< The window with mouse focus, if any */
188
Uint8 state; /**< The current button state */
192
int x; /**< X coordinate, relative to window */
193
int y; /**< Y coordinate, relative to window */
194
int xrel; /**< The relative motion in the X direction */
195
int yrel; /**< The relative motion in the Y direction */
196
} SDL_MouseMotionEvent;
199
* \brief Mouse button event structure (event.button.*)
201
typedef struct SDL_MouseButtonEvent
203
Uint32 type; /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */
204
Uint32 windowID; /**< The window with mouse focus, if any */
205
Uint8 button; /**< The mouse button index */
206
Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */
209
int x; /**< X coordinate, relative to window */
210
int y; /**< Y coordinate, relative to window */
211
} SDL_MouseButtonEvent;
214
* \brief Mouse wheel event structure (event.wheel.*)
216
typedef struct SDL_MouseWheelEvent
218
Uint32 type; /**< ::SDL_MOUSEWHEEL */
219
Uint32 windowID; /**< The window with mouse focus, if any */
220
int x; /**< The amount scrolled horizontally */
221
int y; /**< The amount scrolled vertically */
222
} SDL_MouseWheelEvent;
225
* \brief Joystick axis motion event structure (event.jaxis.*)
227
typedef struct SDL_JoyAxisEvent
229
Uint32 type; /**< ::SDL_JOYAXISMOTION */
230
Uint8 which; /**< The joystick device index */
231
Uint8 axis; /**< The joystick axis index */
234
int value; /**< The axis value (range: -32768 to 32767) */
238
* \brief Joystick trackball motion event structure (event.jball.*)
240
typedef struct SDL_JoyBallEvent
242
Uint32 type; /**< ::SDL_JOYBALLMOTION */
243
Uint8 which; /**< The joystick device index */
244
Uint8 ball; /**< The joystick trackball index */
247
int xrel; /**< The relative motion in the X direction */
248
int yrel; /**< The relative motion in the Y direction */
252
* \brief Joystick hat position change event structure (event.jhat.*)
254
typedef struct SDL_JoyHatEvent
256
Uint32 type; /**< ::SDL_JOYHATMOTION */
257
Uint8 which; /**< The joystick device index */
258
Uint8 hat; /**< The joystick hat index */
259
Uint8 value; /**< The hat position value.
260
* \sa ::SDL_HAT_LEFTUP ::SDL_HAT_UP ::SDL_HAT_RIGHTUP
261
* \sa ::SDL_HAT_LEFT ::SDL_HAT_CENTERED ::SDL_HAT_RIGHT
262
* \sa ::SDL_HAT_LEFTDOWN ::SDL_HAT_DOWN ::SDL_HAT_RIGHTDOWN
264
* Note that zero means the POV is centered.
270
* \brief Joystick button event structure (event.jbutton.*)
272
typedef struct SDL_JoyButtonEvent
274
Uint32 type; /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */
275
Uint8 which; /**< The joystick device index */
276
Uint8 button; /**< The joystick button index */
277
Uint8 state; /**< ::SDL_PRESSED or ::SDL_RELEASED */
279
} SDL_JoyButtonEvent;
283
* \brief Touch finger motion/finger event structure (event.tmotion.*)
285
typedef struct SDL_TouchFingerEvent
287
Uint32 type; /**< ::SDL_FINGERMOTION OR
288
SDL_FINGERDOWN OR SDL_FINGERUP*/
289
Uint32 windowID; /**< The window with mouse focus, if any */
290
SDL_TouchID touchId; /**< The touch device id */
291
SDL_FingerID fingerId;
292
Uint8 state; /**< The current button state */
301
} SDL_TouchFingerEvent;
305
* \brief Touch finger motion/finger event structure (event.tmotion.*)
307
typedef struct SDL_TouchButtonEvent
309
Uint32 type; /**< ::SDL_TOUCHBUTTONUP OR SDL_TOUCHBUTTONDOWN */
310
Uint32 windowID; /**< The window with mouse focus, if any */
311
SDL_TouchID touchId; /**< The touch device index */
312
Uint8 state; /**< The current button state */
313
Uint8 button; /**< The button changing state */
316
} SDL_TouchButtonEvent;
320
* \brief Multiple Finger Gesture Event (event.mgesture.*)
322
typedef struct SDL_MultiGestureEvent
324
Uint32 type; /**< ::SDL_MULTIGESTURE */
325
Uint32 windowID; /**< The window with mouse focus, if any */
326
SDL_TouchID touchId; /**< The touch device index */
329
float x; //currently 0...1. Change to screen coords?
333
} SDL_MultiGestureEvent;
335
/* (event.dgesture.*) */
336
typedef struct SDL_DollarGestureEvent
338
Uint32 type; /**< ::SDL_DOLLARGESTURE */
339
Uint32 windowID; /**< The window with mouse focus, if any */
340
SDL_TouchID touchId; /**< The touch device index */
341
SDL_GestureID gestureId;
345
//TODO: Enable to give location?
346
float x; //currently 0...1. Change to screen coords?
349
} SDL_DollarGestureEvent;
353
* \brief The "quit requested" event
355
typedef struct SDL_QuitEvent
357
Uint32 type; /**< ::SDL_QUIT */
362
* \brief A user-defined event type (event.user.*)
364
typedef struct SDL_UserEvent
366
Uint32 type; /**< ::SDL_USEREVENT through ::SDL_NUMEVENTS-1 */
367
Uint32 windowID; /**< The associated window if any */
368
int code; /**< User defined event code */
369
void *data1; /**< User defined data pointer */
370
void *data2; /**< User defined data pointer */
375
typedef struct SDL_SysWMmsg SDL_SysWMmsg;
378
* \brief A video driver dependent system event (event.syswm.*)
380
* \note If you want to use this event, you should include SDL_syswm.h.
382
typedef struct SDL_SysWMEvent
384
Uint32 type; /**< ::SDL_SYSWMEVENT */
385
SDL_SysWMmsg *msg; /**< driver dependent data, defined in SDL_syswm.h */
388
#ifndef SDL_NO_COMPAT
390
* \addtogroup Compatibility
395
* \name Typedefs for backwards compatibility
398
typedef struct SDL_ActiveEvent
405
typedef struct SDL_ResizeEvent
413
/*@}*//*Compatibility*/
417
* \brief General event structure
419
typedef union SDL_Event
421
Uint32 type; /**< Event type, shared with all events */
422
SDL_WindowEvent window; /**< Window event data */
423
SDL_KeyboardEvent key; /**< Keyboard event data */
424
SDL_TextEditingEvent edit; /**< Text editing event data */
425
SDL_TextInputEvent text; /**< Text input event data */
426
SDL_MouseMotionEvent motion; /**< Mouse motion event data */
427
SDL_MouseButtonEvent button; /**< Mouse button event data */
428
SDL_MouseWheelEvent wheel; /**< Mouse wheel event data */
429
SDL_JoyAxisEvent jaxis; /**< Joystick axis event data */
430
SDL_JoyBallEvent jball; /**< Joystick ball event data */
431
SDL_JoyHatEvent jhat; /**< Joystick hat event data */
432
SDL_JoyButtonEvent jbutton; /**< Joystick button event data */
433
SDL_QuitEvent quit; /**< Quit request event data */
434
SDL_UserEvent user; /**< Custom event data */
435
SDL_SysWMEvent syswm; /**< System dependent window event data */
436
SDL_TouchFingerEvent tfinger; /**< Touch finger event data */
437
SDL_TouchButtonEvent tbutton; /**< Touch button event data */
438
SDL_MultiGestureEvent mgesture; /**< Multi Finger Gesture data */
439
SDL_DollarGestureEvent dgesture; /**< Multi Finger Gesture data */
441
/** Temporarily here for backwards compatibility */
443
#ifndef SDL_NO_COMPAT
444
SDL_ActiveEvent active;
445
SDL_ResizeEvent resize;
451
/* Function prototypes */
454
* Pumps the event loop, gathering events from the input devices.
456
* This function updates the event queue and internal input device state.
458
* This should only be run in the thread that sets the video mode.
460
extern DECLSPEC void SDLCALL SDL_PumpEvents(void);
471
* Checks the event queue for messages and optionally returns them.
473
* If \c action is ::SDL_ADDEVENT, up to \c numevents events will be added to
474
* the back of the event queue.
476
* If \c action is ::SDL_PEEKEVENT, up to \c numevents events at the front
477
* of the event queue, within the specified minimum and maximum type,
478
* will be returned and will not be removed from the queue.
480
* If \c action is ::SDL_GETEVENT, up to \c numevents events at the front
481
* of the event queue, within the specified minimum and maximum type,
482
* will be returned and will be removed from the queue.
484
* \return The number of events actually stored, or -1 if there was an error.
486
* This function is thread-safe.
488
extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents,
489
SDL_eventaction action,
490
Uint32 minType, Uint32 maxType);
494
* Checks to see if certain event types are in the event queue.
496
extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type);
497
extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType);
500
* This function clears events from the event queue
502
extern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type);
503
extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType);
506
* \brief Polls for currently pending events.
508
* \return 1 if there are any pending events, or 0 if there are none available.
510
* \param event If not NULL, the next event is removed from the queue and
511
* stored in that area.
513
extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event);
516
* \brief Waits indefinitely for the next available event.
518
* \return 1, or 0 if there was an error while waiting for events.
520
* \param event If not NULL, the next event is removed from the queue and
521
* stored in that area.
523
extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event);
526
* \brief Waits until the specified timeout (in milliseconds) for the next
529
* \return 1, or 0 if there was an error while waiting for events.
531
* \param event If not NULL, the next event is removed from the queue and
532
* stored in that area.
534
extern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event,
538
* \brief Add an event to the event queue.
540
* \return 1 on success, 0 if the event was filtered, or -1 if the event queue
541
* was full or there was some other error.
543
extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event * event);
545
typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event);
548
* Sets up a filter to process all events before they change internal state and
549
* are posted to the internal event queue.
551
* The filter is protypted as:
553
* int SDL_EventFilter(void *userdata, SDL_Event * event);
556
* If the filter returns 1, then the event will be added to the internal queue.
557
* If it returns 0, then the event will be dropped from the queue, but the
558
* internal state will still be updated. This allows selective filtering of
559
* dynamically arriving events.
561
* \warning Be very careful of what you do in the event filter function, as
562
* it may run in a different thread!
564
* There is one caveat when dealing with the ::SDL_QUITEVENT event type. The
565
* event filter is only called when the window manager desires to close the
566
* application window. If the event filter returns 1, then the window will
567
* be closed, otherwise the window will remain open if possible.
569
* If the quit event is generated by an interrupt signal, it will bypass the
570
* internal queue and be delivered to the application at the next event poll.
572
extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter,
576
* Return the current event filter - can be used to "chain" filters.
577
* If there is no event filter set, this function returns SDL_FALSE.
579
extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter,
583
* Add a function which is called when an event is added to the queue.
585
extern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter,
589
* Remove an event watch function added with SDL_AddEventWatch()
591
extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter,
595
* Run the filter function on the current event queue, removing any
596
* events for which the filter returns 0.
598
extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter,
604
#define SDL_DISABLE 0
608
* This function allows you to set the state of processing certain events.
609
* - If \c state is set to ::SDL_IGNORE, that event will be automatically
610
* dropped from the event queue and will not event be filtered.
611
* - If \c state is set to ::SDL_ENABLE, that event will be processed
613
* - If \c state is set to ::SDL_QUERY, SDL_EventState() will return the
614
* current processing state of the specified event.
616
extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state);
618
#define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY)
621
* This function allocates a set of user-defined events, and returns
622
* the beginning event number for that set of events.
624
* If there aren't enough user-defined events left, this function
627
extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents);
629
/* Ends C function definitions when using C++ */
635
#include "close_code.h"
637
#endif /* _SDL_events_h */
639
/* vi: set ts=4 sw=4 expandtab: */