include/SDL_events.h
author Ryan C. Gordon <icculus@icculus.org>
Thu, 28 May 2015 01:54:52 -0400
changeset 9671 0e1f57b051f4
parent 9619 b94b6d0bff0f
child 9825 dfdb0933d57c
permissions -rw-r--r--
Windows GetBasePath should use GetModuleFileNameExW() and check for overflows.

Apparently you might get strange paths from GetModuleFileName(), such as
short path names or UNC filenames, so this avoids that problem. Since you have
to tapdance with linking different libraries and defining macros depending on
what Windows you plan to target, we dynamically load the API we need, which
works on all versions of Windows (on Win7, it'll load a compatibility wrapper
for the newer API location).

What a mess.

This also now does the right thing if there isn't enough space to store the
path, looping with a larger allocated buffer each try.

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