]> git.xonotic.org Git - xonotic/xonotic.git/blob - misc/builddeps/win64/sdl/include/SDL2/SDL_events.h
Fix macOS SDL2 framework permissions
[xonotic/xonotic.git] / misc / builddeps / win64 / sdl / include / SDL2 / SDL_events.h
1 /*
2   Simple DirectMedia Layer
3   Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
4
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.
8
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:
12
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.
20 */
21
22 /**
23  *  \file SDL_events.h
24  *
25  *  Include file for SDL event handling.
26  */
27
28 #ifndef SDL_events_h_
29 #define SDL_events_h_
30
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"
37 #include "SDL_gamecontroller.h"
38 #include "SDL_quit.h"
39 #include "SDL_gesture.h"
40 #include "SDL_touch.h"
41
42 #include "begin_code.h"
43 /* Set up for C function definitions, even when using C++ */
44 #ifdef __cplusplus
45 extern "C" {
46 #endif
47
48 /* General keyboard/mouse state definitions */
49 #define SDL_RELEASED    0
50 #define SDL_PRESSED 1
51
52 /**
53  * \brief The types of events that can be delivered.
54  */
55 typedef enum
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     /* Display events */
89     SDL_DISPLAYEVENT   = 0x150,  /**< Display state change */
90
91     /* Window events */
92     SDL_WINDOWEVENT    = 0x200, /**< Window state change */
93     SDL_SYSWMEVENT,             /**< System specific event */
94
95     /* Keyboard events */
96     SDL_KEYDOWN        = 0x300, /**< Key pressed */
97     SDL_KEYUP,                  /**< Key released */
98     SDL_TEXTEDITING,            /**< Keyboard text editing (composition) */
99     SDL_TEXTINPUT,              /**< Keyboard text input */
100     SDL_KEYMAPCHANGED,          /**< Keymap changed due to a system event such as an
101                                      input language or keyboard layout change.
102                                 */
103
104     /* Mouse events */
105     SDL_MOUSEMOTION    = 0x400, /**< Mouse moved */
106     SDL_MOUSEBUTTONDOWN,        /**< Mouse button pressed */
107     SDL_MOUSEBUTTONUP,          /**< Mouse button released */
108     SDL_MOUSEWHEEL,             /**< Mouse wheel motion */
109
110     /* Joystick events */
111     SDL_JOYAXISMOTION  = 0x600, /**< Joystick axis motion */
112     SDL_JOYBALLMOTION,          /**< Joystick trackball motion */
113     SDL_JOYHATMOTION,           /**< Joystick hat position change */
114     SDL_JOYBUTTONDOWN,          /**< Joystick button pressed */
115     SDL_JOYBUTTONUP,            /**< Joystick button released */
116     SDL_JOYDEVICEADDED,         /**< A new joystick has been inserted into the system */
117     SDL_JOYDEVICEREMOVED,       /**< An opened joystick has been removed */
118
119     /* Game controller events */
120     SDL_CONTROLLERAXISMOTION  = 0x650, /**< Game controller axis motion */
121     SDL_CONTROLLERBUTTONDOWN,          /**< Game controller button pressed */
122     SDL_CONTROLLERBUTTONUP,            /**< Game controller button released */
123     SDL_CONTROLLERDEVICEADDED,         /**< A new Game controller has been inserted into the system */
124     SDL_CONTROLLERDEVICEREMOVED,       /**< An opened Game controller has been removed */
125     SDL_CONTROLLERDEVICEREMAPPED,      /**< The controller mapping was updated */
126
127     /* Touch events */
128     SDL_FINGERDOWN      = 0x700,
129     SDL_FINGERUP,
130     SDL_FINGERMOTION,
131
132     /* Gesture events */
133     SDL_DOLLARGESTURE   = 0x800,
134     SDL_DOLLARRECORD,
135     SDL_MULTIGESTURE,
136
137     /* Clipboard events */
138     SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard changed */
139
140     /* Drag and drop events */
141     SDL_DROPFILE        = 0x1000, /**< The system requests a file open */
142     SDL_DROPTEXT,                 /**< text/plain drag-and-drop event */
143     SDL_DROPBEGIN,                /**< A new set of drops is beginning (NULL filename) */
144     SDL_DROPCOMPLETE,             /**< Current set of drops is now complete (NULL filename) */
145
146     /* Audio hotplug events */
147     SDL_AUDIODEVICEADDED = 0x1100, /**< A new audio device is available */
148     SDL_AUDIODEVICEREMOVED,        /**< An audio device has been removed. */
149
150     /* Sensor events */
151     SDL_SENSORUPDATE = 0x1200,     /**< A sensor was updated */
152
153     /* Render events */
154     SDL_RENDER_TARGETS_RESET = 0x2000, /**< The render targets have been reset and their contents need to be updated */
155     SDL_RENDER_DEVICE_RESET, /**< The device has been reset and all textures need to be recreated */
156
157     /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use,
158      *  and should be allocated with SDL_RegisterEvents()
159      */
160     SDL_USEREVENT    = 0x8000,
161
162     /**
163      *  This last event is only for bounding internal arrays
164      */
165     SDL_LASTEVENT    = 0xFFFF
166 } SDL_EventType;
167
168 /**
169  *  \brief Fields shared by every event
170  */
171 typedef struct SDL_CommonEvent
172 {
173     Uint32 type;
174     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
175 } SDL_CommonEvent;
176
177 /**
178  *  \brief Display state change event data (event.display.*)
179  */
180 typedef struct SDL_DisplayEvent
181 {
182     Uint32 type;        /**< ::SDL_DISPLAYEVENT */
183     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
184     Uint32 display;     /**< The associated display index */
185     Uint8 event;        /**< ::SDL_DisplayEventID */
186     Uint8 padding1;
187     Uint8 padding2;
188     Uint8 padding3;
189     Sint32 data1;       /**< event dependent data */
190 } SDL_DisplayEvent;
191
192 /**
193  *  \brief Window state change event data (event.window.*)
194  */
195 typedef struct SDL_WindowEvent
196 {
197     Uint32 type;        /**< ::SDL_WINDOWEVENT */
198     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
199     Uint32 windowID;    /**< The associated window */
200     Uint8 event;        /**< ::SDL_WindowEventID */
201     Uint8 padding1;
202     Uint8 padding2;
203     Uint8 padding3;
204     Sint32 data1;       /**< event dependent data */
205     Sint32 data2;       /**< event dependent data */
206 } SDL_WindowEvent;
207
208 /**
209  *  \brief Keyboard button event structure (event.key.*)
210  */
211 typedef struct SDL_KeyboardEvent
212 {
213     Uint32 type;        /**< ::SDL_KEYDOWN or ::SDL_KEYUP */
214     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
215     Uint32 windowID;    /**< The window with keyboard focus, if any */
216     Uint8 state;        /**< ::SDL_PRESSED or ::SDL_RELEASED */
217     Uint8 repeat;       /**< Non-zero if this is a key repeat */
218     Uint8 padding2;
219     Uint8 padding3;
220     SDL_Keysym keysym;  /**< The key that was pressed or released */
221 } SDL_KeyboardEvent;
222
223 #define SDL_TEXTEDITINGEVENT_TEXT_SIZE (32)
224 /**
225  *  \brief Keyboard text editing event structure (event.edit.*)
226  */
227 typedef struct SDL_TextEditingEvent
228 {
229     Uint32 type;                                /**< ::SDL_TEXTEDITING */
230     Uint32 timestamp;                           /**< In milliseconds, populated using SDL_GetTicks() */
231     Uint32 windowID;                            /**< The window with keyboard focus, if any */
232     char text[SDL_TEXTEDITINGEVENT_TEXT_SIZE];  /**< The editing text */
233     Sint32 start;                               /**< The start cursor of selected editing text */
234     Sint32 length;                              /**< The length of selected editing text */
235 } SDL_TextEditingEvent;
236
237
238 #define SDL_TEXTINPUTEVENT_TEXT_SIZE (32)
239 /**
240  *  \brief Keyboard text input event structure (event.text.*)
241  */
242 typedef struct SDL_TextInputEvent
243 {
244     Uint32 type;                              /**< ::SDL_TEXTINPUT */
245     Uint32 timestamp;                         /**< In milliseconds, populated using SDL_GetTicks() */
246     Uint32 windowID;                          /**< The window with keyboard focus, if any */
247     char text[SDL_TEXTINPUTEVENT_TEXT_SIZE];  /**< The input text */
248 } SDL_TextInputEvent;
249
250 /**
251  *  \brief Mouse motion event structure (event.motion.*)
252  */
253 typedef struct SDL_MouseMotionEvent
254 {
255     Uint32 type;        /**< ::SDL_MOUSEMOTION */
256     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
257     Uint32 windowID;    /**< The window with mouse focus, if any */
258     Uint32 which;       /**< The mouse instance id, or SDL_TOUCH_MOUSEID */
259     Uint32 state;       /**< The current button state */
260     Sint32 x;           /**< X coordinate, relative to window */
261     Sint32 y;           /**< Y coordinate, relative to window */
262     Sint32 xrel;        /**< The relative motion in the X direction */
263     Sint32 yrel;        /**< The relative motion in the Y direction */
264 } SDL_MouseMotionEvent;
265
266 /**
267  *  \brief Mouse button event structure (event.button.*)
268  */
269 typedef struct SDL_MouseButtonEvent
270 {
271     Uint32 type;        /**< ::SDL_MOUSEBUTTONDOWN or ::SDL_MOUSEBUTTONUP */
272     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
273     Uint32 windowID;    /**< The window with mouse focus, if any */
274     Uint32 which;       /**< The mouse instance id, or SDL_TOUCH_MOUSEID */
275     Uint8 button;       /**< The mouse button index */
276     Uint8 state;        /**< ::SDL_PRESSED or ::SDL_RELEASED */
277     Uint8 clicks;       /**< 1 for single-click, 2 for double-click, etc. */
278     Uint8 padding1;
279     Sint32 x;           /**< X coordinate, relative to window */
280     Sint32 y;           /**< Y coordinate, relative to window */
281 } SDL_MouseButtonEvent;
282
283 /**
284  *  \brief Mouse wheel event structure (event.wheel.*)
285  */
286 typedef struct SDL_MouseWheelEvent
287 {
288     Uint32 type;        /**< ::SDL_MOUSEWHEEL */
289     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
290     Uint32 windowID;    /**< The window with mouse focus, if any */
291     Uint32 which;       /**< The mouse instance id, or SDL_TOUCH_MOUSEID */
292     Sint32 x;           /**< The amount scrolled horizontally, positive to the right and negative to the left */
293     Sint32 y;           /**< The amount scrolled vertically, positive away from the user and negative toward the user */
294     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 */
295 } SDL_MouseWheelEvent;
296
297 /**
298  *  \brief Joystick axis motion event structure (event.jaxis.*)
299  */
300 typedef struct SDL_JoyAxisEvent
301 {
302     Uint32 type;        /**< ::SDL_JOYAXISMOTION */
303     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
304     SDL_JoystickID which; /**< The joystick instance id */
305     Uint8 axis;         /**< The joystick axis index */
306     Uint8 padding1;
307     Uint8 padding2;
308     Uint8 padding3;
309     Sint16 value;       /**< The axis value (range: -32768 to 32767) */
310     Uint16 padding4;
311 } SDL_JoyAxisEvent;
312
313 /**
314  *  \brief Joystick trackball motion event structure (event.jball.*)
315  */
316 typedef struct SDL_JoyBallEvent
317 {
318     Uint32 type;        /**< ::SDL_JOYBALLMOTION */
319     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
320     SDL_JoystickID which; /**< The joystick instance id */
321     Uint8 ball;         /**< The joystick trackball index */
322     Uint8 padding1;
323     Uint8 padding2;
324     Uint8 padding3;
325     Sint16 xrel;        /**< The relative motion in the X direction */
326     Sint16 yrel;        /**< The relative motion in the Y direction */
327 } SDL_JoyBallEvent;
328
329 /**
330  *  \brief Joystick hat position change event structure (event.jhat.*)
331  */
332 typedef struct SDL_JoyHatEvent
333 {
334     Uint32 type;        /**< ::SDL_JOYHATMOTION */
335     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
336     SDL_JoystickID which; /**< The joystick instance id */
337     Uint8 hat;          /**< The joystick hat index */
338     Uint8 value;        /**< The hat position value.
339                          *   \sa ::SDL_HAT_LEFTUP ::SDL_HAT_UP ::SDL_HAT_RIGHTUP
340                          *   \sa ::SDL_HAT_LEFT ::SDL_HAT_CENTERED ::SDL_HAT_RIGHT
341                          *   \sa ::SDL_HAT_LEFTDOWN ::SDL_HAT_DOWN ::SDL_HAT_RIGHTDOWN
342                          *
343                          *   Note that zero means the POV is centered.
344                          */
345     Uint8 padding1;
346     Uint8 padding2;
347 } SDL_JoyHatEvent;
348
349 /**
350  *  \brief Joystick button event structure (event.jbutton.*)
351  */
352 typedef struct SDL_JoyButtonEvent
353 {
354     Uint32 type;        /**< ::SDL_JOYBUTTONDOWN or ::SDL_JOYBUTTONUP */
355     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
356     SDL_JoystickID which; /**< The joystick instance id */
357     Uint8 button;       /**< The joystick button index */
358     Uint8 state;        /**< ::SDL_PRESSED or ::SDL_RELEASED */
359     Uint8 padding1;
360     Uint8 padding2;
361 } SDL_JoyButtonEvent;
362
363 /**
364  *  \brief Joystick device event structure (event.jdevice.*)
365  */
366 typedef struct SDL_JoyDeviceEvent
367 {
368     Uint32 type;        /**< ::SDL_JOYDEVICEADDED or ::SDL_JOYDEVICEREMOVED */
369     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
370     Sint32 which;       /**< The joystick device index for the ADDED event, instance id for the REMOVED event */
371 } SDL_JoyDeviceEvent;
372
373
374 /**
375  *  \brief Game controller axis motion event structure (event.caxis.*)
376  */
377 typedef struct SDL_ControllerAxisEvent
378 {
379     Uint32 type;        /**< ::SDL_CONTROLLERAXISMOTION */
380     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
381     SDL_JoystickID which; /**< The joystick instance id */
382     Uint8 axis;         /**< The controller axis (SDL_GameControllerAxis) */
383     Uint8 padding1;
384     Uint8 padding2;
385     Uint8 padding3;
386     Sint16 value;       /**< The axis value (range: -32768 to 32767) */
387     Uint16 padding4;
388 } SDL_ControllerAxisEvent;
389
390
391 /**
392  *  \brief Game controller button event structure (event.cbutton.*)
393  */
394 typedef struct SDL_ControllerButtonEvent
395 {
396     Uint32 type;        /**< ::SDL_CONTROLLERBUTTONDOWN or ::SDL_CONTROLLERBUTTONUP */
397     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
398     SDL_JoystickID which; /**< The joystick instance id */
399     Uint8 button;       /**< The controller button (SDL_GameControllerButton) */
400     Uint8 state;        /**< ::SDL_PRESSED or ::SDL_RELEASED */
401     Uint8 padding1;
402     Uint8 padding2;
403 } SDL_ControllerButtonEvent;
404
405
406 /**
407  *  \brief Controller device event structure (event.cdevice.*)
408  */
409 typedef struct SDL_ControllerDeviceEvent
410 {
411     Uint32 type;        /**< ::SDL_CONTROLLERDEVICEADDED, ::SDL_CONTROLLERDEVICEREMOVED, or ::SDL_CONTROLLERDEVICEREMAPPED */
412     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
413     Sint32 which;       /**< The joystick device index for the ADDED event, instance id for the REMOVED or REMAPPED event */
414 } SDL_ControllerDeviceEvent;
415
416 /**
417  *  \brief Audio device event structure (event.adevice.*)
418  */
419 typedef struct SDL_AudioDeviceEvent
420 {
421     Uint32 type;        /**< ::SDL_AUDIODEVICEADDED, or ::SDL_AUDIODEVICEREMOVED */
422     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
423     Uint32 which;       /**< The audio device index for the ADDED event (valid until next SDL_GetNumAudioDevices() call), SDL_AudioDeviceID for the REMOVED event */
424     Uint8 iscapture;    /**< zero if an output device, non-zero if a capture device. */
425     Uint8 padding1;
426     Uint8 padding2;
427     Uint8 padding3;
428 } SDL_AudioDeviceEvent;
429
430
431 /**
432  *  \brief Touch finger event structure (event.tfinger.*)
433  */
434 typedef struct SDL_TouchFingerEvent
435 {
436     Uint32 type;        /**< ::SDL_FINGERMOTION or ::SDL_FINGERDOWN or ::SDL_FINGERUP */
437     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
438     SDL_TouchID touchId; /**< The touch device id */
439     SDL_FingerID fingerId;
440     float x;            /**< Normalized in the range 0...1 */
441     float y;            /**< Normalized in the range 0...1 */
442     float dx;           /**< Normalized in the range -1...1 */
443     float dy;           /**< Normalized in the range -1...1 */
444     float pressure;     /**< Normalized in the range 0...1 */
445 } SDL_TouchFingerEvent;
446
447
448 /**
449  *  \brief Multiple Finger Gesture Event (event.mgesture.*)
450  */
451 typedef struct SDL_MultiGestureEvent
452 {
453     Uint32 type;        /**< ::SDL_MULTIGESTURE */
454     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
455     SDL_TouchID touchId; /**< The touch device id */
456     float dTheta;
457     float dDist;
458     float x;
459     float y;
460     Uint16 numFingers;
461     Uint16 padding;
462 } SDL_MultiGestureEvent;
463
464
465 /**
466  * \brief Dollar Gesture Event (event.dgesture.*)
467  */
468 typedef struct SDL_DollarGestureEvent
469 {
470     Uint32 type;        /**< ::SDL_DOLLARGESTURE or ::SDL_DOLLARRECORD */
471     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
472     SDL_TouchID touchId; /**< The touch device id */
473     SDL_GestureID gestureId;
474     Uint32 numFingers;
475     float error;
476     float x;            /**< Normalized center of gesture */
477     float y;            /**< Normalized center of gesture */
478 } SDL_DollarGestureEvent;
479
480
481 /**
482  *  \brief An event used to request a file open by the system (event.drop.*)
483  *         This event is enabled by default, you can disable it with SDL_EventState().
484  *  \note If this event is enabled, you must free the filename in the event.
485  */
486 typedef struct SDL_DropEvent
487 {
488     Uint32 type;        /**< ::SDL_DROPBEGIN or ::SDL_DROPFILE or ::SDL_DROPTEXT or ::SDL_DROPCOMPLETE */
489     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
490     char *file;         /**< The file name, which should be freed with SDL_free(), is NULL on begin/complete */
491     Uint32 windowID;    /**< The window that was dropped on, if any */
492 } SDL_DropEvent;
493
494
495 /**
496  *  \brief Sensor event structure (event.sensor.*)
497  */
498 typedef struct SDL_SensorEvent
499 {
500     Uint32 type;        /**< ::SDL_SENSORUPDATE */
501     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
502     Sint32 which;       /**< The instance ID of the sensor */
503     float data[6];      /**< Up to 6 values from the sensor - additional values can be queried using SDL_SensorGetData() */
504 } SDL_SensorEvent;
505
506 /**
507  *  \brief The "quit requested" event
508  */
509 typedef struct SDL_QuitEvent
510 {
511     Uint32 type;        /**< ::SDL_QUIT */
512     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
513 } SDL_QuitEvent;
514
515 /**
516  *  \brief OS Specific event
517  */
518 typedef struct SDL_OSEvent
519 {
520     Uint32 type;        /**< ::SDL_QUIT */
521     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
522 } SDL_OSEvent;
523
524 /**
525  *  \brief A user-defined event type (event.user.*)
526  */
527 typedef struct SDL_UserEvent
528 {
529     Uint32 type;        /**< ::SDL_USEREVENT through ::SDL_LASTEVENT-1 */
530     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
531     Uint32 windowID;    /**< The associated window if any */
532     Sint32 code;        /**< User defined event code */
533     void *data1;        /**< User defined data pointer */
534     void *data2;        /**< User defined data pointer */
535 } SDL_UserEvent;
536
537
538 struct SDL_SysWMmsg;
539 typedef struct SDL_SysWMmsg SDL_SysWMmsg;
540
541 /**
542  *  \brief A video driver dependent system event (event.syswm.*)
543  *         This event is disabled by default, you can enable it with SDL_EventState()
544  *
545  *  \note If you want to use this event, you should include SDL_syswm.h.
546  */
547 typedef struct SDL_SysWMEvent
548 {
549     Uint32 type;        /**< ::SDL_SYSWMEVENT */
550     Uint32 timestamp;   /**< In milliseconds, populated using SDL_GetTicks() */
551     SDL_SysWMmsg *msg;  /**< driver dependent data, defined in SDL_syswm.h */
552 } SDL_SysWMEvent;
553
554 /**
555  *  \brief General event structure
556  */
557 typedef union SDL_Event
558 {
559     Uint32 type;                    /**< Event type, shared with all events */
560     SDL_CommonEvent common;         /**< Common event data */
561     SDL_DisplayEvent display;       /**< Window event data */
562     SDL_WindowEvent window;         /**< Window event data */
563     SDL_KeyboardEvent key;          /**< Keyboard event data */
564     SDL_TextEditingEvent edit;      /**< Text editing event data */
565     SDL_TextInputEvent text;        /**< Text input event data */
566     SDL_MouseMotionEvent motion;    /**< Mouse motion event data */
567     SDL_MouseButtonEvent button;    /**< Mouse button event data */
568     SDL_MouseWheelEvent wheel;      /**< Mouse wheel event data */
569     SDL_JoyAxisEvent jaxis;         /**< Joystick axis event data */
570     SDL_JoyBallEvent jball;         /**< Joystick ball event data */
571     SDL_JoyHatEvent jhat;           /**< Joystick hat event data */
572     SDL_JoyButtonEvent jbutton;     /**< Joystick button event data */
573     SDL_JoyDeviceEvent jdevice;     /**< Joystick device change event data */
574     SDL_ControllerAxisEvent caxis;      /**< Game Controller axis event data */
575     SDL_ControllerButtonEvent cbutton;  /**< Game Controller button event data */
576     SDL_ControllerDeviceEvent cdevice;  /**< Game Controller device event data */
577     SDL_AudioDeviceEvent adevice;   /**< Audio device event data */
578     SDL_SensorEvent sensor;         /**< Sensor event data */
579     SDL_QuitEvent quit;             /**< Quit request event data */
580     SDL_UserEvent user;             /**< Custom event data */
581     SDL_SysWMEvent syswm;           /**< System dependent window event data */
582     SDL_TouchFingerEvent tfinger;   /**< Touch finger event data */
583     SDL_MultiGestureEvent mgesture; /**< Gesture event data */
584     SDL_DollarGestureEvent dgesture; /**< Gesture event data */
585     SDL_DropEvent drop;             /**< Drag and drop event data */
586
587     /* This is necessary for ABI compatibility between Visual C++ and GCC
588        Visual C++ will respect the push pack pragma and use 52 bytes for
589        this structure, and GCC will use the alignment of the largest datatype
590        within the union, which is 8 bytes.
591
592        So... we'll add padding to force the size to be 56 bytes for both.
593     */
594     Uint8 padding[56];
595 } SDL_Event;
596
597 /* Make sure we haven't broken binary compatibility */
598 SDL_COMPILE_TIME_ASSERT(SDL_Event, sizeof(SDL_Event) == 56);
599
600
601 /* Function prototypes */
602
603 /**
604  *  Pumps the event loop, gathering events from the input devices.
605  *
606  *  This function updates the event queue and internal input device state.
607  *
608  *  This should only be run in the thread that sets the video mode.
609  */
610 extern DECLSPEC void SDLCALL SDL_PumpEvents(void);
611
612 /* @{ */
613 typedef enum
614 {
615     SDL_ADDEVENT,
616     SDL_PEEKEVENT,
617     SDL_GETEVENT
618 } SDL_eventaction;
619
620 /**
621  *  Checks the event queue for messages and optionally returns them.
622  *
623  *  If \c action is ::SDL_ADDEVENT, up to \c numevents events will be added to
624  *  the back of the event queue.
625  *
626  *  If \c action is ::SDL_PEEKEVENT, up to \c numevents events at the front
627  *  of the event queue, within the specified minimum and maximum type,
628  *  will be returned and will not be removed from the queue.
629  *
630  *  If \c action is ::SDL_GETEVENT, up to \c numevents events at the front
631  *  of the event queue, within the specified minimum and maximum type,
632  *  will be returned and will be removed from the queue.
633  *
634  *  \return The number of events actually stored, or -1 if there was an error.
635  *
636  *  This function is thread-safe.
637  */
638 extern DECLSPEC int SDLCALL SDL_PeepEvents(SDL_Event * events, int numevents,
639                                            SDL_eventaction action,
640                                            Uint32 minType, Uint32 maxType);
641 /* @} */
642
643 /**
644  *  Checks to see if certain event types are in the event queue.
645  */
646 extern DECLSPEC SDL_bool SDLCALL SDL_HasEvent(Uint32 type);
647 extern DECLSPEC SDL_bool SDLCALL SDL_HasEvents(Uint32 minType, Uint32 maxType);
648
649 /**
650  *  This function clears events from the event queue
651  *  This function only affects currently queued events. If you want to make
652  *  sure that all pending OS events are flushed, you can call SDL_PumpEvents()
653  *  on the main thread immediately before the flush call.
654  */
655 extern DECLSPEC void SDLCALL SDL_FlushEvent(Uint32 type);
656 extern DECLSPEC void SDLCALL SDL_FlushEvents(Uint32 minType, Uint32 maxType);
657
658 /**
659  *  \brief Polls for currently pending events.
660  *
661  *  \return 1 if there are any pending events, or 0 if there are none available.
662  *
663  *  \param event If not NULL, the next event is removed from the queue and
664  *               stored in that area.
665  */
666 extern DECLSPEC int SDLCALL SDL_PollEvent(SDL_Event * event);
667
668 /**
669  *  \brief Waits indefinitely for the next available event.
670  *
671  *  \return 1, or 0 if there was an error while waiting for events.
672  *
673  *  \param event If not NULL, the next event is removed from the queue and
674  *               stored in that area.
675  */
676 extern DECLSPEC int SDLCALL SDL_WaitEvent(SDL_Event * event);
677
678 /**
679  *  \brief Waits until the specified timeout (in milliseconds) for the next
680  *         available event.
681  *
682  *  \return 1, or 0 if there was an error while waiting for events.
683  *
684  *  \param event If not NULL, the next event is removed from the queue and
685  *               stored in that area.
686  *  \param timeout The timeout (in milliseconds) to wait for next event.
687  */
688 extern DECLSPEC int SDLCALL SDL_WaitEventTimeout(SDL_Event * event,
689                                                  int timeout);
690
691 /**
692  *  \brief Add an event to the event queue.
693  *
694  *  \return 1 on success, 0 if the event was filtered, or -1 if the event queue
695  *          was full or there was some other error.
696  */
697 extern DECLSPEC int SDLCALL SDL_PushEvent(SDL_Event * event);
698
699 typedef int (SDLCALL * SDL_EventFilter) (void *userdata, SDL_Event * event);
700
701 /**
702  *  Sets up a filter to process all events before they change internal state and
703  *  are posted to the internal event queue.
704  *
705  *  The filter is prototyped as:
706  *  \code
707  *      int SDL_EventFilter(void *userdata, SDL_Event * event);
708  *  \endcode
709  *
710  *  If the filter returns 1, then the event will be added to the internal queue.
711  *  If it returns 0, then the event will be dropped from the queue, but the
712  *  internal state will still be updated.  This allows selective filtering of
713  *  dynamically arriving events.
714  *
715  *  \warning  Be very careful of what you do in the event filter function, as
716  *            it may run in a different thread!
717  *
718  *  There is one caveat when dealing with the ::SDL_QuitEvent event type.  The
719  *  event filter is only called when the window manager desires to close the
720  *  application window.  If the event filter returns 1, then the window will
721  *  be closed, otherwise the window will remain open if possible.
722  *
723  *  If the quit event is generated by an interrupt signal, it will bypass the
724  *  internal queue and be delivered to the application at the next event poll.
725  */
726 extern DECLSPEC void SDLCALL SDL_SetEventFilter(SDL_EventFilter filter,
727                                                 void *userdata);
728
729 /**
730  *  Return the current event filter - can be used to "chain" filters.
731  *  If there is no event filter set, this function returns SDL_FALSE.
732  */
733 extern DECLSPEC SDL_bool SDLCALL SDL_GetEventFilter(SDL_EventFilter * filter,
734                                                     void **userdata);
735
736 /**
737  *  Add a function which is called when an event is added to the queue.
738  */
739 extern DECLSPEC void SDLCALL SDL_AddEventWatch(SDL_EventFilter filter,
740                                                void *userdata);
741
742 /**
743  *  Remove an event watch function added with SDL_AddEventWatch()
744  */
745 extern DECLSPEC void SDLCALL SDL_DelEventWatch(SDL_EventFilter filter,
746                                                void *userdata);
747
748 /**
749  *  Run the filter function on the current event queue, removing any
750  *  events for which the filter returns 0.
751  */
752 extern DECLSPEC void SDLCALL SDL_FilterEvents(SDL_EventFilter filter,
753                                               void *userdata);
754
755 /* @{ */
756 #define SDL_QUERY   -1
757 #define SDL_IGNORE   0
758 #define SDL_DISABLE  0
759 #define SDL_ENABLE   1
760
761 /**
762  *  This function allows you to set the state of processing certain events.
763  *   - If \c state is set to ::SDL_IGNORE, that event will be automatically
764  *     dropped from the event queue and will not be filtered.
765  *   - If \c state is set to ::SDL_ENABLE, that event will be processed
766  *     normally.
767  *   - If \c state is set to ::SDL_QUERY, SDL_EventState() will return the
768  *     current processing state of the specified event.
769  */
770 extern DECLSPEC Uint8 SDLCALL SDL_EventState(Uint32 type, int state);
771 /* @} */
772 #define SDL_GetEventState(type) SDL_EventState(type, SDL_QUERY)
773
774 /**
775  *  This function allocates a set of user-defined events, and returns
776  *  the beginning event number for that set of events.
777  *
778  *  If there aren't enough user-defined events left, this function
779  *  returns (Uint32)-1
780  */
781 extern DECLSPEC Uint32 SDLCALL SDL_RegisterEvents(int numevents);
782
783 /* Ends C function definitions when using C++ */
784 #ifdef __cplusplus
785 }
786 #endif
787 #include "close_code.h"
788
789 #endif /* SDL_events_h_ */
790
791 /* vi: set ts=4 sw=4 expandtab: */