src/SDL12_compat.c
author Ryan C. Gordon <icculus@icculus.org>
Wed, 06 Mar 2019 03:08:45 -0500
changeset 103 685c0014eda1
parent 102 d45dadba9ff2
child 104 f3976d9769ab
permissions -rw-r--r--
Optimize dirty rectangle rendering.

Only push the video surface to a texture immediately when the app does
SDL_Flip() or SDL_UpdateRect(0,0,0,0). If it looks like dirty rectangle
rendering, only push when we're in a PumpEvents that's close to 60Hz, under
the assumption that the app isn't in the middle of rendering if they're
pumping the event queue, and that updates to the texture faster than the
refresh rate aren't seen anyhow.

This lets things that render a little in response to every mouse event, like
TuxPaint, run at reasonable speeds and still look correct.

This probably needs to not hardcode for 60Hz, but get the actual refresh rate
from SDL2.
icculus@9
     1
/*
icculus@9
     2
  Simple DirectMedia Layer
icculus@46
     3
  Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
icculus@9
     4
icculus@9
     5
  This software is provided 'as-is', without any express or implied
icculus@9
     6
  warranty.  In no event will the authors be held liable for any damages
icculus@9
     7
  arising from the use of this software.
icculus@9
     8
icculus@9
     9
  Permission is granted to anyone to use this software for any purpose,
icculus@9
    10
  including commercial applications, and to alter it and redistribute it
icculus@9
    11
  freely, subject to the following restrictions:
icculus@9
    12
icculus@9
    13
  1. The origin of this software must not be misrepresented; you must not
icculus@9
    14
     claim that you wrote the original software. If you use this software
icculus@9
    15
     in a product, an acknowledgment in the product documentation would be
icculus@9
    16
     appreciated but is not required.
icculus@9
    17
  2. Altered source versions must be plainly marked as such, and must not be
icculus@9
    18
     misrepresented as being the original software.
icculus@9
    19
  3. This notice may not be removed or altered from any source distribution.
icculus@9
    20
*/
icculus@9
    21
icculus@9
    22
/* This file contains functions for backwards compatibility with SDL 1.2 */
icculus@9
    23
icculus@49
    24
// !!! FIXME: clean up code conventions
icculus@54
    25
// !!! FIXME: grep for VideoWindow20 places that might care if it's NULL
icculus@49
    26
icculus@31
    27
#include "SDL20_include_wrapper.h"
icculus@9
    28
icculus@9
    29
#if !SDL_VERSION_ATLEAST(2,0,0)
icculus@9
    30
#error You need to compile against SDL 2.0 headers.
icculus@9
    31
#endif
icculus@9
    32
icculus@33
    33
/*
icculus@33
    34
 * We report the library version as 1.2.$(SDL12_COMPAT_VERSION). This number
icculus@33
    35
 *  should be way ahead of what SDL-1.2 Classic would report, so apps can
icculus@33
    36
 *  decide if they're running under the compat layer, if they really care.
icculus@33
    37
 */
icculus@33
    38
#define SDL12_COMPAT_VERSION 50
icculus@33
    39
icculus@11
    40
#include <stdarg.h>
icculus@11
    41
icculus@49
    42
// !!! IMPLEMENT_ME SDL_CDClose
icculus@49
    43
// !!! IMPLEMENT_ME SDL_CDEject
icculus@49
    44
// !!! IMPLEMENT_ME SDL_CDName
icculus@49
    45
// !!! IMPLEMENT_ME SDL_CDNumDrives
icculus@49
    46
// !!! IMPLEMENT_ME SDL_CDOpen
icculus@49
    47
// !!! IMPLEMENT_ME SDL_CDPause
icculus@49
    48
// !!! IMPLEMENT_ME SDL_CDPlay
icculus@49
    49
// !!! IMPLEMENT_ME SDL_CDPlayTracks
icculus@49
    50
// !!! IMPLEMENT_ME SDL_CDResume
icculus@49
    51
// !!! IMPLEMENT_ME SDL_CDStatus
icculus@49
    52
// !!! IMPLEMENT_ME SDL_CDStop
icculus@49
    53
// !!! IMPLEMENT_ME SDL_CreateYUVOverlay
icculus@49
    54
icculus@49
    55
// !!! IMPLEMENT_ME SDL_DisplayFormatAlpha
icculus@49
    56
// !!! IMPLEMENT_ME SDL_DisplayYUVOverlay
icculus@49
    57
// !!! IMPLEMENT_ME SDL_EnableKeyRepeat
icculus@49
    58
// !!! IMPLEMENT_ME SDL_EnableUNICODE
icculus@49
    59
// !!! IMPLEMENT_ME SDL_FreeYUVOverlay
icculus@49
    60
icculus@49
    61
// !!! IMPLEMENT_ME SDL_GL_Lock
icculus@49
    62
// !!! IMPLEMENT_ME SDL_GL_Unlock
icculus@49
    63
// !!! IMPLEMENT_ME SDL_GL_UpdateRects
icculus@49
    64
icculus@9
    65
// !!! IMPLEMENT_ME SDL_GetKeyName
icculus@9
    66
// !!! IMPLEMENT_ME SDL_GetKeyState
icculus@9
    67
// !!! IMPLEMENT_ME SDL_GetModState
icculus@9
    68
// !!! IMPLEMENT_ME SDL_GetRelativeMouseState
icculus@49
    69
icculus@49
    70
// !!! IMPLEMENT_ME SDL_GetVideoSurface
icculus@49
    71
// !!! IMPLEMENT_ME SDL_GetWMInfo
icculus@49
    72
icculus@9
    73
// !!! IMPLEMENT_ME SDL_LockSurface
icculus@49
    74
// !!! IMPLEMENT_ME SDL_LockYUVOverlay
icculus@9
    75
// !!! IMPLEMENT_ME SDL_LowerBlit
icculus@49
    76
icculus@49
    77
// !!! IMPLEMENT_ME SDL_SetAlpha
icculus@9
    78
// !!! IMPLEMENT_ME SDL_SetColorKey
icculus@49
    79
// !!! IMPLEMENT_ME SDL_SetColors
icculus@49
    80
icculus@9
    81
// !!! IMPLEMENT_ME SDL_SetModState
icculus@49
    82
// !!! IMPLEMENT_ME SDL_SetPalette
icculus@49
    83
// !!! IMPLEMENT_ME SDL_SetVideoMode
icculus@9
    84
// !!! IMPLEMENT_ME SDL_SoftStretch
icculus@9
    85
// !!! IMPLEMENT_ME SDL_UnlockSurface
icculus@49
    86
// !!! IMPLEMENT_ME SDL_UnlockYUVOverlay
icculus@49
    87
// !!! IMPLEMENT_ME SDL_UpdateRects
icculus@9
    88
// !!! IMPLEMENT_ME SDL_UpperBlit
icculus@49
    89
icculus@49
    90
// !!! FIXME: should SDL_VideoInit really be a passthrough?
icculus@49
    91
// !!! FIXME: should SDL_VideoQuit really be a passthrough?
icculus@49
    92
icculus@49
    93
// !!! IMPLEMENT_ME SDL_WM_SetIcon
icculus@49
    94
// !!! IMPLEMENT_ME SDL_WM_ToggleFullScreen
icculus@49
    95
icculus@9
    96
// !!! IMPLEMENT_ME X11_KeyToUnicode
icculus@9
    97
icculus@64
    98
#define SDL_BlitSurface SDL_UpperBlit
icculus@64
    99
icculus@54
   100
#if 0
icculus@54
   101
#define FIXME(x) do {} while (0)
icculus@54
   102
#else
icculus@54
   103
#define FIXME(x) \
icculus@54
   104
    do { \
icculus@54
   105
        static SDL_bool seen = SDL_FALSE; \
icculus@54
   106
        if (!seen) { \
icculus@97
   107
            fprintf(stderr, "FIXME: %s (%s, %s:%d)\n", x, __FUNCTION__, __FILE__, __LINE__); \
icculus@54
   108
            seen = SDL_TRUE; \
icculus@54
   109
        } \
icculus@54
   110
    } while (0)
icculus@54
   111
#endif
icculus@54
   112
icculus@9
   113
#define SDL20_SYM(rc,fn,params,args,ret) \
icculus@35
   114
    typedef rc (SDLCALL *SDL20_##fn##_t) params; \
icculus@9
   115
    static SDL20_##fn##_t SDL20_##fn = NULL;
icculus@9
   116
#include "SDL20_syms.h"
icculus@48
   117
icculus@34
   118
/* Things that _should_ be binary compatible pass right through... */
icculus@34
   119
#define SDL20_SYM_PASSTHROUGH(rc,fn,params,args,ret) \
icculus@35
   120
    DECLSPEC rc SDLCALL SDL_##fn params { ret SDL20_##fn args; }
icculus@34
   121
#include "SDL20_syms.h"
icculus@34
   122
icculus@34
   123
icculus@34
   124
/* these are macros (etc) in the SDL headers, so make our own. */
icculus@34
   125
#define SDL20_OutOfMemory() SDL20_Error(SDL_ENOMEM)
icculus@34
   126
#define SDL20_Unsupported() SDL20_Error(SDL_UNSUPPORTED)
icculus@34
   127
#define SDL20_InvalidParamError(param) SDL20_SetError("Parameter '%s' is invalid", (param))
icculus@34
   128
#define SDL20_zero(x) SDL20_memset(&(x), 0, sizeof((x)))
icculus@34
   129
#define SDL20_zerop(x) SDL20_memset((x), 0, sizeof(*(x)))
icculus@34
   130
#define SDL_ReportAssertion SDL20_ReportAssertion
icculus@34
   131
icculus@34
   132
#define SDL12_DEFAULT_REPEAT_DELAY 500
icculus@34
   133
#define SDL12_DEFAULT_REPEAT_INTERVAL 30
icculus@9
   134
icculus@9
   135
#define SDL12_INIT_TIMER       0x00000001
icculus@9
   136
#define SDL12_INIT_AUDIO       0x00000010
icculus@9
   137
#define SDL12_INIT_VIDEO       0x00000020
icculus@9
   138
#define SDL12_INIT_CDROM       0x00000100
icculus@9
   139
#define SDL12_INIT_JOYSTICK    0x00000200
icculus@9
   140
#define SDL12_INIT_NOPARACHUTE 0x00100000
icculus@9
   141
#define SDL12_INIT_EVENTTHREAD 0x01000000
icculus@9
   142
#define SDL12_INIT_EVERYTHING  0x0000FFFF
icculus@9
   143
icculus@100
   144
#define SDL12_LOGPAL 1
icculus@100
   145
#define SDL12_PHYSPAL 2
icculus@100
   146
icculus@73
   147
typedef struct SDL12_Rect
icculus@73
   148
{
icculus@73
   149
    Sint16 x;
icculus@73
   150
    Sint16 y;
icculus@73
   151
    Uint16 w;
icculus@73
   152
    Uint16 h;
icculus@73
   153
} SDL12_Rect;
icculus@73
   154
icculus@15
   155
typedef struct SDL12_Palette
icculus@15
   156
{
icculus@15
   157
    int       ncolors;
icculus@15
   158
    SDL_Color *colors;
icculus@15
   159
} SDL12_Palette;
icculus@15
   160
icculus@15
   161
typedef struct SDL12_PixelFormat
icculus@15
   162
{
icculus@15
   163
    SDL12_Palette *palette;
icculus@15
   164
    Uint8 BitsPerPixel;
icculus@15
   165
    Uint8 BytesPerPixel;
icculus@15
   166
    Uint8 Rloss;
icculus@15
   167
    Uint8 Gloss;
icculus@15
   168
    Uint8 Bloss;
icculus@15
   169
    Uint8 Aloss;
icculus@15
   170
    Uint8 Rshift;
icculus@15
   171
    Uint8 Gshift;
icculus@15
   172
    Uint8 Bshift;
icculus@15
   173
    Uint8 Ashift;
icculus@15
   174
    Uint32 Rmask;
icculus@15
   175
    Uint32 Gmask;
icculus@15
   176
    Uint32 Bmask;
icculus@15
   177
    Uint32 Amask;
icculus@15
   178
    Uint32 colorkey;
icculus@15
   179
    Uint8 alpha;
icculus@15
   180
} SDL12_PixelFormat;
icculus@15
   181
icculus@18
   182
typedef struct SDL12_Surface
icculus@18
   183
{
icculus@18
   184
    Uint32 flags;
icculus@18
   185
    SDL12_PixelFormat *format;
icculus@18
   186
    int w;
icculus@18
   187
    int h;
icculus@18
   188
    Uint16 pitch;
icculus@18
   189
    void *pixels;
icculus@18
   190
    int offset;
icculus@34
   191
    SDL_Surface *surface20; /* the real SDL 1.2 has an opaque pointer to a platform-specific thing here named "hwdata". */
icculus@73
   192
    SDL12_Rect clip_rect;
icculus@18
   193
    Uint32 unused1;
icculus@18
   194
    Uint32 locked;
icculus@18
   195
    void *blitmap;
icculus@18
   196
    unsigned int format_version;
icculus@18
   197
    int refcount;
icculus@18
   198
} SDL12_Surface;
icculus@18
   199
icculus@57
   200
typedef struct SDL12_Overlay
icculus@57
   201
{
icculus@57
   202
    Uint32 format;
icculus@57
   203
    int w;
icculus@57
   204
    int h;
icculus@57
   205
    int planes;
icculus@57
   206
    Uint16 *pitches;
icculus@57
   207
    Uint8 **pixels;
icculus@57
   208
    void *hwfuncs;
icculus@57
   209
    void *hwdata;
icculus@57
   210
    Uint32 hw_overlay :1;
icculus@57
   211
    Uint32 UnusedBits :31;
icculus@57
   212
} SDL12_Overlay;
icculus@57
   213
icculus@9
   214
typedef struct
icculus@9
   215
{
icculus@15
   216
    Uint32 hw_available :1;
icculus@15
   217
    Uint32 wm_available :1;
icculus@15
   218
    Uint32 UnusedBits1  :6;
icculus@15
   219
    Uint32 UnusedBits2  :1;
icculus@15
   220
    Uint32 blit_hw      :1;
icculus@15
   221
    Uint32 blit_hw_CC   :1;
icculus@15
   222
    Uint32 blit_hw_A    :1;
icculus@15
   223
    Uint32 blit_sw      :1;
icculus@15
   224
    Uint32 blit_sw_CC   :1;
icculus@15
   225
    Uint32 blit_sw_A    :1;
icculus@15
   226
    Uint32 blit_fill    :1;
icculus@15
   227
    Uint32 UnusedBits3  :16;
icculus@15
   228
    Uint32 video_mem;
icculus@15
   229
    SDL_PixelFormat *vfmt;
icculus@15
   230
    int current_w;
icculus@15
   231
    int current_h;
icculus@9
   232
} SDL12_VideoInfo;
icculus@9
   233
icculus@9
   234
icculus@15
   235
#define SDL12_HWSURFACE 0x00000001
icculus@15
   236
#define SDL12_ASYNCBLIT 0x00000004
icculus@15
   237
#define SDL12_ANYFORMAT 0x10000000
icculus@15
   238
#define SDL12_HWPALETTE 0x20000000
icculus@15
   239
#define SDL12_DOUBLEBUF 0x40000000
icculus@15
   240
#define SDL12_FULLSCREEN 0x80000000
icculus@15
   241
#define SDL12_OPENGL 0x00000002
icculus@15
   242
#define SDL12_OPENGLBLIT 0x0000000A
icculus@15
   243
#define SDL12_RESIZABLE 0x00000010
icculus@15
   244
#define SDL12_NOFRAME 0x00000020
icculus@15
   245
#define SDL12_HWACCEL 0x00000100
icculus@15
   246
#define SDL12_SRCCOLORKEY 0x00001000
icculus@15
   247
#define SDL12_RLEACCELOK 0x00002000
icculus@15
   248
#define SDL12_RLEACCEL 0x00004000
icculus@15
   249
#define SDL12_SRCALPHA 0x00010000
icculus@15
   250
#define SDL12_PREALLOC 0x01000000
icculus@9
   251
icculus@18
   252
typedef enum
icculus@18
   253
{
icculus@77
   254
    SDLK12_UNKNOWN = 0,
icculus@77
   255
    SDLK12_FIRST = 0,
icculus@77
   256
    SDLK12_BACKSPACE = 8,
icculus@77
   257
    SDLK12_TAB = 9,
icculus@77
   258
    SDLK12_CLEAR = 12,
icculus@77
   259
    SDLK12_RETURN = 13,
icculus@77
   260
    SDLK12_PAUSE = 19,
icculus@77
   261
    SDLK12_ESCAPE = 27,
icculus@77
   262
    SDLK12_SPACE = 32,
icculus@77
   263
    SDLK12_EXCLAIM = 33,
icculus@77
   264
    SDLK12_QUOTEDBL = 34,
icculus@77
   265
    SDLK12_HASH = 35,
icculus@77
   266
    SDLK12_DOLLAR = 36,
icculus@77
   267
    SDLK12_AMPERSAND = 38,
icculus@77
   268
    SDLK12_QUOTE = 39,
icculus@77
   269
    SDLK12_LEFTPAREN = 40,
icculus@77
   270
    SDLK12_RIGHTPAREN = 41,
icculus@77
   271
    SDLK12_ASTERISK = 42,
icculus@77
   272
    SDLK12_PLUS = 43,
icculus@77
   273
    SDLK12_COMMA = 44,
icculus@77
   274
    SDLK12_MINUS = 45,
icculus@77
   275
    SDLK12_PERIOD = 46,
icculus@77
   276
    SDLK12_SLASH = 47,
icculus@77
   277
    SDLK12_0 = 48,
icculus@77
   278
    SDLK12_1 = 49,
icculus@77
   279
    SDLK12_2 = 50,
icculus@77
   280
    SDLK12_3 = 51,
icculus@77
   281
    SDLK12_4 = 52,
icculus@77
   282
    SDLK12_5 = 53,
icculus@77
   283
    SDLK12_6 = 54,
icculus@77
   284
    SDLK12_7 = 55,
icculus@77
   285
    SDLK12_8 = 56,
icculus@77
   286
    SDLK12_9 = 57,
icculus@77
   287
    SDLK12_COLON = 58,
icculus@77
   288
    SDLK12_SEMICOLON = 59,
icculus@77
   289
    SDLK12_LESS = 60,
icculus@77
   290
    SDLK12_EQUALS = 61,
icculus@77
   291
    SDLK12_GREATER = 62,
icculus@77
   292
    SDLK12_QUESTION = 63,
icculus@77
   293
    SDLK12_AT = 64,
icculus@77
   294
    SDLK12_LEFTBRACKET = 91,
icculus@77
   295
    SDLK12_BACKSLASH = 92,
icculus@77
   296
    SDLK12_RIGHTBRACKET = 93,
icculus@77
   297
    SDLK12_CARET = 94,
icculus@77
   298
    SDLK12_UNDERSCORE = 95,
icculus@77
   299
    SDLK12_BACKQUOTE = 96,
icculus@77
   300
    SDLK12_a = 97,
icculus@77
   301
    SDLK12_b = 98,
icculus@77
   302
    SDLK12_c = 99,
icculus@77
   303
    SDLK12_d = 100,
icculus@77
   304
    SDLK12_e = 101,
icculus@77
   305
    SDLK12_f = 102,
icculus@77
   306
    SDLK12_g = 103,
icculus@77
   307
    SDLK12_h = 104,
icculus@77
   308
    SDLK12_i = 105,
icculus@77
   309
    SDLK12_j = 106,
icculus@77
   310
    SDLK12_k = 107,
icculus@77
   311
    SDLK12_l = 108,
icculus@77
   312
    SDLK12_m = 109,
icculus@77
   313
    SDLK12_n = 110,
icculus@77
   314
    SDLK12_o = 111,
icculus@77
   315
    SDLK12_p = 112,
icculus@77
   316
    SDLK12_q = 113,
icculus@77
   317
    SDLK12_r = 114,
icculus@77
   318
    SDLK12_s = 115,
icculus@77
   319
    SDLK12_t = 116,
icculus@77
   320
    SDLK12_u = 117,
icculus@77
   321
    SDLK12_v = 118,
icculus@77
   322
    SDLK12_w = 119,
icculus@77
   323
    SDLK12_x = 120,
icculus@77
   324
    SDLK12_y = 121,
icculus@77
   325
    SDLK12_z = 122,
icculus@77
   326
    SDLK12_DELETE = 127,
icculus@77
   327
    SDLK12_WORLD_0 = 160,
icculus@77
   328
    SDLK12_WORLD_1 = 161,
icculus@77
   329
    SDLK12_WORLD_2 = 162,
icculus@77
   330
    SDLK12_WORLD_3 = 163,
icculus@77
   331
    SDLK12_WORLD_4 = 164,
icculus@77
   332
    SDLK12_WORLD_5 = 165,
icculus@77
   333
    SDLK12_WORLD_6 = 166,
icculus@77
   334
    SDLK12_WORLD_7 = 167,
icculus@77
   335
    SDLK12_WORLD_8 = 168,
icculus@77
   336
    SDLK12_WORLD_9 = 169,
icculus@77
   337
    SDLK12_WORLD_10 = 170,
icculus@77
   338
    SDLK12_WORLD_11 = 171,
icculus@77
   339
    SDLK12_WORLD_12 = 172,
icculus@77
   340
    SDLK12_WORLD_13 = 173,
icculus@77
   341
    SDLK12_WORLD_14 = 174,
icculus@77
   342
    SDLK12_WORLD_15 = 175,
icculus@77
   343
    SDLK12_WORLD_16 = 176,
icculus@77
   344
    SDLK12_WORLD_17 = 177,
icculus@77
   345
    SDLK12_WORLD_18 = 178,
icculus@77
   346
    SDLK12_WORLD_19 = 179,
icculus@77
   347
    SDLK12_WORLD_20 = 180,
icculus@77
   348
    SDLK12_WORLD_21 = 181,
icculus@77
   349
    SDLK12_WORLD_22 = 182,
icculus@77
   350
    SDLK12_WORLD_23 = 183,
icculus@77
   351
    SDLK12_WORLD_24 = 184,
icculus@77
   352
    SDLK12_WORLD_25 = 185,
icculus@77
   353
    SDLK12_WORLD_26 = 186,
icculus@77
   354
    SDLK12_WORLD_27 = 187,
icculus@77
   355
    SDLK12_WORLD_28 = 188,
icculus@77
   356
    SDLK12_WORLD_29 = 189,
icculus@77
   357
    SDLK12_WORLD_30 = 190,
icculus@77
   358
    SDLK12_WORLD_31 = 191,
icculus@77
   359
    SDLK12_WORLD_32 = 192,
icculus@77
   360
    SDLK12_WORLD_33 = 193,
icculus@77
   361
    SDLK12_WORLD_34 = 194,
icculus@77
   362
    SDLK12_WORLD_35 = 195,
icculus@77
   363
    SDLK12_WORLD_36 = 196,
icculus@77
   364
    SDLK12_WORLD_37 = 197,
icculus@77
   365
    SDLK12_WORLD_38 = 198,
icculus@77
   366
    SDLK12_WORLD_39 = 199,
icculus@77
   367
    SDLK12_WORLD_40 = 200,
icculus@77
   368
    SDLK12_WORLD_41 = 201,
icculus@77
   369
    SDLK12_WORLD_42 = 202,
icculus@77
   370
    SDLK12_WORLD_43 = 203,
icculus@77
   371
    SDLK12_WORLD_44 = 204,
icculus@77
   372
    SDLK12_WORLD_45 = 205,
icculus@77
   373
    SDLK12_WORLD_46 = 206,
icculus@77
   374
    SDLK12_WORLD_47 = 207,
icculus@77
   375
    SDLK12_WORLD_48 = 208,
icculus@77
   376
    SDLK12_WORLD_49 = 209,
icculus@77
   377
    SDLK12_WORLD_50 = 210,
icculus@77
   378
    SDLK12_WORLD_51 = 211,
icculus@77
   379
    SDLK12_WORLD_52 = 212,
icculus@77
   380
    SDLK12_WORLD_53 = 213,
icculus@77
   381
    SDLK12_WORLD_54 = 214,
icculus@77
   382
    SDLK12_WORLD_55 = 215,
icculus@77
   383
    SDLK12_WORLD_56 = 216,
icculus@77
   384
    SDLK12_WORLD_57 = 217,
icculus@77
   385
    SDLK12_WORLD_58 = 218,
icculus@77
   386
    SDLK12_WORLD_59 = 219,
icculus@77
   387
    SDLK12_WORLD_60 = 220,
icculus@77
   388
    SDLK12_WORLD_61 = 221,
icculus@77
   389
    SDLK12_WORLD_62 = 222,
icculus@77
   390
    SDLK12_WORLD_63 = 223,
icculus@77
   391
    SDLK12_WORLD_64 = 224,
icculus@77
   392
    SDLK12_WORLD_65 = 225,
icculus@77
   393
    SDLK12_WORLD_66 = 226,
icculus@77
   394
    SDLK12_WORLD_67 = 227,
icculus@77
   395
    SDLK12_WORLD_68 = 228,
icculus@77
   396
    SDLK12_WORLD_69 = 229,
icculus@77
   397
    SDLK12_WORLD_70 = 230,
icculus@77
   398
    SDLK12_WORLD_71 = 231,
icculus@77
   399
    SDLK12_WORLD_72 = 232,
icculus@77
   400
    SDLK12_WORLD_73 = 233,
icculus@77
   401
    SDLK12_WORLD_74 = 234,
icculus@77
   402
    SDLK12_WORLD_75 = 235,
icculus@77
   403
    SDLK12_WORLD_76 = 236,
icculus@77
   404
    SDLK12_WORLD_77 = 237,
icculus@77
   405
    SDLK12_WORLD_78 = 238,
icculus@77
   406
    SDLK12_WORLD_79 = 239,
icculus@77
   407
    SDLK12_WORLD_80 = 240,
icculus@77
   408
    SDLK12_WORLD_81 = 241,
icculus@77
   409
    SDLK12_WORLD_82 = 242,
icculus@77
   410
    SDLK12_WORLD_83 = 243,
icculus@77
   411
    SDLK12_WORLD_84 = 244,
icculus@77
   412
    SDLK12_WORLD_85 = 245,
icculus@77
   413
    SDLK12_WORLD_86 = 246,
icculus@77
   414
    SDLK12_WORLD_87 = 247,
icculus@77
   415
    SDLK12_WORLD_88 = 248,
icculus@77
   416
    SDLK12_WORLD_89 = 249,
icculus@77
   417
    SDLK12_WORLD_90 = 250,
icculus@77
   418
    SDLK12_WORLD_91 = 251,
icculus@77
   419
    SDLK12_WORLD_92 = 252,
icculus@77
   420
    SDLK12_WORLD_93 = 253,
icculus@77
   421
    SDLK12_WORLD_94 = 254,
icculus@77
   422
    SDLK12_WORLD_95 = 255,
icculus@77
   423
    SDLK12_KP0 = 256,
icculus@77
   424
    SDLK12_KP1 = 257,
icculus@77
   425
    SDLK12_KP2 = 258,
icculus@77
   426
    SDLK12_KP3 = 259,
icculus@77
   427
    SDLK12_KP4 = 260,
icculus@77
   428
    SDLK12_KP5 = 261,
icculus@77
   429
    SDLK12_KP6 = 262,
icculus@77
   430
    SDLK12_KP7 = 263,
icculus@77
   431
    SDLK12_KP8 = 264,
icculus@77
   432
    SDLK12_KP9 = 265,
icculus@77
   433
    SDLK12_KP_PERIOD = 266,
icculus@77
   434
    SDLK12_KP_DIVIDE = 267,
icculus@77
   435
    SDLK12_KP_MULTIPLY = 268,
icculus@77
   436
    SDLK12_KP_MINUS = 269,
icculus@77
   437
    SDLK12_KP_PLUS = 270,
icculus@77
   438
    SDLK12_KP_ENTER = 271,
icculus@77
   439
    SDLK12_KP_EQUALS = 272,
icculus@77
   440
    SDLK12_UP = 273,
icculus@77
   441
    SDLK12_DOWN = 274,
icculus@77
   442
    SDLK12_RIGHT = 275,
icculus@77
   443
    SDLK12_LEFT = 276,
icculus@77
   444
    SDLK12_INSERT = 277,
icculus@77
   445
    SDLK12_HOME = 278,
icculus@77
   446
    SDLK12_END = 279,
icculus@77
   447
    SDLK12_PAGEUP = 280,
icculus@77
   448
    SDLK12_PAGEDOWN = 281,
icculus@77
   449
    SDLK12_F1 = 282,
icculus@77
   450
    SDLK12_F2 = 283,
icculus@77
   451
    SDLK12_F3 = 284,
icculus@77
   452
    SDLK12_F4 = 285,
icculus@77
   453
    SDLK12_F5 = 286,
icculus@77
   454
    SDLK12_F6 = 287,
icculus@77
   455
    SDLK12_F7 = 288,
icculus@77
   456
    SDLK12_F8 = 289,
icculus@77
   457
    SDLK12_F9 = 290,
icculus@77
   458
    SDLK12_F10 = 291,
icculus@77
   459
    SDLK12_F11 = 292,
icculus@77
   460
    SDLK12_F12 = 293,
icculus@77
   461
    SDLK12_F13 = 294,
icculus@77
   462
    SDLK12_F14 = 295,
icculus@77
   463
    SDLK12_F15 = 296,
icculus@77
   464
    SDLK12_NUMLOCK = 300,
icculus@77
   465
    SDLK12_CAPSLOCK = 301,
icculus@77
   466
    SDLK12_SCROLLOCK = 302,
icculus@77
   467
    SDLK12_RSHIFT = 303,
icculus@77
   468
    SDLK12_LSHIFT = 304,
icculus@77
   469
    SDLK12_RCTRL = 305,
icculus@77
   470
    SDLK12_LCTRL = 306,
icculus@77
   471
    SDLK12_RALT = 307,
icculus@77
   472
    SDLK12_LALT = 308,
icculus@77
   473
    SDLK12_RMETA = 309,
icculus@77
   474
    SDLK12_LMETA = 310,
icculus@77
   475
    SDLK12_LSUPER = 311,
icculus@77
   476
    SDLK12_RSUPER = 312,
icculus@77
   477
    SDLK12_MODE = 313,
icculus@77
   478
    SDLK12_COMPOSE = 314,
icculus@77
   479
    SDLK12_HELP = 315,
icculus@77
   480
    SDLK12_PRINT = 316,
icculus@77
   481
    SDLK12_SYSREQ = 317,
icculus@77
   482
    SDLK12_BREAK = 318,
icculus@77
   483
    SDLK12_MENU = 319,
icculus@77
   484
    SDLK12_POWER = 320,
icculus@77
   485
    SDLK12_EURO = 321,
icculus@77
   486
    SDLK12_UNDO = 322,
icculus@77
   487
    SDLK12_LAST
icculus@77
   488
} SDL12Key;
icculus@77
   489
icculus@77
   490
typedef enum
icculus@77
   491
{
icculus@77
   492
    KMOD12_NONE  = 0x0000,
icculus@77
   493
    KMOD12_LSHIFT = 0x0001,
icculus@77
   494
    KMOD12_RSHIFT = 0x0002,
icculus@77
   495
    KMOD12_LCTRL = 0x0040,
icculus@77
   496
    KMOD12_RCTRL = 0x0080,
icculus@77
   497
    KMOD12_LALT = 0x0100,
icculus@77
   498
    KMOD12_RALT = 0x0200,
icculus@77
   499
    KMOD12_LMETA = 0x0400,
icculus@77
   500
    KMOD12_RMETA = 0x0800,
icculus@77
   501
    KMOD12_NUM = 0x1000,
icculus@77
   502
    KMOD12_CAPS = 0x2000,
icculus@77
   503
    KMOD12_MODE = 0x4000,
icculus@77
   504
    KMOD12_RESERVED = 0x8000
icculus@77
   505
} SDL12Mod;
icculus@77
   506
icculus@77
   507
typedef struct SDL12_keysym
icculus@77
   508
{
icculus@77
   509
    Uint8 scancode;
icculus@77
   510
    SDL12Key sym;
icculus@77
   511
    SDL12Mod mod;
icculus@77
   512
    Uint16 unicode;
icculus@77
   513
} SDL12_keysym;
icculus@77
   514
icculus@77
   515
typedef enum
icculus@77
   516
{
icculus@18
   517
    SDL12_NOEVENT = 0,
icculus@18
   518
    SDL12_ACTIVEEVENT,
icculus@18
   519
    SDL12_KEYDOWN,
icculus@18
   520
    SDL12_KEYUP,
icculus@18
   521
    SDL12_MOUSEMOTION,
icculus@18
   522
    SDL12_MOUSEBUTTONDOWN,
icculus@18
   523
    SDL12_MOUSEBUTTONUP,
icculus@18
   524
    SDL12_JOYAXISMOTION,
icculus@18
   525
    SDL12_JOYBALLMOTION,
icculus@18
   526
    SDL12_JOYHATMOTION,
icculus@18
   527
    SDL12_JOYBUTTONDOWN,
icculus@18
   528
    SDL12_JOYBUTTONUP,
icculus@18
   529
    SDL12_QUIT,
icculus@18
   530
    SDL12_SYSWMEVENT,
icculus@18
   531
    SDL12_EVENT_RESERVEDA,
icculus@18
   532
    SDL12_EVENT_RESERVEDB,
icculus@18
   533
    SDL12_VIDEORESIZE,
icculus@18
   534
    SDL12_VIDEOEXPOSE,
icculus@18
   535
    SDL12_USEREVENT = 24,
icculus@18
   536
    SDL12_NUMEVENTS = 32
icculus@18
   537
} SDL12_EventType;
icculus@18
   538
icculus@31
   539
icculus@31
   540
#define SDL12_APPMOUSEFOCUS (1<<0)
icculus@31
   541
#define SDL12_APPINPUTFOCUS (1<<1)
icculus@31
   542
#define SDL12_APPACTIVE     (1<<2)
icculus@31
   543
icculus@18
   544
typedef struct
icculus@18
   545
{
icculus@18
   546
    Uint8 type;
icculus@18
   547
    Uint8 gain;
icculus@18
   548
    Uint8 state;
icculus@18
   549
} SDL12_ActiveEvent;
icculus@18
   550
icculus@18
   551
typedef struct
icculus@18
   552
{
icculus@18
   553
    Uint8 type;
icculus@18
   554
    Uint8 which;
icculus@18
   555
    Uint8 state;
icculus@77
   556
    SDL12_keysym keysym;
icculus@18
   557
} SDL12_KeyboardEvent;
icculus@18
   558
icculus@18
   559
typedef struct
icculus@18
   560
{
icculus@18
   561
    Uint8 type;
icculus@18
   562
    Uint8 which;
icculus@18
   563
    Uint8 state;
icculus@18
   564
    Uint16 x, y;
icculus@18
   565
    Sint16 xrel;
icculus@18
   566
    Sint16 yrel;
icculus@18
   567
} SDL12_MouseMotionEvent;
icculus@18
   568
icculus@18
   569
typedef struct
icculus@18
   570
{
icculus@18
   571
    Uint8 type;
icculus@18
   572
    Uint8 which;
icculus@18
   573
    Uint8 button;
icculus@18
   574
    Uint8 state;
icculus@18
   575
    Uint16 x, y;
icculus@18
   576
} SDL12_MouseButtonEvent;
icculus@18
   577
icculus@18
   578
typedef struct
icculus@18
   579
{
icculus@18
   580
    Uint8 type;
icculus@18
   581
    Uint8 which;
icculus@18
   582
    Uint8 axis;
icculus@18
   583
    Sint16 value;
icculus@18
   584
} SDL12_JoyAxisEvent;
icculus@18
   585
icculus@18
   586
typedef struct
icculus@18
   587
{
icculus@18
   588
    Uint8 type;
icculus@18
   589
    Uint8 which;
icculus@18
   590
    Uint8 ball;
icculus@18
   591
    Sint16 xrel;
icculus@18
   592
    Sint16 yrel;
icculus@18
   593
} SDL12_JoyBallEvent;
icculus@18
   594
icculus@18
   595
typedef struct
icculus@18
   596
{
icculus@18
   597
    Uint8 type;
icculus@18
   598
    Uint8 which;
icculus@18
   599
    Uint8 hat;
icculus@18
   600
    Uint8 value;
icculus@18
   601
} SDL12_JoyHatEvent;
icculus@18
   602
icculus@18
   603
typedef struct
icculus@18
   604
{
icculus@18
   605
    Uint8 type;
icculus@18
   606
    Uint8 which;
icculus@18
   607
    Uint8 button;
icculus@18
   608
    Uint8 state;
icculus@18
   609
} SDL12_JoyButtonEvent;
icculus@18
   610
icculus@18
   611
typedef struct
icculus@18
   612
{
icculus@18
   613
    Uint8 type;
icculus@18
   614
    int w;
icculus@18
   615
    int h;
icculus@18
   616
} SDL12_ResizeEvent;
icculus@18
   617
icculus@18
   618
typedef struct
icculus@18
   619
{
icculus@18
   620
    Uint8 type;
icculus@18
   621
} SDL12_ExposeEvent;
icculus@18
   622
icculus@18
   623
typedef struct
icculus@18
   624
{
icculus@18
   625
    Uint8 type;
icculus@18
   626
} SDL12_QuitEvent;
icculus@18
   627
icculus@18
   628
typedef struct
icculus@18
   629
{
icculus@18
   630
    Uint8 type;
icculus@18
   631
    int code;
icculus@18
   632
    void *data1;
icculus@18
   633
    void *data2;
icculus@18
   634
} SDL12_UserEvent;
icculus@18
   635
icculus@18
   636
typedef struct
icculus@18
   637
{
icculus@18
   638
    Uint8 type;
icculus@18
   639
    void *msg;
icculus@18
   640
} SDL12_SysWMEvent;
icculus@18
   641
icculus@18
   642
typedef union
icculus@18
   643
{
icculus@18
   644
    Uint8 type;
icculus@18
   645
    SDL12_ActiveEvent active;
icculus@18
   646
    SDL12_KeyboardEvent key;
icculus@18
   647
    SDL12_MouseMotionEvent motion;
icculus@18
   648
    SDL12_MouseButtonEvent button;
icculus@18
   649
    SDL12_JoyAxisEvent jaxis;
icculus@18
   650
    SDL12_JoyBallEvent jball;
icculus@18
   651
    SDL12_JoyHatEvent jhat;
icculus@18
   652
    SDL12_JoyButtonEvent jbutton;
icculus@18
   653
    SDL12_ResizeEvent resize;
icculus@18
   654
    SDL12_ExposeEvent expose;
icculus@18
   655
    SDL12_QuitEvent quit;
icculus@18
   656
    SDL12_UserEvent user;
icculus@18
   657
    SDL12_SysWMEvent syswm;
icculus@18
   658
} SDL12_Event;
icculus@9
   659
icculus@31
   660
typedef int (SDLCALL *SDL12_EventFilter)(const SDL12_Event *event12);
icculus@31
   661
static int EventFilter20to12(void *data, SDL_Event *event20);
icculus@31
   662
icculus@31
   663
typedef Uint32 (SDLCALL *SDL12_TimerCallback)(Uint32 interval);
icculus@31
   664
typedef SDL_TimerCallback SDL12_NewTimerCallback;
icculus@31
   665
icculus@23
   666
typedef struct
icculus@31
   667
{
icculus@73
   668
    SDL12_Rect area;
icculus@23
   669
    Sint16 hot_x;
icculus@23
   670
    Sint16 hot_y;
icculus@23
   671
    Uint8 *data;
icculus@23
   672
    Uint8 *mask;
icculus@23
   673
    Uint8 *save[2];
icculus@23
   674
    SDL_Cursor *wm_cursor;  /* the real SDL 1.2 has an opaque pointer to a platform-specific cursor here. */
icculus@23
   675
} SDL12_Cursor;
icculus@23
   676
icculus@30
   677
typedef enum
icculus@30
   678
{
icculus@30
   679
    SDL12_GL_RED_SIZE,
icculus@30
   680
    SDL12_GL_GREEN_SIZE,
icculus@30
   681
    SDL12_GL_BLUE_SIZE,
icculus@30
   682
    SDL12_GL_ALPHA_SIZE,
icculus@30
   683
    SDL12_GL_BUFFER_SIZE,
icculus@30
   684
    SDL12_GL_DOUBLEBUFFER,
icculus@30
   685
    SDL12_GL_DEPTH_SIZE,
icculus@30
   686
    SDL12_GL_STENCIL_SIZE,
icculus@30
   687
    SDL12_GL_ACCUM_RED_SIZE,
icculus@30
   688
    SDL12_GL_ACCUM_GREEN_SIZE,
icculus@30
   689
    SDL12_GL_ACCUM_BLUE_SIZE,
icculus@30
   690
    SDL12_GL_ACCUM_ALPHA_SIZE,
icculus@30
   691
    SDL12_GL_STEREO,
icculus@30
   692
    SDL12_GL_MULTISAMPLEBUFFERS,
icculus@30
   693
    SDL12_GL_MULTISAMPLESAMPLES,
icculus@30
   694
    SDL12_GL_ACCELERATED_VISUAL,
icculus@30
   695
    SDL12_GL_SWAP_CONTROL,
icculus@30
   696
    SDL12_GL_MAX_ATTRIBUTE
icculus@30
   697
} SDL12_GLattr;
icculus@23
   698
icculus@39
   699
icculus@39
   700
typedef struct
icculus@39
   701
{
icculus@39
   702
    Uint32 format;
icculus@73
   703
    SDL12_Rect *modeslist12;
icculus@73
   704
    SDL12_Rect **modes12;  /* ptrs to each item in modeslist, for SDL_ListModes() */
icculus@39
   705
} VideoModeList;
icculus@39
   706
icculus@82
   707
typedef struct
icculus@82
   708
{
icculus@82
   709
    int device_index;
icculus@82
   710
    SDL_Joystick *joystick;
icculus@82
   711
} JoystickOpenedItem;
icculus@82
   712
icculus@54
   713
// !!! FIXME: go through all of these.
icculus@39
   714
static VideoModeList *VideoModes = NULL;
icculus@39
   715
static int VideoModesCount = 0;
icculus@56
   716
static SDL12_VideoInfo VideoInfo12;
icculus@19
   717
static SDL_Window *VideoWindow20 = NULL;
icculus@56
   718
static SDL_Renderer *VideoRenderer20 = NULL;
icculus@56
   719
static SDL_Texture *VideoTexture20 = NULL;
icculus@56
   720
static SDL12_Surface *VideoSurface12 = NULL;
icculus@103
   721
static Uint32 VideoSurfacePresentTicks = 0;
icculus@103
   722
static Uint32 VideoSurfaceLastPresentTicks = 0;
icculus@56
   723
static SDL_Surface *VideoConvertSurface20 = NULL;
icculus@56
   724
static SDL_GLContext *VideoGLContext20 = NULL;
icculus@16
   725
static char *WindowTitle = NULL;
icculus@16
   726
static char *WindowIconTitle = NULL;
icculus@56
   727
static SDL12_Surface *VideoIcon12;
icculus@16
   728
static int EnabledUnicode = 0;
icculus@16
   729
static int VideoDisplayIndex = 0;
icculus@16
   730
static int CDRomInit = 0;
icculus@18
   731
static SDL12_EventFilter EventFilter12 = NULL;
icculus@56
   732
static SDL12_Cursor *CurrentCursor12 = NULL;
icculus@27
   733
static Uint8 EventStates[SDL12_NUMEVENTS];
icculus@30
   734
static int SwapInterval = 0;
icculus@82
   735
static JoystickOpenedItem JoystickOpenList[16];
icculus@18
   736
icculus@18
   737
// !!! FIXME: need a mutex for the event queue.
icculus@18
   738
#define SDL12_MAXEVENTS 128
icculus@20
   739
typedef struct EventQueueType
icculus@20
   740
{
icculus@20
   741
    SDL12_Event event12;
icculus@20
   742
    struct EventQueueType *next;
icculus@20
   743
} EventQueueType;
icculus@20
   744
icculus@20
   745
static EventQueueType EventQueuePool[SDL12_MAXEVENTS];
icculus@20
   746
static EventQueueType *EventQueueHead = NULL;
icculus@20
   747
static EventQueueType *EventQueueTail = NULL;
icculus@20
   748
static EventQueueType *EventQueueAvailable = NULL;
icculus@9
   749
icculus@33
   750
icculus@9
   751
/* Obviously we can't use SDL_LoadObject() to load SDL2.  :)  */
icculus@9
   752
#if defined(_WINDOWS)
icculus@19
   753
    #define WIN32_LEAN_AND_MEAN 1
icculus@19
   754
    #include <windows.h>
icculus@9
   755
    #define SDL20_LIBNAME "SDL2.dll"
icculus@9
   756
    static HANDLE Loaded_SDL20 = NULL;
icculus@9
   757
    #define LoadSDL20Library() ((Loaded_SDL20 = LoadLibraryA(SDL20_LIBNAME)) != NULL)
icculus@9
   758
    #define LookupSDL20Sym(sym) GetProcAddress(Loaded_SDL20, sym)
icculus@9
   759
    #define CloseSDL20Library() { { if (Loaded_SDL20) { FreeLibrary(Loaded_SDL20); Loaded_SDL20 = NULL; } }
icculus@19
   760
#elif defined(unix) || defined(__APPLE__)
icculus@19
   761
    #include <dlfcn.h>
icculus@9
   762
    #ifdef __APPLE__
icculus@9
   763
    #define SDL20_LIBNAME "libSDL2.dylib"
icculus@9
   764
    #else
icculus@9
   765
    #define SDL20_LIBNAME "libSDL2-2.0.so.0"
icculus@9
   766
    #endif
icculus@9
   767
    static void *Loaded_SDL20 = NULL;
icculus@85
   768
    #define LoadSDL20Library() ((Loaded_SDL20 = dlopen(SDL20_LIBNAME, RTLD_LOCAL|RTLD_NOW)) != NULL)
icculus@9
   769
    #define LookupSDL20Sym(sym) dlsym(Loaded_SDL20, sym)
icculus@9
   770
    #define CloseSDL20Library() { if (Loaded_SDL20) { dlclose(Loaded_SDL20); Loaded_SDL20 = NULL; } }
icculus@9
   771
#else
icculus@9
   772
    #error Please define your platform.
icculus@9
   773
#endif
icculus@9
   774
icculus@9
   775
static void *
icculus@9
   776
LoadSDL20Symbol(const char *fn, int *okay)
icculus@9
   777
{
icculus@9
   778
    void *retval = NULL;
icculus@84
   779
    if (*okay) { /* only bother trying if we haven't previously failed. */
icculus@9
   780
        retval = LookupSDL20Sym(fn);
icculus@84
   781
        if (retval == NULL) {
icculus@84
   782
            /* Flip to 1 to warn but maybe work if nothing calls that function, flip to zero to fail out. */
icculus@84
   783
            #if 0
icculus@84
   784
            fprintf(stderr, "WARNING: LOAD FAILED: %s\n", fn);
icculus@84
   785
            #else
icculus@84
   786
            *okay = 0;
icculus@84
   787
            #endif
icculus@84
   788
        }
icculus@9
   789
    }
icculus@9
   790
    return retval;
icculus@9
   791
}
icculus@9
   792
icculus@9
   793
static void
icculus@9
   794
UnloadSDL20(void)
icculus@9
   795
{
icculus@9
   796
    #define SDL20_SYM(rc,fn,params,args,ret) SDL20_##fn = NULL;
icculus@9
   797
    #include "SDL20_syms.h"
icculus@9
   798
    CloseSDL20Library();
icculus@9
   799
}
icculus@9
   800
icculus@9
   801
static int
icculus@9
   802
LoadSDL20(void)
icculus@9
   803
{
icculus@9
   804
    int okay = 1;
icculus@9
   805
    if (!Loaded_SDL20)
icculus@9
   806
    {
icculus@9
   807
        okay = LoadSDL20Library();
icculus@9
   808
        #define SDL20_SYM(rc,fn,params,args,ret) SDL20_##fn = (SDL20_##fn##_t) LoadSDL20Symbol("SDL_" #fn, &okay);
icculus@9
   809
        #include "SDL20_syms.h"
icculus@9
   810
        if (!okay)
icculus@9
   811
            UnloadSDL20();
icculus@9
   812
    }
icculus@9
   813
    return okay;
icculus@9
   814
}
icculus@9
   815
icculus@35
   816
DECLSPEC const SDL_version * SDLCALL
icculus@35
   817
SDL_Linked_Version(void)
icculus@35
   818
{
icculus@35
   819
    static const SDL_version version = { 1, 2, SDL12_COMPAT_VERSION };
icculus@35
   820
    return &version;
icculus@35
   821
}
icculus@9
   822
icculus@60
   823
DECLSPEC int SDLCALL
icculus@60
   824
SDL_sscanf(const char *text, const char *fmt, ...)
icculus@60
   825
{
icculus@60
   826
    int retval;
icculus@60
   827
    va_list ap;
icculus@60
   828
    va_start(ap, fmt);
icculus@60
   829
    retval = (int) SDL20_sscanf(text, fmt, ap);
icculus@60
   830
    va_end(ap);
icculus@60
   831
    return retval;
icculus@60
   832
}
icculus@60
   833
icculus@60
   834
DECLSPEC int SDLCALL
icculus@60
   835
SDL_snprintf(char *text, size_t maxlen, const char *fmt, ...)
icculus@60
   836
{
icculus@60
   837
    int retval;
icculus@60
   838
    va_list ap;
icculus@60
   839
    va_start(ap, fmt);
icculus@60
   840
    retval = (int) SDL20_vsnprintf(text, maxlen, fmt, ap);
icculus@60
   841
    va_end(ap);
icculus@60
   842
    return retval;
icculus@60
   843
}
icculus@60
   844
icculus@83
   845
DECLSPEC void * SDLCALL
icculus@83
   846
SDL_revcpy(void *dst, const void *src, size_t len)
icculus@83
   847
{
icculus@83
   848
    /* this doesn't reverse the data...I think this was just a memcpy that
icculus@83
   849
       was meant to be CPU-cache friendly if you knew you were working with
icculus@83
   850
       data going backwards in memory, instead of jumping over pages to copy
icculus@83
   851
       from the start...? Whatever, just do a memcpy here. */
icculus@83
   852
    return SDL_memcpy(dst, src, len);
icculus@83
   853
}
icculus@83
   854
icculus@83
   855
icculus@60
   856
DECLSPEC SDL_bool SDLCALL
icculus@60
   857
SDL_HasMMXExt(void)
icculus@60
   858
{
icculus@60
   859
    /* this isn't accurate, but SDL2 doesn't have this for some reason.
icculus@60
   860
        MMXExt is available in all SSE1 machines, except early Athlon chips,
icculus@60
   861
        so we'll just say it's available if they have SSE1. Oh well. */
icculus@60
   862
    return SDL20_HasSSE();
icculus@60
   863
}
icculus@60
   864
icculus@60
   865
DECLSPEC SDL_bool SDLCALL
icculus@60
   866
SDL_Has3DNowExt(void)
icculus@60
   867
{
icculus@60
   868
    FIXME("check this");
icculus@60
   869
    return SDL20_HasSSE();
icculus@60
   870
}
icculus@60
   871
icculus@82
   872
DECLSPEC SDL_Joystick * SDLCALL
icculus@82
   873
SDL_JoystickOpen(int device_index)
icculus@82
   874
{
icculus@82
   875
    int i;
icculus@82
   876
    SDL20_LockJoysticks();
icculus@82
   877
    for (i = 0; i < SDL_arraysize(JoystickOpenList); i++) {
icculus@82
   878
        if (JoystickOpenList[i].joystick == NULL) {
icculus@82
   879
            break;
icculus@82
   880
        }
icculus@82
   881
    }
icculus@82
   882
icculus@82
   883
    if (i == SDL_arraysize(JoystickOpenList)) {
icculus@82
   884
        SDL20_UnlockJoysticks();
icculus@82
   885
        SDL20_SetError("Too many open joysticks");
icculus@82
   886
        return NULL;
icculus@82
   887
    }
icculus@82
   888
icculus@82
   889
    JoystickOpenList[i].joystick = SDL20_JoystickOpen(device_index);
icculus@82
   890
    if (JoystickOpenList[i].joystick) {
icculus@82
   891
        JoystickOpenList[i].device_index = device_index;
icculus@82
   892
    }
icculus@82
   893
icculus@82
   894
    SDL20_UnlockJoysticks();
icculus@82
   895
    return JoystickOpenList[i].joystick;
icculus@82
   896
}
icculus@82
   897
icculus@82
   898
DECLSPEC void SDLCALL
icculus@82
   899
SDL_JoystickClose(SDL_Joystick *joystick)
icculus@82
   900
{
icculus@82
   901
    int i;
icculus@82
   902
    SDL20_LockJoysticks();
icculus@82
   903
    for (i = 0; i < SDL_arraysize(JoystickOpenList); i++) {
icculus@82
   904
        if (JoystickOpenList[i].joystick == joystick) {
icculus@82
   905
            break;
icculus@82
   906
        }
icculus@82
   907
    }
icculus@82
   908
icculus@82
   909
    if (i < SDL_arraysize(JoystickOpenList)) {
icculus@82
   910
        JoystickOpenList[i].joystick = NULL;
icculus@82
   911
    }
icculus@82
   912
icculus@82
   913
    SDL20_UnlockJoysticks();
icculus@82
   914
icculus@82
   915
    SDL20_JoystickClose(joystick);
icculus@82
   916
}
icculus@82
   917
icculus@82
   918
DECLSPEC const char * SDLCALL
icculus@82
   919
SDL_JoystickName(int device_index)
icculus@82
   920
{
icculus@82
   921
    return SDL20_JoystickNameForIndex(device_index);
icculus@82
   922
}
icculus@82
   923
icculus@82
   924
DECLSPEC int SDLCALL
icculus@82
   925
SDL_JoystickIndex(SDL_Joystick *joystick)
icculus@82
   926
{
icculus@82
   927
    int i;
icculus@82
   928
icculus@82
   929
    SDL20_LockJoysticks(); {
icculus@82
   930
        for (i = 0; i < SDL_arraysize(JoystickOpenList); i++) {
icculus@82
   931
            if (JoystickOpenList[i].joystick == joystick) {
icculus@82
   932
                break;
icculus@82
   933
            }
icculus@82
   934
        }
icculus@82
   935
icculus@82
   936
        if (i < SDL_arraysize(JoystickOpenList)) {
icculus@82
   937
            SDL20_UnlockJoysticks();
icculus@82
   938
            return JoystickOpenList[i].device_index;
icculus@82
   939
        }
icculus@82
   940
icculus@82
   941
    }
icculus@82
   942
    SDL20_UnlockJoysticks();
icculus@82
   943
    return SDL20_SetError("Can't find joystick");
icculus@82
   944
}
icculus@82
   945
icculus@91
   946
DECLSPEC int SDLCALL
icculus@91
   947
SDL_JoystickOpened(int device_index)
icculus@60
   948
{
icculus@82
   949
    int retval = 0;
icculus@82
   950
    int i;
icculus@82
   951
    SDL20_LockJoysticks();
icculus@82
   952
    for (i = 0; i < SDL_arraysize(JoystickOpenList); i++) {
icculus@82
   953
        if ((JoystickOpenList[i].joystick) && (JoystickOpenList[i].device_index == device_index)) {
icculus@82
   954
            retval = 1;
icculus@82
   955
            break;
icculus@82
   956
        }
icculus@82
   957
    }
icculus@82
   958
    SDL20_UnlockJoysticks();
icculus@82
   959
    return retval;
icculus@60
   960
}
icculus@60
   961
icculus@9
   962
static int
icculus@9
   963
GetVideoDisplay()
icculus@9
   964
{
icculus@58
   965
    FIXME("cache this value during SDL_Init() so it doesn't change.");
icculus@58
   966
    const char *variable = SDL20_getenv("SDL_VIDEO_FULLSCREEN_DISPLAY");
icculus@9
   967
    if ( !variable ) {
icculus@58
   968
        variable = SDL20_getenv("SDL_VIDEO_FULLSCREEN_HEAD");
icculus@9
   969
    }
icculus@9
   970
    if ( variable ) {
icculus@34
   971
        return SDL20_atoi(variable);
icculus@9
   972
    } else {
icculus@9
   973
        return 0;
icculus@9
   974
    }
icculus@9
   975
}
icculus@9
   976
icculus@39
   977
/* This sets up VideoModes and VideoModesCount. You end up with arrays by pixel
icculus@39
   978
    format, each with a value that 1.2's SDL_ListModes() can return. */
icculus@39
   979
static int
icculus@39
   980
Init12VidModes(void)
icculus@39
   981
{
icculus@39
   982
    const int total = SDL20_GetNumDisplayModes(VideoDisplayIndex);
icculus@39
   983
    VideoModeList *vmode = NULL;
icculus@39
   984
    int num_modes = 0;
icculus@39
   985
    void *ptr = NULL;
icculus@39
   986
    int i, j;
icculus@39
   987
icculus@86
   988
    if (VideoModesCount > 0) {
icculus@86
   989
        return 0;  // already did this.
icculus@86
   990
    }
icculus@86
   991
icculus@39
   992
    SDL_assert(VideoModes == NULL);
icculus@39
   993
icculus@39
   994
    for (i = 0; i < total; ++i) {
icculus@39
   995
        SDL_DisplayMode mode;
icculus@39
   996
icculus@39
   997
        if (SDL20_GetDisplayMode(VideoDisplayIndex, i, &mode) == -1) {
icculus@39
   998
            continue;
icculus@39
   999
        } else if (!mode.w || !mode.h) {
icculus@39
  1000
            SDL_assert(0 && "Can this actually happen?");
icculus@39
  1001
            continue;
icculus@39
  1002
        }
icculus@39
  1003
icculus@39
  1004
        if (!vmode || (mode.format != vmode->format)) {  // SDL20_GetDisplayMode() sorts on bpp first. We know when to change arrays.
icculus@39
  1005
            if (VideoModesCount > 0) {
icculus@73
  1006
                VideoModes[VideoModesCount-1].modes12[num_modes] = NULL;
icculus@39
  1007
            }
icculus@39
  1008
            ptr = (VideoModeList *) SDL20_realloc(VideoModes, sizeof (VideoModeList) * (VideoModesCount+1));
icculus@39
  1009
            if (!ptr) {
icculus@39
  1010
                return SDL20_OutOfMemory();
icculus@39
  1011
            }
icculus@39
  1012
            VideoModes = (VideoModeList *) ptr;
icculus@39
  1013
            vmode = &VideoModes[VideoModesCount];
icculus@39
  1014
            vmode->format = mode.format;
icculus@73
  1015
            vmode->modeslist12 = NULL;
icculus@73
  1016
            vmode->modes12 = NULL;
icculus@39
  1017
            VideoModesCount++;
icculus@39
  1018
            num_modes = 0;
icculus@39
  1019
        }
icculus@39
  1020
icculus@39
  1021
        /* make sure we don't have this one already (with a different refresh rate, etc). */
icculus@39
  1022
        for (j = 0; j < num_modes; j++) {
icculus@73
  1023
            if ((vmode->modeslist12[j].w == mode.w) && (vmode->modeslist12[j].h == mode.h)) {
icculus@39
  1024
                break;
icculus@39
  1025
            }
icculus@39
  1026
        }
icculus@39
  1027
icculus@39
  1028
        if (j < num_modes) {
icculus@39
  1029
            continue;  /* already have this one. */
icculus@39
  1030
        }
icculus@39
  1031
icculus@73
  1032
        FIXME("Make sure mode dimensions fit in 16-bits for SDL12_Rect");
icculus@73
  1033
icculus@73
  1034
        ptr = SDL20_realloc(vmode->modes12, sizeof (SDL12_Rect *) * (num_modes + 2));
icculus@39
  1035
        if (ptr == NULL) {
icculus@39
  1036
            return SDL20_OutOfMemory();
icculus@39
  1037
        }
icculus@73
  1038
        vmode->modes12 = (SDL12_Rect **) ptr;
icculus@73
  1039
icculus@73
  1040
        ptr = SDL20_realloc(vmode->modeslist12, sizeof (SDL12_Rect) * (num_modes + 1));
icculus@39
  1041
        if (ptr == NULL) {
icculus@39
  1042
            return SDL20_OutOfMemory();
icculus@39
  1043
        }
icculus@73
  1044
        vmode->modeslist12 = (SDL12_Rect *) ptr;
icculus@73
  1045
icculus@73
  1046
        vmode->modeslist12[num_modes].x = 0;
icculus@73
  1047
        vmode->modeslist12[num_modes].y = 0;
icculus@73
  1048
        vmode->modeslist12[num_modes].w = mode.w;
icculus@73
  1049
        vmode->modeslist12[num_modes].h = mode.h;
icculus@73
  1050
icculus@73
  1051
        vmode->modes12[num_modes] = &vmode->modeslist12[num_modes];
icculus@39
  1052
icculus@39
  1053
        num_modes++;
icculus@39
  1054
    }
icculus@39
  1055
icculus@39
  1056
    if (VideoModesCount > 0) {
icculus@73
  1057
        VideoModes[VideoModesCount-1].modes12[num_modes] = NULL;
icculus@39
  1058
    }
icculus@39
  1059
icculus@39
  1060
    return 0;
icculus@39
  1061
}
icculus@39
  1062
icculus@39
  1063
static int
icculus@39
  1064
Init12Video(void)
icculus@39
  1065
{
icculus@39
  1066
    int i;
icculus@39
  1067
icculus@39
  1068
    for (i = 0; i < SDL12_MAXEVENTS-1; i++)
icculus@39
  1069
        EventQueuePool[i].next = &EventQueuePool[i+1];
icculus@39
  1070
    EventQueuePool[SDL12_MAXEVENTS-1].next = NULL;
icculus@39
  1071
icculus@39
  1072
    EventQueueHead = EventQueueTail = NULL;
icculus@39
  1073
    EventQueueAvailable = EventQueuePool;
icculus@39
  1074
icculus@39
  1075
    SDL_memset(EventStates, SDL_ENABLE, sizeof (EventStates)); /* on by default */
icculus@39
  1076
    EventStates[SDL12_SYSWMEVENT] = SDL_IGNORE;  /* off by default. */
icculus@39
  1077
icculus@39
  1078
    SDL20_SetEventFilter(EventFilter20to12, NULL);
icculus@39
  1079
icculus@39
  1080
    VideoDisplayIndex = GetVideoDisplay();
icculus@39
  1081
    SwapInterval = 0;
icculus@39
  1082
icculus@39
  1083
    if (Init12VidModes() == -1) {
icculus@39
  1084
        return -1;
icculus@39
  1085
    }
icculus@39
  1086
icculus@39
  1087
    return 0;
icculus@39
  1088
}
icculus@39
  1089
icculus@39
  1090
icculus@37
  1091
DECLSPEC int SDLCALL
icculus@37
  1092
SDL_InitSubSystem(Uint32 sdl12flags)
icculus@9
  1093
{
icculus@54
  1094
    FIXME("there is never a parachute in SDL2, should we catch segfaults ourselves?");
icculus@40
  1095
icculus@54
  1096
    FIXME("support event thread where it makes sense to do so?");
icculus@54
  1097
icculus@75
  1098
    if ( (sdl12flags & SDL12_INIT_EVENTTHREAD) == SDL12_INIT_EVENTTHREAD ) {
icculus@75
  1099
        return SDL20_SetError("OS doesn't support threaded events");
icculus@75
  1100
    }
icculus@40
  1101
icculus@9
  1102
    Uint32 sdl20flags = 0;
icculus@9
  1103
    int rc;
icculus@9
  1104
icculus@9
  1105
    if (!LoadSDL20())
icculus@9
  1106
        return -1;
icculus@9
  1107
icculus@62
  1108
#ifdef __MACOSX__
icculus@62
  1109
    extern void sdl12_compat_macos_init(void);
icculus@62
  1110
    sdl12_compat_macos_init();
icculus@62
  1111
#endif
icculus@62
  1112
icculus@19
  1113
    #define SETFLAG(flag) if (sdl12flags & SDL12_INIT_##flag) sdl20flags |= SDL_INIT_##flag
icculus@9
  1114
    SETFLAG(TIMER);
icculus@9
  1115
    SETFLAG(AUDIO);
icculus@9
  1116
    SETFLAG(VIDEO);
icculus@9
  1117
    SETFLAG(JOYSTICK);
icculus@9
  1118
    SETFLAG(NOPARACHUTE);
icculus@11
  1119
    #undef SETFLAG
icculus@11
  1120
icculus@11
  1121
    // There's no CDROM in 2.0, but we'll just pretend it succeeded.
icculus@11
  1122
    if (sdl12flags & SDL12_INIT_CDROM)
icculus@16
  1123
        CDRomInit = 1;
icculus@11
  1124
icculus@54
  1125
    FIXME("do something about SDL12_INIT_EVENTTHREAD");
icculus@11
  1126
icculus@37
  1127
    rc = SDL20_Init(sdl20flags);
icculus@39
  1128
    if ((rc == 0) && (sdl20flags & SDL_INIT_VIDEO)) {
icculus@39
  1129
        if (Init12Video() == -1) {
icculus@54
  1130
            FIXME("should we deinit other subsystems?");
icculus@54
  1131
            return -1;
icculus@39
  1132
        }
icculus@18
  1133
    }
icculus@18
  1134
icculus@11
  1135
    return rc;
icculus@11
  1136
}
icculus@11
  1137
icculus@35
  1138
DECLSPEC int SDLCALL
icculus@11
  1139
SDL_Init(Uint32 sdl12flags)
icculus@11
  1140
{
icculus@54
  1141
    FIXME("what was different in 1.2?");
icculus@41
  1142
    return SDL_InitSubSystem(sdl12flags);   /* there's no difference betwee Init and InitSubSystem in SDL2. */
icculus@11
  1143
}
icculus@11
  1144
icculus@38
  1145
icculus@38
  1146
static void
icculus@38
  1147
InitFlags12To20(const Uint32 flags12, Uint32 *_flags20, Uint32 *_extraflags)
icculus@11
  1148
{
icculus@38
  1149
    Uint32 flags20 = 0;
icculus@11
  1150
    Uint32 extraflags = 0;
icculus@11
  1151
icculus@38
  1152
    #define SETFLAG(flag) if (flags12 & SDL12_INIT_##flag) flags20 |= SDL_INIT_##flag
icculus@11
  1153
    SETFLAG(TIMER);
icculus@11
  1154
    SETFLAG(AUDIO);
icculus@11
  1155
    SETFLAG(VIDEO);
icculus@11
  1156
    SETFLAG(JOYSTICK);
icculus@11
  1157
    SETFLAG(NOPARACHUTE);
icculus@11
  1158
    #undef SETFLAG
icculus@11
  1159
icculus@38
  1160
    if ((flags12 & SDL12_INIT_CDROM) && (CDRomInit)) {
icculus@11
  1161
        extraflags |= SDL12_INIT_CDROM;
icculus@38
  1162
    }
icculus@11
  1163
icculus@54
  1164
    FIXME("do something about SDL12_INIT_EVENTTHREAD");
icculus@11
  1165
icculus@38
  1166
    *_flags20 = flags20;
icculus@38
  1167
    *_extraflags = extraflags;
icculus@11
  1168
}
icculus@11
  1169
icculus@38
  1170
static Uint32
icculus@38
  1171
InitFlags20to12(const Uint32 flags20)
icculus@11
  1172
{
icculus@38
  1173
    Uint32 flags12 = 0;
icculus@38
  1174
icculus@38
  1175
    #define SETFLAG(flag) if (flags20 & SDL_INIT_##flag) flags12 |= SDL12_INIT_##flag
icculus@11
  1176
    SETFLAG(TIMER);
icculus@11
  1177
    SETFLAG(AUDIO);
icculus@11
  1178
    SETFLAG(VIDEO);
icculus@11
  1179
    SETFLAG(JOYSTICK);
icculus@11
  1180
    SETFLAG(NOPARACHUTE);
icculus@9
  1181
    #undef SETFLAG
icculus@9
  1182
icculus@38
  1183
    return flags12;
icculus@38
  1184
}
icculus@38
  1185
icculus@38
  1186
icculus@38
  1187
DECLSPEC Uint32 SDLCALL
icculus@38
  1188
SDL_WasInit(Uint32 sdl12flags)
icculus@38
  1189
{
icculus@38
  1190
    Uint32 sdl20flags, extraflags;
icculus@38
  1191
    InitFlags12To20(sdl12flags, &sdl20flags, &extraflags);
icculus@38
  1192
icculus@38
  1193
    return InitFlags20to12(SDL20_WasInit(sdl20flags)) | extraflags;
icculus@38
  1194
}
icculus@38
  1195
icculus@39
  1196
static void
icculus@39
  1197
Quit12Video(void)
icculus@39
  1198
{
icculus@39
  1199
    int i;
icculus@39
  1200
icculus@39
  1201
    for (i = 0; i < VideoModesCount; i++) {
icculus@73
  1202
        SDL20_free(VideoModes[i].modeslist12);
icculus@73
  1203
        SDL20_free(VideoModes[i].modes12);
icculus@39
  1204
    }
icculus@39
  1205
    SDL20_free(VideoModes);
icculus@39
  1206
icculus@56
  1207
    SDL20_FreeFormat(VideoInfo12.vfmt);
icculus@56
  1208
    SDL20_zero(VideoInfo12);
icculus@39
  1209
icculus@39
  1210
    EventFilter12 = NULL;
icculus@39
  1211
    EventQueueAvailable = EventQueueHead = EventQueueTail = NULL;
icculus@56
  1212
    CurrentCursor12 = NULL;
icculus@39
  1213
    VideoModes = NULL;
icculus@39
  1214
    VideoModesCount = 0;
icculus@39
  1215
}
icculus@39
  1216
icculus@38
  1217
DECLSPEC void SDLCALL
icculus@38
  1218
SDL_QuitSubSystem(Uint32 sdl12flags)
icculus@38
  1219
{
icculus@38
  1220
    Uint32 sdl20flags, extraflags;
icculus@38
  1221
    InitFlags12To20(sdl12flags, &sdl20flags, &extraflags);
icculus@38
  1222
icculus@38
  1223
    if (extraflags & SDL12_INIT_CDROM) {
icculus@16
  1224
        CDRomInit = 0;
icculus@38
  1225
    }
icculus@16
  1226
icculus@54
  1227
    FIXME("reset a bunch of other global variables too.");
icculus@17
  1228
    if (sdl12flags & SDL12_INIT_VIDEO) {
icculus@39
  1229
        Quit12Video();
icculus@17
  1230
    }
icculus@17
  1231
icculus@54
  1232
    FIXME("do something about SDL12_INIT_EVENTTHREAD");
icculus@11
  1233
    SDL20_QuitSubSystem(sdl20flags);
icculus@9
  1234
icculus@42
  1235
    if ((SDL20_WasInit(0) == 0) && (!CDRomInit)) {
icculus@42
  1236
        SDL20_Quit();
icculus@42
  1237
        UnloadSDL20();
icculus@42
  1238
    }
icculus@9
  1239
}
icculus@9
  1240
icculus@35
  1241
DECLSPEC void SDLCALL
icculus@9
  1242
SDL_Quit(void)
icculus@9
  1243
{
icculus@42
  1244
    SDL_QuitSubSystem(SDL_WasInit(0) | SDL12_INIT_CDROM);
icculus@9
  1245
}
icculus@9
  1246
icculus@35
  1247
DECLSPEC void SDLCALL
icculus@11
  1248
SDL_SetError(const char *fmt, ...)
icculus@11
  1249
{
icculus@34
  1250
    char ch;
icculus@12
  1251
    char *str = NULL;
icculus@34
  1252
    size_t len = 0;
icculus@12
  1253
    va_list ap;
icculus@81
  1254
icculus@81
  1255
    if (!LoadSDL20()) {  /* SDL_SetError gets called before init sometimes. */
icculus@81
  1256
        return;
icculus@81
  1257
    }
icculus@81
  1258
icculus@12
  1259
    va_start(ap, fmt);
icculus@34
  1260
    len = SDL20_vsnprintf(&ch, 1, fmt, ap);
icculus@12
  1261
    va_end(ap);
icculus@34
  1262
icculus@34
  1263
    str = (char *) SDL20_malloc(len + 1);
icculus@12
  1264
    if (!str)
icculus@12
  1265
        SDL20_OutOfMemory();
icculus@12
  1266
    else
icculus@12
  1267
    {
icculus@34
  1268
        va_start(ap, fmt);
icculus@34
  1269
        SDL20_vsnprintf(str, len + 1, fmt, ap);
icculus@34
  1270
        va_end(ap);
icculus@12
  1271
        SDL20_SetError("%s", str);
icculus@34
  1272
        SDL20_free(str);
icculus@12
  1273
    }
icculus@11
  1274
}
icculus@9
  1275
icculus@35
  1276
DECLSPEC const char * SDLCALL
icculus@9
  1277
SDL_GetError(void)
icculus@9
  1278
{
icculus@60
  1279
    if (SDL20_GetError == NULL)
icculus@9
  1280
    {
icculus@60
  1281
        static const char noload_errstr[] = "The SDL 2.0 library that the 1.2 compatibility layer needs isn't loaded";
icculus@9
  1282
        return noload_errstr;
icculus@9
  1283
    }
icculus@9
  1284
    return SDL20_GetError();
icculus@9
  1285
}
icculus@9
  1286
icculus@9
  1287
icculus@9
  1288
static const char *
icculus@9
  1289
GetDriverName(const char *name, char *namebuf, int maxlen)
icculus@9
  1290
{
icculus@9
  1291
    if (name) {
icculus@9
  1292
        if (namebuf) {
icculus@9
  1293
            SDL20_strlcpy(namebuf, name, maxlen);
icculus@9
  1294
            return namebuf;
icculus@9
  1295
        } else {
icculus@9
  1296
            return name;
icculus@9
  1297
        }
icculus@9
  1298
    }
icculus@9
  1299
    return NULL;
icculus@9
  1300
}
icculus@9
  1301
icculus@35
  1302
DECLSPEC const char * SDLCALL
icculus@9
  1303
SDL_AudioDriverName(char *namebuf, int maxlen)
icculus@9
  1304
{
icculus@9
  1305
    return GetDriverName(SDL20_GetCurrentAudioDriver(), namebuf, maxlen);
icculus@9
  1306
}
icculus@9
  1307
icculus@35
  1308
DECLSPEC const char * SDLCALL
icculus@9
  1309
SDL_VideoDriverName(char *namebuf, int maxlen)
icculus@9
  1310
{
icculus@9
  1311
    return GetDriverName(SDL20_GetCurrentVideoDriver(), namebuf, maxlen);
icculus@9
  1312
}
icculus@9
  1313
icculus@101
  1314
icculus@35
  1315
DECLSPEC int SDLCALL
icculus@31
  1316
SDL_PollEvent(SDL12_Event *event12)
icculus@31
  1317
{
icculus@31
  1318
    EventQueueType *next;
icculus@31
  1319
icculus@96
  1320
    SDL_PumpEvents();  /* this will run our filter and build our 1.2 queue. */
icculus@31
  1321
icculus@99
  1322
    if (EventQueueHead == NULL) {
icculus@31
  1323
        return 0;  /* no events at the moment. */
icculus@99
  1324
    }
icculus@31
  1325
icculus@31
  1326
    SDL_memcpy(event12, &EventQueueHead->event12, sizeof (SDL12_Event));
icculus@31
  1327
    next = EventQueueHead->next;
icculus@31
  1328
    EventQueueHead->next = EventQueueAvailable;
icculus@31
  1329
    EventQueueAvailable = EventQueueHead;
icculus@31
  1330
    EventQueueHead = next;
icculus@78
  1331
    if (!next) {
icculus@78
  1332
        EventQueueTail = NULL;
icculus@78
  1333
    }
icculus@75
  1334
icculus@31
  1335
    return 1;
icculus@31
  1336
}
icculus@31
  1337
icculus@35
  1338
DECLSPEC int SDLCALL
icculus@31
  1339
SDL_PushEvent(SDL12_Event *event12)
icculus@31
  1340
{
icculus@31
  1341
    EventQueueType *item = EventQueueAvailable;
icculus@99
  1342
    if (item == NULL) {
icculus@31
  1343
        return -1;  /* no space available at the moment. */
icculus@99
  1344
    }
icculus@31
  1345
icculus@31
  1346
    EventQueueAvailable = item->next;
icculus@99
  1347
    if (EventQueueTail) {
icculus@31
  1348
        EventQueueTail->next = item;
icculus@99
  1349
        EventQueueTail = item;
icculus@99
  1350
    } else {
icculus@31
  1351
        EventQueueHead = EventQueueTail = item;
icculus@99
  1352
    }
icculus@31
  1353
    item->next = NULL;
icculus@31
  1354
icculus@31
  1355
    SDL_memcpy(&item->event12, event12, sizeof (SDL12_Event));
icculus@99
  1356
icculus@31
  1357
    return 0;
icculus@31
  1358
}
icculus@31
  1359
icculus@35
  1360
DECLSPEC int SDLCALL
icculus@31
  1361
SDL_PeepEvents(SDL12_Event *events12, int numevents, SDL_eventaction action, Uint32 mask)
icculus@31
  1362
{
icculus@31
  1363
    if (action == SDL_ADDEVENT)
icculus@31
  1364
    {
icculus@31
  1365
        int i;
icculus@31
  1366
        for (i = 0; i < numevents; i++)
icculus@31
  1367
        {
icculus@31
  1368
            if (SDL_PushEvent(&events12[i]) == -1)
icculus@31
  1369
                break;  /* out of space for more events. */
icculus@31
  1370
        }
icculus@31
  1371
        return i;
icculus@31
  1372
    }
icculus@31
  1373
    else if ((action == SDL_PEEKEVENT) || (action == SDL_GETEVENT))
icculus@31
  1374
    {
icculus@31
  1375
        const SDL_bool isGet = (action == SDL_GETEVENT);
icculus@31
  1376
        EventQueueType *prev = NULL;
icculus@31
  1377
        EventQueueType *item = EventQueueHead;
icculus@31
  1378
        EventQueueType *next = NULL;
icculus@31
  1379
        int chosen = 0;
icculus@31
  1380
        while (chosen < numevents)
icculus@31
  1381
        {
icculus@31
  1382
            EventQueueType *nextPrev = item;
icculus@31
  1383
            if (!item)
icculus@31
  1384
                break;  /* no more events at the moment. */
icculus@31
  1385
icculus@31
  1386
            next = item->next;  /* copy, since we might overwrite item->next */
icculus@31
  1387
icculus@31
  1388
            if (mask & (1<<item->event12.type))
icculus@31
  1389
            {
icculus@31
  1390
                SDL_memcpy(&events12[chosen++], &item->event12, sizeof (SDL12_Event));
icculus@31
  1391
                if (isGet)  /* remove from list? */
icculus@31
  1392
                {
icculus@31
  1393
                    if (prev != NULL)
icculus@31
  1394
                        prev->next = next;
icculus@31
  1395
                    if (item == EventQueueHead)
icculus@31
  1396
                        EventQueueHead = next;
icculus@31
  1397
                    if (item == EventQueueTail)
icculus@31
  1398
                        EventQueueTail = prev;
icculus@31
  1399
icculus@31
  1400
                    /* put it back in the free pool. */
icculus@31
  1401
                    item->next = EventQueueAvailable;
icculus@31
  1402
                    EventQueueAvailable = item;
icculus@31
  1403
                    nextPrev = prev;  /* previous item doesn't change. */
icculus@31
  1404
                }
icculus@31
  1405
            }
icculus@31
  1406
icculus@31
  1407
            item = next;
icculus@31
  1408
            prev = nextPrev;
icculus@31
  1409
        }
icculus@31
  1410
        return chosen;
icculus@31
  1411
    }
icculus@31
  1412
icculus@31
  1413
    return 0;
icculus@31
  1414
}
icculus@31
  1415
icculus@35
  1416
DECLSPEC int SDLCALL
icculus@31
  1417
SDL_WaitEvent(SDL12_Event *event12)
icculus@31
  1418
{
icculus@54
  1419
    FIXME("In 1.2, this only fails (-1) if you haven't SDL_Init()'d.");
icculus@31
  1420
    while (!SDL_PollEvent(event12))
icculus@51
  1421
        SDL20_Delay(10);
icculus@31
  1422
    return 1;
icculus@31
  1423
}
icculus@31
  1424
icculus@32
  1425
static SDL_bool
icculus@32
  1426
PushEventIfNotFiltered(SDL12_Event *event12)
icculus@32
  1427
{
icculus@32
  1428
    if (event12->type != SDL12_NOEVENT)
icculus@32
  1429
    {
icculus@32
  1430
        if (EventStates[event12->type] != SDL_IGNORE)
icculus@32
  1431
        {
icculus@32
  1432
            if ((!EventFilter12) || (EventFilter12(event12)))
icculus@32
  1433
                return (SDL_PushEvent(event12) == 0);
icculus@32
  1434
        }
icculus@32
  1435
    }
icculus@32
  1436
    return SDL_FALSE;
icculus@32
  1437
}
icculus@32
  1438
icculus@35
  1439
DECLSPEC Uint8 SDLCALL
icculus@31
  1440
SDL_EventState(Uint8 type, int state)
icculus@31
  1441
{
icculus@31
  1442
    /* the values of "state" match between 1.2 and 2.0 */
icculus@31
  1443
    const Uint8 retval = EventStates[type];
icculus@31
  1444
    SDL12_Event e;
icculus@31
  1445
icculus@31
  1446
    if (state != SDL_QUERY)
icculus@31
  1447
        EventStates[type] = state;
icculus@31
  1448
    if (state == SDL_IGNORE)  /* drop existing events of this type. */
icculus@31
  1449
        while (SDL_PeepEvents(&e, 1, SDL_GETEVENT, (1<<type))) {}
icculus@31
  1450
icculus@31
  1451
    return retval;
icculus@31
  1452
}
icculus@31
  1453
icculus@35
  1454
DECLSPEC Uint8 SDLCALL
icculus@35
  1455
SDL_GetMouseState(int *x, int *y)
icculus@35
  1456
{
icculus@35
  1457
    const Uint32 state20 = SDL20_GetMouseState(x, y);
icculus@35
  1458
    Uint8 retval = (state20 & 0x7);  /* left, right, and middle will match. */
icculus@35
  1459
icculus@35
  1460
    /* the X[12] buttons are different in 1.2; mousewheel was in the way. */
icculus@35
  1461
    if (state20 & SDL_BUTTON(SDL_BUTTON_X1))
icculus@35
  1462
        retval |= (1<<5);
icculus@35
  1463
    if (state20 & SDL_BUTTON(SDL_BUTTON_X2))
icculus@35
  1464
        retval |= (1<<6);
icculus@35
  1465
icculus@35
  1466
    return retval;
icculus@35
  1467
}
icculus@35
  1468
icculus@77
  1469
DECLSPEC char * SDLCALL
icculus@77
  1470
SDL_GetKeyName(SDL12Key key)
icculus@77
  1471
{
icculus@77
  1472
    switch (key) {
icculus@77
  1473
        #define CASESDLK12TONAME(k, n) case k: return (char *) n
icculus@77
  1474
	    CASESDLK12TONAME(SDLK12_BACKSPACE, "backspace");
icculus@77
  1475
	    CASESDLK12TONAME(SDLK12_TAB, "tab");
icculus@77
  1476
	    CASESDLK12TONAME(SDLK12_CLEAR, "clear");
icculus@77
  1477
	    CASESDLK12TONAME(SDLK12_RETURN, "return");
icculus@77
  1478
	    CASESDLK12TONAME(SDLK12_PAUSE, "pause");
icculus@77
  1479
	    CASESDLK12TONAME(SDLK12_ESCAPE, "escape");
icculus@77
  1480
	    CASESDLK12TONAME(SDLK12_SPACE, "space");
icculus@77
  1481
	    CASESDLK12TONAME(SDLK12_EXCLAIM, "!");
icculus@77
  1482
	    CASESDLK12TONAME(SDLK12_QUOTEDBL, "\"");
icculus@77
  1483
	    CASESDLK12TONAME(SDLK12_HASH, "#");
icculus@77
  1484
	    CASESDLK12TONAME(SDLK12_DOLLAR, "$");
icculus@77
  1485
	    CASESDLK12TONAME(SDLK12_AMPERSAND, "&");
icculus@77
  1486
	    CASESDLK12TONAME(SDLK12_QUOTE, "'");
icculus@77
  1487
	    CASESDLK12TONAME(SDLK12_LEFTPAREN, "(");
icculus@77
  1488
	    CASESDLK12TONAME(SDLK12_RIGHTPAREN, ")");
icculus@77
  1489
	    CASESDLK12TONAME(SDLK12_ASTERISK, "*");
icculus@77
  1490
	    CASESDLK12TONAME(SDLK12_PLUS, "+");
icculus@77
  1491
	    CASESDLK12TONAME(SDLK12_COMMA, ",");
icculus@77
  1492
	    CASESDLK12TONAME(SDLK12_MINUS, "-");
icculus@77
  1493
	    CASESDLK12TONAME(SDLK12_PERIOD, ".");
icculus@77
  1494
	    CASESDLK12TONAME(SDLK12_SLASH, "/");
icculus@77
  1495
	    CASESDLK12TONAME(SDLK12_0, "0");
icculus@77
  1496
	    CASESDLK12TONAME(SDLK12_1, "1");
icculus@77
  1497
	    CASESDLK12TONAME(SDLK12_2, "2");
icculus@77
  1498
	    CASESDLK12TONAME(SDLK12_3, "3");
icculus@77
  1499
	    CASESDLK12TONAME(SDLK12_4, "4");
icculus@77
  1500
	    CASESDLK12TONAME(SDLK12_5, "5");
icculus@77
  1501
	    CASESDLK12TONAME(SDLK12_6, "6");
icculus@77
  1502
	    CASESDLK12TONAME(SDLK12_7, "7");
icculus@77
  1503
	    CASESDLK12TONAME(SDLK12_8, "8");
icculus@77
  1504
	    CASESDLK12TONAME(SDLK12_9, "9");
icculus@77
  1505
	    CASESDLK12TONAME(SDLK12_COLON, ":");
icculus@77
  1506
	    CASESDLK12TONAME(SDLK12_SEMICOLON, ");");
icculus@77
  1507
	    CASESDLK12TONAME(SDLK12_LESS, "<");
icculus@77
  1508
	    CASESDLK12TONAME(SDLK12_EQUALS, "=");
icculus@77
  1509
	    CASESDLK12TONAME(SDLK12_GREATER, ">");
icculus@77
  1510
	    CASESDLK12TONAME(SDLK12_QUESTION, "?");
icculus@77
  1511
	    CASESDLK12TONAME(SDLK12_AT, "@");
icculus@77
  1512
	    CASESDLK12TONAME(SDLK12_LEFTBRACKET, "[");
icculus@77
  1513
	    CASESDLK12TONAME(SDLK12_BACKSLASH, "\\");
icculus@77
  1514
	    CASESDLK12TONAME(SDLK12_RIGHTBRACKET, "]");
icculus@77
  1515
	    CASESDLK12TONAME(SDLK12_CARET, "^");
icculus@77
  1516
	    CASESDLK12TONAME(SDLK12_UNDERSCORE, "_");
icculus@77
  1517
	    CASESDLK12TONAME(SDLK12_BACKQUOTE, "`");
icculus@77
  1518
	    CASESDLK12TONAME(SDLK12_a, "a");
icculus@77
  1519
	    CASESDLK12TONAME(SDLK12_b, "b");
icculus@77
  1520
	    CASESDLK12TONAME(SDLK12_c, "c");
icculus@77
  1521
	    CASESDLK12TONAME(SDLK12_d, "d");
icculus@77
  1522
	    CASESDLK12TONAME(SDLK12_e, "e");
icculus@77
  1523
	    CASESDLK12TONAME(SDLK12_f, "f");
icculus@77
  1524
	    CASESDLK12TONAME(SDLK12_g, "g");
icculus@77
  1525
	    CASESDLK12TONAME(SDLK12_h, "h");
icculus@77
  1526
	    CASESDLK12TONAME(SDLK12_i, "i");
icculus@77
  1527
	    CASESDLK12TONAME(SDLK12_j, "j");
icculus@77
  1528
	    CASESDLK12TONAME(SDLK12_k, "k");
icculus@77
  1529
	    CASESDLK12TONAME(SDLK12_l, "l");
icculus@77
  1530
	    CASESDLK12TONAME(SDLK12_m, "m");
icculus@77
  1531
	    CASESDLK12TONAME(SDLK12_n, "n");
icculus@77
  1532
	    CASESDLK12TONAME(SDLK12_o, "o");
icculus@77
  1533
	    CASESDLK12TONAME(SDLK12_p, "p");
icculus@77
  1534
	    CASESDLK12TONAME(SDLK12_q, "q");
icculus@77
  1535
	    CASESDLK12TONAME(SDLK12_r, "r");
icculus@77
  1536
	    CASESDLK12TONAME(SDLK12_s, "s");
icculus@77
  1537
	    CASESDLK12TONAME(SDLK12_t, "t");
icculus@77
  1538
	    CASESDLK12TONAME(SDLK12_u, "u");
icculus@77
  1539
	    CASESDLK12TONAME(SDLK12_v, "v");
icculus@77
  1540
	    CASESDLK12TONAME(SDLK12_w, "w");
icculus@77
  1541
	    CASESDLK12TONAME(SDLK12_x, "x");
icculus@77
  1542
	    CASESDLK12TONAME(SDLK12_y, "y");
icculus@77
  1543
	    CASESDLK12TONAME(SDLK12_z, "z");
icculus@77
  1544
	    CASESDLK12TONAME(SDLK12_DELETE, "delete");
icculus@77
  1545
icculus@77
  1546
	    CASESDLK12TONAME(SDLK12_WORLD_0, "world 0");
icculus@77
  1547
	    CASESDLK12TONAME(SDLK12_WORLD_1, "world 1");
icculus@77
  1548
	    CASESDLK12TONAME(SDLK12_WORLD_2, "world 2");
icculus@77
  1549
	    CASESDLK12TONAME(SDLK12_WORLD_3, "world 3");
icculus@77
  1550
	    CASESDLK12TONAME(SDLK12_WORLD_4, "world 4");
icculus@77
  1551
	    CASESDLK12TONAME(SDLK12_WORLD_5, "world 5");
icculus@77
  1552
	    CASESDLK12TONAME(SDLK12_WORLD_6, "world 6");
icculus@77
  1553
	    CASESDLK12TONAME(SDLK12_WORLD_7, "world 7");
icculus@77
  1554
	    CASESDLK12TONAME(SDLK12_WORLD_8, "world 8");
icculus@77
  1555
	    CASESDLK12TONAME(SDLK12_WORLD_9, "world 9");
icculus@77
  1556
	    CASESDLK12TONAME(SDLK12_WORLD_10, "world 10");
icculus@77
  1557
	    CASESDLK12TONAME(SDLK12_WORLD_11, "world 11");
icculus@77
  1558
	    CASESDLK12TONAME(SDLK12_WORLD_12, "world 12");
icculus@77
  1559
	    CASESDLK12TONAME(SDLK12_WORLD_13, "world 13");
icculus@77
  1560
	    CASESDLK12TONAME(SDLK12_WORLD_14, "world 14");
icculus@77
  1561
	    CASESDLK12TONAME(SDLK12_WORLD_15, "world 15");
icculus@77
  1562
	    CASESDLK12TONAME(SDLK12_WORLD_16, "world 16");
icculus@77
  1563
	    CASESDLK12TONAME(SDLK12_WORLD_17, "world 17");
icculus@77
  1564
	    CASESDLK12TONAME(SDLK12_WORLD_18, "world 18");
icculus@77
  1565
	    CASESDLK12TONAME(SDLK12_WORLD_19, "world 19");
icculus@77
  1566
	    CASESDLK12TONAME(SDLK12_WORLD_20, "world 20");
icculus@77
  1567
	    CASESDLK12TONAME(SDLK12_WORLD_21, "world 21");
icculus@77
  1568
	    CASESDLK12TONAME(SDLK12_WORLD_22, "world 22");
icculus@77
  1569
	    CASESDLK12TONAME(SDLK12_WORLD_23, "world 23");
icculus@77
  1570
	    CASESDLK12TONAME(SDLK12_WORLD_24, "world 24");
icculus@77
  1571
	    CASESDLK12TONAME(SDLK12_WORLD_25, "world 25");
icculus@77
  1572
	    CASESDLK12TONAME(SDLK12_WORLD_26, "world 26");
icculus@77
  1573
	    CASESDLK12TONAME(SDLK12_WORLD_27, "world 27");
icculus@77
  1574
	    CASESDLK12TONAME(SDLK12_WORLD_28, "world 28");
icculus@77
  1575
	    CASESDLK12TONAME(SDLK12_WORLD_29, "world 29");
icculus@77
  1576
	    CASESDLK12TONAME(SDLK12_WORLD_30, "world 30");
icculus@77
  1577
	    CASESDLK12TONAME(SDLK12_WORLD_31, "world 31");
icculus@77
  1578
	    CASESDLK12TONAME(SDLK12_WORLD_32, "world 32");
icculus@77
  1579
	    CASESDLK12TONAME(SDLK12_WORLD_33, "world 33");
icculus@77
  1580
	    CASESDLK12TONAME(SDLK12_WORLD_34, "world 34");
icculus@77
  1581
	    CASESDLK12TONAME(SDLK12_WORLD_35, "world 35");
icculus@77
  1582
	    CASESDLK12TONAME(SDLK12_WORLD_36, "world 36");
icculus@77
  1583
	    CASESDLK12TONAME(SDLK12_WORLD_37, "world 37");
icculus@77
  1584
	    CASESDLK12TONAME(SDLK12_WORLD_38, "world 38");
icculus@77
  1585
	    CASESDLK12TONAME(SDLK12_WORLD_39, "world 39");
icculus@77
  1586
	    CASESDLK12TONAME(SDLK12_WORLD_40, "world 40");
icculus@77
  1587
	    CASESDLK12TONAME(SDLK12_WORLD_41, "world 41");
icculus@77
  1588
	    CASESDLK12TONAME(SDLK12_WORLD_42, "world 42");
icculus@77
  1589
	    CASESDLK12TONAME(SDLK12_WORLD_43, "world 43");
icculus@77
  1590
	    CASESDLK12TONAME(SDLK12_WORLD_44, "world 44");
icculus@77
  1591
	    CASESDLK12TONAME(SDLK12_WORLD_45, "world 45");
icculus@77
  1592
	    CASESDLK12TONAME(SDLK12_WORLD_46, "world 46");
icculus@77
  1593
	    CASESDLK12TONAME(SDLK12_WORLD_47, "world 47");
icculus@77
  1594
	    CASESDLK12TONAME(SDLK12_WORLD_48, "world 48");
icculus@77
  1595
	    CASESDLK12TONAME(SDLK12_WORLD_49, "world 49");
icculus@77
  1596
	    CASESDLK12TONAME(SDLK12_WORLD_50, "world 50");
icculus@77
  1597
	    CASESDLK12TONAME(SDLK12_WORLD_51, "world 51");
icculus@77
  1598
	    CASESDLK12TONAME(SDLK12_WORLD_52, "world 52");
icculus@77
  1599
	    CASESDLK12TONAME(SDLK12_WORLD_53, "world 53");
icculus@77
  1600
	    CASESDLK12TONAME(SDLK12_WORLD_54, "world 54");
icculus@77
  1601
	    CASESDLK12TONAME(SDLK12_WORLD_55, "world 55");
icculus@77
  1602
	    CASESDLK12TONAME(SDLK12_WORLD_56, "world 56");
icculus@77
  1603
	    CASESDLK12TONAME(SDLK12_WORLD_57, "world 57");
icculus@77
  1604
	    CASESDLK12TONAME(SDLK12_WORLD_58, "world 58");
icculus@77
  1605
	    CASESDLK12TONAME(SDLK12_WORLD_59, "world 59");
icculus@77
  1606
	    CASESDLK12TONAME(SDLK12_WORLD_60, "world 60");
icculus@77
  1607
	    CASESDLK12TONAME(SDLK12_WORLD_61, "world 61");
icculus@77
  1608
	    CASESDLK12TONAME(SDLK12_WORLD_62, "world 62");
icculus@77
  1609
	    CASESDLK12TONAME(SDLK12_WORLD_63, "world 63");
icculus@77
  1610
	    CASESDLK12TONAME(SDLK12_WORLD_64, "world 64");
icculus@77
  1611
	    CASESDLK12TONAME(SDLK12_WORLD_65, "world 65");
icculus@77
  1612
	    CASESDLK12TONAME(SDLK12_WORLD_66, "world 66");
icculus@77
  1613
	    CASESDLK12TONAME(SDLK12_WORLD_67, "world 67");
icculus@77
  1614
	    CASESDLK12TONAME(SDLK12_WORLD_68, "world 68");
icculus@77
  1615
	    CASESDLK12TONAME(SDLK12_WORLD_69, "world 69");
icculus@77
  1616
	    CASESDLK12TONAME(SDLK12_WORLD_70, "world 70");
icculus@77
  1617
	    CASESDLK12TONAME(SDLK12_WORLD_71, "world 71");
icculus@77
  1618
	    CASESDLK12TONAME(SDLK12_WORLD_72, "world 72");
icculus@77
  1619
	    CASESDLK12TONAME(SDLK12_WORLD_73, "world 73");
icculus@77
  1620
	    CASESDLK12TONAME(SDLK12_WORLD_74, "world 74");
icculus@77
  1621
	    CASESDLK12TONAME(SDLK12_WORLD_75, "world 75");
icculus@77
  1622
	    CASESDLK12TONAME(SDLK12_WORLD_76, "world 76");
icculus@77
  1623
	    CASESDLK12TONAME(SDLK12_WORLD_77, "world 77");
icculus@77
  1624
	    CASESDLK12TONAME(SDLK12_WORLD_78, "world 78");
icculus@77
  1625
	    CASESDLK12TONAME(SDLK12_WORLD_79, "world 79");
icculus@77
  1626
	    CASESDLK12TONAME(SDLK12_WORLD_80, "world 80");
icculus@77
  1627
	    CASESDLK12TONAME(SDLK12_WORLD_81, "world 81");
icculus@77
  1628
	    CASESDLK12TONAME(SDLK12_WORLD_82, "world 82");
icculus@77
  1629
	    CASESDLK12TONAME(SDLK12_WORLD_83, "world 83");
icculus@77
  1630
	    CASESDLK12TONAME(SDLK12_WORLD_84, "world 84");
icculus@77
  1631
	    CASESDLK12TONAME(SDLK12_WORLD_85, "world 85");
icculus@77
  1632
	    CASESDLK12TONAME(SDLK12_WORLD_86, "world 86");
icculus@77
  1633
	    CASESDLK12TONAME(SDLK12_WORLD_87, "world 87");
icculus@77
  1634
	    CASESDLK12TONAME(SDLK12_WORLD_88, "world 88");
icculus@77
  1635
	    CASESDLK12TONAME(SDLK12_WORLD_89, "world 89");
icculus@77
  1636
	    CASESDLK12TONAME(SDLK12_WORLD_90, "world 90");
icculus@77
  1637
	    CASESDLK12TONAME(SDLK12_WORLD_91, "world 91");
icculus@77
  1638
	    CASESDLK12TONAME(SDLK12_WORLD_92, "world 92");
icculus@77
  1639
	    CASESDLK12TONAME(SDLK12_WORLD_93, "world 93");
icculus@77
  1640
	    CASESDLK12TONAME(SDLK12_WORLD_94, "world 94");
icculus@77
  1641
	    CASESDLK12TONAME(SDLK12_WORLD_95, "world 95");
icculus@77
  1642
icculus@77
  1643
	    CASESDLK12TONAME(SDLK12_KP0, "[0]");
icculus@77
  1644
	    CASESDLK12TONAME(SDLK12_KP1, "[1]");
icculus@77
  1645
	    CASESDLK12TONAME(SDLK12_KP2, "[2]");
icculus@77
  1646
	    CASESDLK12TONAME(SDLK12_KP3, "[3]");
icculus@77
  1647
	    CASESDLK12TONAME(SDLK12_KP4, "[4]");
icculus@77
  1648
	    CASESDLK12TONAME(SDLK12_KP5, "[5]");
icculus@77
  1649
	    CASESDLK12TONAME(SDLK12_KP6, "[6]");
icculus@77
  1650
	    CASESDLK12TONAME(SDLK12_KP7, "[7]");
icculus@77
  1651
	    CASESDLK12TONAME(SDLK12_KP8, "[8]");
icculus@77
  1652
	    CASESDLK12TONAME(SDLK12_KP9, "[9]");
icculus@77
  1653
	    CASESDLK12TONAME(SDLK12_KP_PERIOD, "[.]");
icculus@77
  1654
	    CASESDLK12TONAME(SDLK12_KP_DIVIDE, "[/]");
icculus@77
  1655
	    CASESDLK12TONAME(SDLK12_KP_MULTIPLY, "[*]");
icculus@77
  1656
	    CASESDLK12TONAME(SDLK12_KP_MINUS, "[-]");
icculus@77
  1657
	    CASESDLK12TONAME(SDLK12_KP_PLUS, "[+]");
icculus@77
  1658
	    CASESDLK12TONAME(SDLK12_KP_ENTER, "enter");
icculus@77
  1659
	    CASESDLK12TONAME(SDLK12_KP_EQUALS, "equals");
icculus@77
  1660
icculus@77
  1661
	    CASESDLK12TONAME(SDLK12_UP, "up");
icculus@77
  1662
	    CASESDLK12TONAME(SDLK12_DOWN, "down");
icculus@77
  1663
	    CASESDLK12TONAME(SDLK12_RIGHT, "right");
icculus@77
  1664
	    CASESDLK12TONAME(SDLK12_LEFT, "left");
icculus@77
  1665
	    CASESDLK12TONAME(SDLK12_INSERT, "insert");
icculus@77
  1666
	    CASESDLK12TONAME(SDLK12_HOME, "home");
icculus@77
  1667
	    CASESDLK12TONAME(SDLK12_END, "end");
icculus@77
  1668
	    CASESDLK12TONAME(SDLK12_PAGEUP, "page up");
icculus@77
  1669
	    CASESDLK12TONAME(SDLK12_PAGEDOWN, "page down");
icculus@77
  1670
icculus@77
  1671
	    CASESDLK12TONAME(SDLK12_F1, "f1");
icculus@77
  1672
	    CASESDLK12TONAME(SDLK12_F2, "f2");
icculus@77
  1673
	    CASESDLK12TONAME(SDLK12_F3, "f3");
icculus@77
  1674
	    CASESDLK12TONAME(SDLK12_F4, "f4");
icculus@77
  1675
	    CASESDLK12TONAME(SDLK12_F5, "f5");
icculus@77
  1676
	    CASESDLK12TONAME(SDLK12_F6, "f6");
icculus@77
  1677
	    CASESDLK12TONAME(SDLK12_F7, "f7");
icculus@77
  1678
	    CASESDLK12TONAME(SDLK12_F8, "f8");
icculus@77
  1679
	    CASESDLK12TONAME(SDLK12_F9, "f9");
icculus@77
  1680
	    CASESDLK12TONAME(SDLK12_F10, "f10");
icculus@77
  1681
	    CASESDLK12TONAME(SDLK12_F11, "f11");
icculus@77
  1682
	    CASESDLK12TONAME(SDLK12_F12, "f12");
icculus@77
  1683
	    CASESDLK12TONAME(SDLK12_F13, "f13");
icculus@77
  1684
	    CASESDLK12TONAME(SDLK12_F14, "f14");
icculus@77
  1685
	    CASESDLK12TONAME(SDLK12_F15, "f15");
icculus@77
  1686
icculus@77
  1687
	    CASESDLK12TONAME(SDLK12_NUMLOCK, "numlock");
icculus@77
  1688
	    CASESDLK12TONAME(SDLK12_CAPSLOCK, "caps lock");
icculus@77
  1689
	    CASESDLK12TONAME(SDLK12_SCROLLOCK, "scroll lock");
icculus@77
  1690
	    CASESDLK12TONAME(SDLK12_RSHIFT, "right shift");
icculus@77
  1691
	    CASESDLK12TONAME(SDLK12_LSHIFT, "left shift");
icculus@77
  1692
	    CASESDLK12TONAME(SDLK12_RCTRL, "right ctrl");
icculus@77
  1693
	    CASESDLK12TONAME(SDLK12_LCTRL, "left ctrl");
icculus@77
  1694
	    CASESDLK12TONAME(SDLK12_RALT, "right alt");
icculus@77
  1695
	    CASESDLK12TONAME(SDLK12_LALT, "left alt");
icculus@77
  1696
	    CASESDLK12TONAME(SDLK12_RMETA, "right meta");
icculus@77
  1697
	    CASESDLK12TONAME(SDLK12_LMETA, "left meta");
icculus@77
  1698
	    CASESDLK12TONAME(SDLK12_LSUPER, "left super");	/* "Windows" keys */
icculus@77
  1699
	    CASESDLK12TONAME(SDLK12_RSUPER, "right super");	
icculus@77
  1700
	    CASESDLK12TONAME(SDLK12_MODE, "alt gr");
icculus@77
  1701
	    CASESDLK12TONAME(SDLK12_COMPOSE, "compose");
icculus@77
  1702
icculus@77
  1703
	    CASESDLK12TONAME(SDLK12_HELP, "help");
icculus@77
  1704
	    CASESDLK12TONAME(SDLK12_PRINT, "print screen");
icculus@77
  1705
	    CASESDLK12TONAME(SDLK12_SYSREQ, "sys req");
icculus@77
  1706
	    CASESDLK12TONAME(SDLK12_BREAK, "break");
icculus@77
  1707
	    CASESDLK12TONAME(SDLK12_MENU, "menu");
icculus@77
  1708
	    CASESDLK12TONAME(SDLK12_POWER, "power");
icculus@77
  1709
	    CASESDLK12TONAME(SDLK12_EURO, "euro");
icculus@77
  1710
	    CASESDLK12TONAME(SDLK12_UNDO, "undo");
icculus@77
  1711
        #undef CASESDLK12TONAME
icculus@77
  1712
        default: break;
icculus@77
  1713
    }
icculus@77
  1714
icculus@77
  1715
    return (char *) "unknown key";
icculus@77
  1716
}
icculus@77
  1717
icculus@77
  1718
static SDL12Key
icculus@77
  1719
Keysym20to12(const SDL_Keycode keysym20)
icculus@77
  1720
{
icculus@77
  1721
    if ( ((int) keysym20) < 127 ) {  /* (most of) low-ASCII maps directly */
icculus@77
  1722
        if (keysym20 == SDLK_PAUSE) {
icculus@77
  1723
            return SDLK12_PAUSE;
icculus@77
  1724
        } else if (keysym20 == SDLK_CLEAR) {
icculus@77
  1725
            return SDLK12_CLEAR;
icculus@77
  1726
        }
icculus@77
  1727
        return (SDL12Key) keysym20;
icculus@77
  1728
    }
icculus@77
  1729
icculus@77
  1730
    switch (keysym20) {
icculus@77
  1731
        #define CASEKEYSYM20TO12(k20, k12) case SDLK_##k20: return SDLK12_##k12
icculus@77
  1732
        CASEKEYSYM20TO12(KP_0, KP0);
icculus@77
  1733
        CASEKEYSYM20TO12(KP_1, KP1);
icculus@77
  1734
        CASEKEYSYM20TO12(KP_2, KP2);
icculus@77
  1735
        CASEKEYSYM20TO12(KP_3, KP3);
icculus@77
  1736
        CASEKEYSYM20TO12(KP_4, KP4);
icculus@77
  1737
        CASEKEYSYM20TO12(KP_5, KP5);
icculus@77
  1738
        CASEKEYSYM20TO12(KP_6, KP6);
icculus@77
  1739
        CASEKEYSYM20TO12(KP_7, KP7);
icculus@77
  1740
        CASEKEYSYM20TO12(KP_8, KP8);
icculus@77
  1741
        CASEKEYSYM20TO12(KP_9, KP9);
icculus@77
  1742
        CASEKEYSYM20TO12(NUMLOCKCLEAR, NUMLOCK);
icculus@77
  1743
        CASEKEYSYM20TO12(SCROLLLOCK, SCROLLOCK);
icculus@77
  1744
        CASEKEYSYM20TO12(RGUI, RMETA);
icculus@77
  1745
        CASEKEYSYM20TO12(LGUI, LMETA);
icculus@77
  1746
        CASEKEYSYM20TO12(PRINTSCREEN, PRINT);
icculus@77
  1747
        #undef CASEKEYSYM20TO12
icculus@77
  1748
icculus@77
  1749
        #define CASEKEYSYM20TO12(k) case SDLK_##k: return SDLK12_##k
icculus@77
  1750
        CASEKEYSYM20TO12(CLEAR);
icculus@77
  1751
        CASEKEYSYM20TO12(PAUSE);
icculus@77
  1752
        CASEKEYSYM20TO12(KP_PERIOD);
icculus@77
  1753
        CASEKEYSYM20TO12(KP_DIVIDE);
icculus@77
  1754
        CASEKEYSYM20TO12(KP_MULTIPLY);
icculus@77
  1755
        CASEKEYSYM20TO12(KP_MINUS);
icculus@77
  1756
        CASEKEYSYM20TO12(KP_PLUS);
icculus@77
  1757
        CASEKEYSYM20TO12(KP_ENTER);
icculus@77
  1758
        CASEKEYSYM20TO12(KP_EQUALS);
icculus@77
  1759
        CASEKEYSYM20TO12(UP);
icculus@77
  1760
        CASEKEYSYM20TO12(DOWN);
icculus@77
  1761
        CASEKEYSYM20TO12(RIGHT);
icculus@77
  1762
        CASEKEYSYM20TO12(LEFT);
icculus@77
  1763
        CASEKEYSYM20TO12(INSERT);
icculus@77
  1764
        CASEKEYSYM20TO12(HOME);
icculus@77
  1765
        CASEKEYSYM20TO12(END);
icculus@77
  1766
        CASEKEYSYM20TO12(PAGEUP);
icculus@77
  1767
        CASEKEYSYM20TO12(PAGEDOWN);
icculus@77
  1768
        CASEKEYSYM20TO12(F1);
icculus@77
  1769
        CASEKEYSYM20TO12(F2);
icculus@77
  1770
        CASEKEYSYM20TO12(F3);
icculus@77
  1771
        CASEKEYSYM20TO12(F4);
icculus@77
  1772
        CASEKEYSYM20TO12(F5);
icculus@77
  1773
        CASEKEYSYM20TO12(F6);
icculus@77
  1774
        CASEKEYSYM20TO12(F7);
icculus@77
  1775
        CASEKEYSYM20TO12(F8);
icculus@77
  1776
        CASEKEYSYM20TO12(F9);
icculus@77
  1777
        CASEKEYSYM20TO12(F10);
icculus@77
  1778
        CASEKEYSYM20TO12(F11);
icculus@77
  1779
        CASEKEYSYM20TO12(F12);
icculus@77
  1780
        CASEKEYSYM20TO12(F13);
icculus@77
  1781
        CASEKEYSYM20TO12(F14);
icculus@77
  1782
        CASEKEYSYM20TO12(F15);
icculus@77
  1783
        CASEKEYSYM20TO12(CAPSLOCK);
icculus@77
  1784
        CASEKEYSYM20TO12(RSHIFT);
icculus@77
  1785
        CASEKEYSYM20TO12(LSHIFT);
icculus@77
  1786
        CASEKEYSYM20TO12(RCTRL);
icculus@77
  1787
        CASEKEYSYM20TO12(LCTRL);
icculus@77
  1788
        CASEKEYSYM20TO12(RALT);
icculus@77
  1789
        CASEKEYSYM20TO12(LALT);
icculus@77
  1790
        CASEKEYSYM20TO12(MODE);
icculus@77
  1791
        CASEKEYSYM20TO12(HELP);
icculus@77
  1792
        CASEKEYSYM20TO12(SYSREQ);;
icculus@77
  1793
        CASEKEYSYM20TO12(MENU);
icculus@77
  1794
        CASEKEYSYM20TO12(POWER);
icculus@77
  1795
        CASEKEYSYM20TO12(UNDO);
icculus@77
  1796
        #undef CASEKEYSYM20TO12
icculus@77
  1797
        default: break;
icculus@77
  1798
    }
icculus@77
  1799
icculus@77
  1800
    FIXME("nothing maps to SDLK12_COMPOSE, SDLK12_BREAK, or SDLK12_EURO ...?");
icculus@77
  1801
    FIXME("map some of the SDLK12_WORLD keys");
icculus@77
  1802
    return SDLK12_UNKNOWN;
icculus@77
  1803
}
icculus@77
  1804
icculus@18
  1805
static int
icculus@18
  1806
EventFilter20to12(void *data, SDL_Event *event20)
icculus@15
  1807
{
icculus@43
  1808
    //const int maxUserEvents12 = SDL12_NUMEVENTS - SDL12_USEREVENT;
icculus@18
  1809
    SDL12_Event event12;
icculus@32
  1810
    int x, y;
icculus@18
  1811
icculus@18
  1812
    SDL_assert(data == NULL);  /* currently unused. */
icculus@18
  1813
icculus@34
  1814
    SDL20_zero(event12);
icculus@18
  1815
icculus@18
  1816
    switch (event20->type)
icculus@18
  1817
    {
icculus@18
  1818
        case SDL_QUIT:
icculus@31
  1819
            event12.type = SDL12_QUIT;
icculus@18
  1820
            break;
icculus@18
  1821
icculus@18
  1822
        case SDL_WINDOWEVENT:
icculus@18
  1823
            switch (event20->window.event)
icculus@18
  1824
            {
icculus@18
  1825
                case SDL_WINDOWEVENT_CLOSE:
icculus@31
  1826
                    event12.type = SDL12_QUIT;
icculus@18
  1827
                    break;
icculus@18
  1828
icculus@18
  1829
                case SDL_WINDOWEVENT_SHOWN:
icculus@18
  1830
                case SDL_WINDOWEVENT_EXPOSED:
icculus@31
  1831
                    event12.type = SDL12_VIDEOEXPOSE;
icculus@18
  1832
                    break;
icculus@18
  1833
icculus@18
  1834
                case SDL_WINDOWEVENT_RESIZED:
icculus@54
  1835
                case SDL_WINDOWEVENT_SIZE_CHANGED:
icculus@54
  1836
                    FIXME("what's the difference between RESIZED and SIZE_CHANGED?");
icculus@31
  1837
                    event12.type = SDL12_VIDEORESIZE;
icculus@31
  1838
                    event12.resize.w = event20->window.data1;
icculus@31
  1839
                    event12.resize.h = event20->window.data2;
icculus@18
  1840
                    break;
icculus@18
  1841
icculus@18
  1842
                case SDL_WINDOWEVENT_MINIMIZED:
icculus@31
  1843
                    event12.type = SDL12_ACTIVEEVENT;
icculus@31
  1844
                    event12.active.gain = 0;
icculus@31
  1845
                    event12.active.state = SDL12_APPACTIVE;
icculus@18
  1846
                    break;
icculus@18
  1847
icculus@18
  1848
                case SDL_WINDOWEVENT_RESTORED:
icculus@31
  1849
                    event12.type = SDL12_ACTIVEEVENT;
icculus@31
  1850
                    event12.active.gain = 1;
icculus@31
  1851
                    event12.active.state = SDL12_APPACTIVE;
icculus@18
  1852
                    break;
icculus@18
  1853
icculus@18
  1854
                case SDL_WINDOWEVENT_ENTER:
icculus@31
  1855
                    event12.type = SDL12_ACTIVEEVENT;
icculus@31
  1856
                    event12.active.gain = 1;
icculus@31
  1857
                    event12.active.state = SDL12_APPMOUSEFOCUS;
icculus@18
  1858
                    break;
icculus@18
  1859
icculus@18
  1860
                case SDL_WINDOWEVENT_LEAVE:
icculus@31
  1861
                    event12.type = SDL12_ACTIVEEVENT;
icculus@31
  1862
                    event12.active.gain = 0;
icculus@31
  1863
                    event12.active.state = SDL12_APPMOUSEFOCUS;
icculus@18
  1864
                    break;
icculus@18
  1865
icculus@18
  1866
                case SDL_WINDOWEVENT_FOCUS_GAINED:
icculus@31
  1867
                    event12.type = SDL12_ACTIVEEVENT;
icculus@31
  1868
                    event12.active.gain = 1;
icculus@31
  1869
                    event12.active.state = SDL12_APPINPUTFOCUS;
icculus@18
  1870
                    break;
icculus@18
  1871
icculus@18
  1872
                case SDL_WINDOWEVENT_FOCUS_LOST:
icculus@31
  1873
                    event12.type = SDL12_ACTIVEEVENT;
icculus@31
  1874
                    event12.active.gain = 0;
icculus@31
  1875
                    event12.active.state = SDL12_APPINPUTFOCUS;
icculus@18
  1876
                    break;
icculus@18
  1877
            }
icculus@18
  1878
            break;
icculus@18
  1879
icculus@18
  1880
        // !!! FIXME: this is sort of a mess to convert.
icculus@77
  1881
        case SDL_SYSWMEVENT: FIXME("write me"); return 0;
icculus@77
  1882
icculus@77
  1883
        case SDL_KEYUP:
icculus@77
  1884
        case SDL_KEYDOWN:
icculus@77
  1885
            if (event20->key.repeat) {
icculus@77
  1886
                return 0;  /* ignore 2.0-style key repeat events */
icculus@77
  1887
            }
icculus@77
  1888
            event12.key.keysym.sym = Keysym20to12(event20->key.keysym.sym);
icculus@77
  1889
            if (event12.key.keysym.sym == SDLK12_UNKNOWN) {
icculus@77
  1890
                return 0;  /* drop it if we can't map it */
icculus@77
  1891
            }
icculus@77
  1892
            event12.type = (event20->type == SDL_KEYDOWN) ? SDL12_KEYDOWN : SDL12_KEYUP;
icculus@77
  1893
            event12.key.which = 0;
icculus@77
  1894
            event12.key.state = event20->key.state;
icculus@77
  1895
            event12.key.keysym.scancode = (event20->key.keysym.scancode < 256) ? (Uint8) event20->key.keysym.scancode : 0;
icculus@77
  1896
            event12.key.keysym.mod = event20->key.keysym.mod;  /* these match up between 1.2 and 2.0! */
icculus@77
  1897
            event12.key.keysym.unicode = 0;  FIXME("unicode");
icculus@77
  1898
            break;
icculus@18
  1899
icculus@54
  1900
        case SDL_TEXTEDITING: FIXME("write me"); return 0;
icculus@54
  1901
        case SDL_TEXTINPUT: FIXME("write me"); return 0;
icculus@18
  1902
icculus@18
  1903
        case SDL_MOUSEMOTION:
icculus@31
  1904
        	event12.type = SDL12_MOUSEMOTION;
icculus@31
  1905
            event12.motion.which = (Uint8) event20->motion.which;
icculus@31
  1906
            event12.motion.state = event20->motion.state;
icculus@31
  1907
            event12.motion.x = (Uint16) event20->motion.x;
icculus@31
  1908
            event12.motion.y = (Uint16) event20->motion.y;
icculus@31
  1909
            event12.motion.xrel = (Sint16) event20->motion.xrel;
icculus@31
  1910
            event12.motion.yrel = (Sint16) event20->motion.yrel;
icculus@18
  1911
            break;
icculus@18
  1912
icculus@18
  1913
        case SDL_MOUSEBUTTONDOWN:
icculus@31
  1914
        	event12.type = SDL12_MOUSEBUTTONDOWN;
icculus@31
  1915
            event12.button.which = (Uint8) event20->button.which;
icculus@31
  1916
            event12.button.button = event20->button.button;
icculus@31
  1917
            event12.button.state = event20->button.state;
icculus@31
  1918
            event12.button.x = (Uint16) event20->button.x;
icculus@31
  1919
            event12.button.y = (Uint16) event20->button.y;
icculus@18
  1920
            break;
icculus@18
  1921
icculus@18
  1922
        case SDL_MOUSEBUTTONUP:
icculus@31
  1923
        	event12.type = SDL12_MOUSEBUTTONUP;
icculus@31
  1924
            event12.button.which = (Uint8) event20->button.which;
icculus@31
  1925
            event12.button.button = event20->button.button;
icculus@31
  1926
            event12.button.state = event20->button.state;
icculus@31
  1927
            event12.button.x = (Uint16) event20->button.x;
icculus@31
  1928
            event12.button.y = (Uint16) event20->button.y;
icculus@18
  1929
            break;
icculus@18
  1930
icculus@18
  1931
        case SDL_MOUSEWHEEL:
icculus@32
  1932
            if (event20->wheel.y == 0)
icculus@32
  1933
                break;  /* don't support horizontal wheels in 1.2. */
icculus@32
  1934
icculus@32
  1935
            event12.type = SDL12_MOUSEBUTTONDOWN;
icculus@32
  1936
            event12.button.which = (Uint8) event20->wheel.which;
icculus@32
  1937
            event12.button.button = (event20->wheel.y > 0) ? 4 : 5;  /* wheelup is 4, down is 5. */
icculus@32
  1938
            event12.button.state = SDL_GetMouseState(&x, &y);
icculus@32
  1939
            event12.button.x = (Uint16) x;
icculus@32
  1940
            event12.button.y = (Uint16) y;
icculus@32
  1941
            PushEventIfNotFiltered(&event12);
icculus@32
  1942
icculus@32
  1943
            event12.type = SDL12_MOUSEBUTTONUP;  /* immediately release mouse "button" at the end of this switch. */
icculus@18
  1944
            break;
icculus@18
  1945
icculus@18
  1946
        case SDL_JOYAXISMOTION:
icculus@31
  1947
            event12.type = SDL12_JOYAXISMOTION;
icculus@31
  1948
            event12.jaxis.which = (Uint8) event20->jaxis.which;
icculus@31
  1949
            event12.jaxis.axis = event20->jaxis.axis;
icculus@31
  1950
            event12.jaxis.value = event20->jaxis.value;
icculus@18
  1951
            break;
icculus@18
  1952
icculus@18
  1953
        case SDL_JOYBALLMOTION:
icculus@31
  1954
            event12.type = SDL12_JOYBALLMOTION;
icculus@31
  1955
            event12.jball.which = (Uint8) event20->jball.which;
icculus@31
  1956
            event12.jball.ball = event20->jball.ball;
icculus@31
  1957
            event12.jball.xrel = event20->jball.xrel;
icculus@31
  1958
            event12.jball.yrel = event20->jball.yrel;
icculus@18
  1959
            break;
icculus@18
  1960
icculus@18
  1961
        case SDL_JOYHATMOTION:
icculus@31
  1962
            event12.type = SDL12_JOYHATMOTION;
icculus@31
  1963
            event12.jhat.which = (Uint8) event20->jhat.which;
icculus@31
  1964
            event12.jhat.hat = event20->jhat.hat;
icculus@31
  1965
            event12.jhat.value = event20->jhat.value;
icculus@18
  1966
            break;
icculus@18
  1967
icculus@18
  1968
        case SDL_JOYBUTTONDOWN:
icculus@31
  1969
            event12.type = SDL12_JOYBUTTONDOWN;
icculus@31
  1970
            event12.jbutton.which = (Uint8) event20->jbutton.which;
icculus@31
  1971
            event12.jbutton.button = event20->jbutton.button;
icculus@31
  1972
            event12.jbutton.state = event20->jbutton.state;
icculus@18
  1973
            break;
icculus@18
  1974
icculus@18
  1975
        case SDL_JOYBUTTONUP:
icculus@31
  1976
            event12.type = SDL12_JOYBUTTONUP;
icculus@31
  1977
            event12.jbutton.which = (Uint8) event20->jbutton.which;
icculus@31
  1978
            event12.jbutton.button = event20->jbutton.button;
icculus@31
  1979
            event12.jbutton.state = event20->jbutton.state;
icculus@18
  1980
            break;
icculus@18
  1981
icculus@18
  1982
        //case SDL_JOYDEVICEADDED:
icculus@18
  1983
        //case SDL_JOYDEVICEREMOVED:
icculus@18
  1984
	    //case SDL_CONTROLLERAXISMOTION:
icculus@18
  1985
	    //case SDL_CONTROLLERBUTTONDOWN:
icculus@18
  1986
	    //case SDL_CONTROLLERBUTTONUP:
icculus@18
  1987
	    //case SDL_CONTROLLERDEVICEADDED:
icculus@18
  1988
	    //case SDL_CONTROLLERDEVICEREMOVED:
icculus@18
  1989
	    //case SDL_CONTROLLERDEVICEREMAPPED:
icculus@18
  1990
        //case SDL_FINGERDOWN:
icculus@18
  1991
        //case SDL_FINGERUP:
icculus@18
  1992
        //case SDL_FINGERMOTION:
icculus@18
  1993
        //case SDL_DOLLARGESTURE:
icculus@18
  1994
        //case SDL_DOLLARRECORD:
icculus@18
  1995
        //case SDL_MULTIGESTURE:
icculus@18
  1996
        //case SDL_CLIPBOARDUPDATE:
icculus@18
  1997
        //case SDL_DROPFILE:
icculus@18
  1998
icculus@18
  1999
        default:
icculus@18
  2000
            return 0;  /* drop everything else. */
icculus@18
  2001
    }
icculus@18
  2002
icculus@32
  2003
    PushEventIfNotFiltered(&event12);
icculus@18
  2004
icculus@18
  2005
    return 0;  /* always drop it from the 2.0 event queue. */
icculus@18
  2006
}
icculus@18
  2007
icculus@35
  2008
DECLSPEC void SDLCALL
icculus@18
  2009
SDL_SetEventFilter(SDL12_EventFilter filter12)
icculus@18
  2010
{
icculus@18
  2011
    /* We always have a filter installed, but will call the app's too. */
icculus@18
  2012
    EventFilter12 = filter12;
icculus@18
  2013
}
icculus@18
  2014
icculus@35
  2015
DECLSPEC SDL12_EventFilter SDLCALL
icculus@18
  2016
SDL_GetEventFilter(void)
icculus@18
  2017
{
icculus@18
  2018
    return EventFilter12;
icculus@18
  2019
}
icculus@18
  2020
icculus@15
  2021
icculus@73
  2022
static SDL12_Rect *
icculus@73
  2023
Rect20to12(const SDL_Rect *rect20, SDL12_Rect *rect12)
icculus@73
  2024
{
icculus@73
  2025
    rect12->x = (Sint16) rect20->x;
icculus@73
  2026
    rect12->y = (Sint16) rect20->y;
icculus@73
  2027
    rect12->w = (Uint16) rect20->w;
icculus@73
  2028
    rect12->h = (Uint16) rect20->h;
icculus@73
  2029
    return rect12;
icculus@73
  2030
}
icculus@73
  2031
icculus@73
  2032
static SDL_Rect *
icculus@73
  2033
Rect12to20(const SDL12_Rect *rect12, SDL_Rect *rect20)
icculus@73
  2034
{
icculus@73
  2035
    rect20->x = (int) rect12->x;
icculus@73
  2036
    rect20->y = (int) rect12->y;
icculus@73
  2037
    rect20->w = (int) rect12->w;
icculus@73
  2038
    rect20->h = (int) rect12->h;
icculus@73
  2039
    return rect20;
icculus@73
  2040
}
icculus@73
  2041
icculus@34
  2042
static SDL12_Surface *
icculus@15
  2043
Surface20to12(SDL_Surface *surface20)
icculus@15
  2044
{
icculus@15
  2045
    SDL12_Surface *surface12 = NULL;
icculus@15
  2046
    SDL12_Palette *palette12 = NULL;
icculus@15
  2047
    SDL12_PixelFormat *format12 = NULL;
icculus@31
  2048
    Uint32 flags = 0;
icculus@15
  2049
icculus@15
  2050
    if (!surface20)
icculus@15
  2051
        return NULL;
icculus@15
  2052
icculus@15
  2053
    surface12 = (SDL12_Surface *) SDL20_malloc(sizeof (SDL12_Surface));
icculus@15
  2054
    if (!surface12)
icculus@15
  2055
        goto failed;
icculus@15
  2056
icculus@79
  2057
    if (surface20->format->palette) {
icculus@79
  2058
        palette12 = (SDL12_Palette *) SDL20_malloc(sizeof (SDL12_Palette));
icculus@79
  2059
        if (!palette12)
icculus@79
  2060
            goto failed;
icculus@79
  2061
    }
icculus@15
  2062
icculus@15
  2063
    format12 = (SDL12_PixelFormat *) SDL20_malloc(sizeof (SDL12_PixelFormat));
icculus@15
  2064
    if (!format12)
icculus@15
  2065
        goto failed;
icculus@15
  2066
icculus@79
  2067
    if (palette12) {
icculus@79
  2068
        SDL20_zerop(palette12);
icculus@79
  2069
        SDL_assert(surface20->format->palette);
icculus@79
  2070
        palette12->ncolors = surface20->format->palette->ncolors;
icculus@79
  2071
        palette12->colors = surface20->format->palette->colors;
icculus@79
  2072
    }
icculus@15
  2073
icculus@34
  2074
    SDL20_zerop(format12);
icculus@15
  2075
    format12->palette = palette12;
icculus@15
  2076
    format12->BitsPerPixel = surface20->format->BitsPerPixel;
icculus@15
  2077
    format12->BytesPerPixel = surface20->format->BytesPerPixel;
icculus@15
  2078
    format12->Rloss = surface20->format->Rloss;
icculus@15
  2079
    format12->Gloss = surface20->format->Gloss;
icculus@15
  2080
    format12->Bloss = surface20->format->Bloss;
icculus@15
  2081
    format12->Aloss = surface20->format->Aloss;
icculus@15
  2082
    format12->Rshift = surface20->format->Rshift;
icculus@15
  2083
    format12->Gshift = surface20->format->Gshift;
icculus@15
  2084
    format12->Bshift = surface20->format->Bshift;
icculus@15
  2085
    format12->Ashift = surface20->format->Ashift;
icculus@15
  2086
    format12->Rmask = surface20->format->Rmask;
icculus@15
  2087
    format12->Gmask = surface20->format->Gmask;
icculus@15
  2088
    format12->Bmask = surface20->format->Bmask;
icculus@15
  2089
    format12->Amask = surface20->format->Amask;
icculus@100
  2090
icculus@100
  2091
    if (SDL20_HasColorKey(surface20)) {
icculus@100
  2092
        if (SDL20_GetColorKey(surface20, &format12->colorkey) == -1) {
icculus@100
  2093
            format12->colorkey = 0;
icculus@100
  2094
        } else {
icculus@100
  2095
            surface12->flags |= SDL12_SRCCOLORKEY;
icculus@100
  2096
        }
icculus@100
  2097
    }
icculus@100
  2098
icculus@100
  2099
    if (SDL20_GetSurfaceAlphaMod(surface20, &format12->alpha) == -1) {
icculus@100
  2100
        format12->alpha = 255;
icculus@100
  2101
    }
icculus@100
  2102
icculus@102
  2103
    SDL_BlendMode blendmode = SDL_BLENDMODE_NONE;
icculus@102
  2104
    if ((SDL20_GetSurfaceBlendMode(surface20, &blendmode) == 0) && (blendmode == SDL_BLENDMODE_BLEND)) {
icculus@100
  2105
        surface12->flags |= SDL12_SRCALPHA;
icculus@100
  2106
    }
icculus@100
  2107
icculus@34
  2108
    SDL20_zerop(surface12);
icculus@15
  2109
    flags = surface20->flags;
icculus@66
  2110
    #ifdef SDL_SIMD_ALIGNED
icculus@66
  2111
    flags &= ~SDL_SIMD_ALIGNED;  /* we don't need to map this to 1.2 */
icculus@66
  2112
    #endif
icculus@15
  2113
    #define MAPSURFACEFLAGS(fl) { if (surface20->flags & SDL_##fl) { surface12->flags |= SDL12_##fl; flags &= ~SDL_##fl; } }
icculus@15
  2114
    MAPSURFACEFLAGS(PREALLOC);
icculus@15
  2115
    MAPSURFACEFLAGS(RLEACCEL);
icculus@34
  2116
    /*MAPSURFACEFLAGS(DONTFREE);*/
icculus@15
  2117
    #undef MAPSURFACEFLAGS
icculus@31
  2118
    SDL_assert(flags == 0);  /* non-zero if there's a flag we didn't map. */
icculus@15
  2119
icculus@15
  2120
    surface12->format = format12;
icculus@15
  2121
    surface12->w = surface20->w;
icculus@15
  2122
    surface12->h = surface20->h;
icculus@54
  2123
    surface12->pitch = (Uint16) surface20->pitch;  FIXME("make sure this fits in a Uint16");
icculus@15
  2124
    surface12->pixels = surface20->pixels;
icculus@15
  2125
    surface12->offset = 0;
icculus@34
  2126
    surface12->surface20 = surface20;
icculus@73
  2127
    Rect20to12(&surface20->clip_rect, &surface12->clip_rect);
icculus@15
  2128
    surface12->refcount = surface20->refcount;
icculus@15
  2129
icculus@15
  2130
    return surface12;
icculus@15
  2131
icculus@15
  2132
failed:
icculus@15
  2133
    SDL20_free(surface12);
icculus@15
  2134
    SDL20_free(palette12);
icculus@15
  2135
    SDL20_free(format12);
icculus@15
  2136
    return NULL;
icculus@15
  2137
}
icculus@15
  2138
icculus@100
  2139
static void
icculus@100
  2140
SetPalette12ForMasks(SDL12_Surface *surface12, const Uint32 Rmask, const Uint32 Gmask, const Uint32 Bmask)
icculus@100
  2141
{
icculus@100
  2142
    SDL12_PixelFormat *format12 = surface12->format;
icculus@100
  2143
    if (format12->palette && (Rmask || Bmask || Gmask)) {
icculus@100
  2144
        #define LOSSMASKSHIFTSETUP(t) { \
icculus@100
  2145
            format12->t##shift = 0; \
icculus@100
  2146
            format12->t##loss = 8; \
icculus@100
  2147
            if (t##mask) { \
icculus@100
  2148
                Uint32 mask; \
icculus@100
  2149
                for (mask = t##mask; !(mask & 1); mask >>= 1) { \
icculus@100
  2150
                    format12->t##shift++; \
icculus@100
  2151
                } \
icculus@100
  2152
                while (mask & 1) { \
icculus@100
  2153
                    format12->t##loss--; \
icculus@100
  2154
                    mask >>= 1; \
icculus@100
  2155
                } \
icculus@100
  2156
            } \
icculus@100
  2157
            format12->t##mask = t##mask; \
icculus@100
  2158
        }
icculus@100
  2159
        LOSSMASKSHIFTSETUP(R);
icculus@100
  2160
        LOSSMASKSHIFTSETUP(G);
icculus@100
  2161
        LOSSMASKSHIFTSETUP(B);
icculus@100
  2162
        #undef LOSSMASSSHIFTSETUP
icculus@100
  2163
        format12->Amask = 0;
icculus@100
  2164
        format12->Ashift = 0;
icculus@100
  2165
        format12->Aloss = 8;
icculus@100
  2166
icculus@100
  2167
        #define MASKSETUP(t) \
icculus@100
  2168
            int t##w = 0, t##m = 0; \
icculus@100
  2169
            if (t##mask) { \
icculus@100
  2170
            t##w = 8 - format12->t##loss; \
icculus@100
  2171
            for (int i = format12->t##loss; i > 0; i -= t##w) { \
icculus@100
  2172
                t##m |= 1 << i; \
icculus@100
  2173
            } \
icculus@100
  2174
        }
icculus@100
  2175
        MASKSETUP(R);
icculus@100
  2176
        MASKSETUP(G);
icculus@100
  2177
        MASKSETUP(B);
icculus@100
  2178
        #undef MASKSETUP
icculus@100
  2179
icculus@100
  2180
        const int ncolors = format12->palette->ncolors;
icculus@100
  2181
        SDL_Color *color = format12->palette->colors;
icculus@100
  2182
        for (int i = 0; i < ncolors; i++, color++) {
icculus@100
  2183
            #define SETCOLOR(T, t) { \
icculus@100
  2184
                const int x = (i & T##mask) >> format12->T##shift; \
icculus@100
  2185
                color->t = (x << format12->T##loss) | ((x * T##m) >> T##w); \
icculus@100
  2186
            }
icculus@100
  2187
            SETCOLOR(R, r);
icculus@100
  2188
            SETCOLOR(G, g);
icculus@100
  2189
            SETCOLOR(B, b);
icculus@100
  2190
            #undef SETCOLOR
icculus@100
  2191
            color->a = 255;
icculus@100
  2192
        }
icculus@100
  2193
icculus@100
  2194
        SDL_PixelFormat *format20 = surface12->surface20->format;
icculus@100
  2195
        #define UPDATEFMT20(t) \
icculus@100
  2196
            format20->t##mask = format12->t##mask; \
icculus@100
  2197
            format20->t##loss = format12->t##loss; \
icculus@100
  2198
            format20->t##shift = format12->t##shift;
icculus@100
  2199
        UPDATEFMT20(R);
icculus@100
  2200
        UPDATEFMT20(G);
icculus@100
  2201
        UPDATEFMT20(B);
icculus@100
  2202
        UPDATEFMT20(A);
icculus@100
  2203
        #undef UPDATEFMT20
icculus@100
  2204
    }
icculus@100
  2205
}
icculus@100
  2206
icculus@35
  2207
DECLSPEC SDL12_Surface * SDLCALL
icculus@100
  2208
SDL_CreateRGBSurface(Uint32 flags12, int width, int height, int depth, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
icculus@15
  2209
{
icculus@100
  2210
    // SDL 1.2 checks this.
icculus@100
  2211
    if ((width >= 16384) || (height >= 65536)) {
icculus@100
  2212
        SDL20_SetError("Width or height is too large");
icculus@100
  2213
        return NULL;
icculus@92
  2214
    }
icculus@100
  2215
icculus@100
  2216
    SDL_Surface *surface20;
icculus@100
  2217
    if (depth == 8) {  // don't pass masks to SDL2 for 8-bit surfaces, it'll cause problems.
icculus@100
  2218
        surface20 = SDL20_CreateRGBSurface(0, width, height, depth, 0, 0, 0, 0);
icculus@100
  2219
    } else {
icculus@100
  2220
        surface20 = SDL20_CreateRGBSurface(0, width, height, depth, Rmask, Gmask, Bmask, Amask);
icculus@100
  2221
    }
icculus@100
  2222
icculus@15
  2223
    SDL12_Surface *surface12 = Surface20to12(surface20);
icculus@15
  2224
    if (!surface12) {
icculus@15
  2225
        SDL20_FreeSurface(surface20);
icculus@15
  2226
        return NULL;
icculus@15
  2227
    }
icculus@15
  2228
icculus@100
  2229
    SDL_assert((surface12->flags & ~(SDL12_SRCCOLORKEY|SDL12_SRCALPHA)) == 0);  // shouldn't have prealloc, rleaccel, or dontfree.
icculus@100
  2230
icculus@100
  2231
    SetPalette12ForMasks(surface12, Rmask, Gmask, Bmask);
icculus@100
  2232
icculus@102
  2233
    if (flags12 & SDL12_SRCALPHA) {
icculus@102
  2234
        surface12->flags |= SDL12_SRCALPHA;
icculus@102
  2235
        SDL20_SetSurfaceBlendMode(surface20, SDL_BLENDMODE_BLEND);
icculus@102
  2236
    }
icculus@102
  2237
icculus@15
  2238
    return surface12;
icculus@15
  2239
}
icculus@15
  2240
icculus@35
  2241
DECLSPEC SDL12_Surface * SDLCALL
icculus@15
  2242
SDL_CreateRGBSurfaceFrom(void *pixels, int width, int height, int depth, int pitch, Uint32 Rmask, Uint32 Gmask, Uint32 Bmask, Uint32 Amask)
icculus@15
  2243
{
icculus@100
  2244
    if ((width >= 16384) || (height >= 65536)) {
icculus@100
  2245
        SDL20_SetError("Width or height is too large");
icculus@100
  2246
        return NULL;
icculus@92
  2247
    }
icculus@100
  2248
icculus@100
  2249
    SDL_Surface *surface20;
icculus@100
  2250
    if (depth == 8) {  // don't pass masks to SDL2 for 8-bit surfaces, it'll cause problems.
icculus@100
  2251
        surface20 = SDL20_CreateRGBSurfaceFrom(pixels, width, height, depth, pitch, 0, 0, 0, 0);
icculus@100
  2252
    } else {
icculus@100
  2253
        surface20 = SDL20_CreateRGBSurfaceFrom(pixels, width, height, depth, pitch, Rmask, Gmask, Bmask, Amask);
icculus@100
  2254
    }
icculus@100
  2255
icculus@15
  2256
    SDL12_Surface *surface12 = Surface20to12(surface20);
icculus@15
  2257
    if (!surface12) {
icculus@15
  2258
        SDL20_FreeSurface(surface20);
icculus@15
  2259
        return NULL;
icculus@15
  2260
    }
icculus@15
  2261
icculus@100
  2262
    SDL_assert((surface12->flags & ~(SDL12_SRCCOLORKEY|SDL12_SRCALPHA)) == SDL12_PREALLOC);  // should _only_ have prealloc.
icculus@100
  2263
icculus@100
  2264
    SetPalette12ForMasks(surface12, Rmask, Gmask, Bmask);
icculus@100
  2265
icculus@15
  2266
    return surface12;
icculus@15
  2267
}
icculus@15
  2268
icculus@35
  2269
DECLSPEC void SDLCALL
icculus@35
  2270
SDL_FreeSurface(SDL12_Surface *surface12)
icculus@15
  2271
{
icculus@15
  2272
    if (surface12) {
icculus@34
  2273
        SDL20_FreeSurface(surface12->surface20);
icculus@15
  2274
        if (surface12->format) {
icculus@15
  2275
            SDL20_free(surface12->format->palette);
icculus@15
  2276
            SDL20_free(surface12->format);
icculus@15
  2277
        }
icculus@15
  2278
        SDL20_free(surface12);
icculus@15
  2279
    }
icculus@15
  2280
}
icculus@15
  2281
icculus@35
  2282
DECLSPEC void SDLCALL
icculus@73
  2283
SDL_GetClipRect(SDL12_Surface *surface12, SDL12_Rect *rect)
icculus@24
  2284
{
icculus@73
  2285
    if (surface12 && rect) {
icculus@73
  2286
        SDL_memcpy(rect, &surface12->clip_rect, sizeof (SDL12_Rect));
icculus@73
  2287
    }
icculus@24
  2288
}
icculus@24
  2289
icculus@35
  2290
DECLSPEC SDL_bool SDLCALL
icculus@73
  2291
SDL_SetClipRect(SDL12_Surface *surface12, const SDL12_Rect *rect12)
icculus@24
  2292
{
icculus@24
  2293
    SDL_bool retval = SDL_FALSE;
icculus@24
  2294
    if (surface12)
icculus@24
  2295
    {
icculus@73
  2296
        SDL_Rect rect20;
icculus@73
  2297
        retval = SDL20_SetClipRect(surface12->surface20, rect12 ? Rect12to20(rect12, &rect20) : NULL);
icculus@73
  2298
        SDL20_GetClipRect(surface12->surface20, &rect20);
icculus@73
  2299
        Rect20to12(&rect20, &surface12->clip_rect);
icculus@24
  2300
    }
icculus@24
  2301
    return retval;
icculus@24
  2302
}
icculus@24
  2303
icculus@35
  2304
DECLSPEC int SDLCALL
icculus@73
  2305
SDL_FillRect(SDL12_Surface *dst, SDL12_Rect *dstrect12, Uint32 color)
icculus@25
  2306
{
icculus@73
  2307
    SDL_Rect dstrect20;
icculus@73
  2308
    const int retval = SDL20_FillRect(dst->surface20, dstrect12 ? Rect12to20(dstrect12, &dstrect20) : NULL, color);
icculus@25
  2309
    if (retval != -1)
icculus@25
  2310
    {
icculus@73
  2311
        if (dstrect12) {  /* 1.2 stores the clip intersection in dstrect */
icculus@73
  2312
            SDL_Rect intersected20;
icculus@73
  2313
            SDL20_IntersectRect(&dstrect20, &dst->surface20->clip_rect, &intersected20);
icculus@73
  2314
            Rect20to12(&intersected20, dstrect12);
icculus@67
  2315
        }
icculus@25
  2316
    }
icculus@25
  2317
    return retval;
icculus@25
  2318
}
icculus@25
  2319
icculus@25
  2320
icculus@17
  2321
static SDL_PixelFormat *
icculus@31
  2322
PixelFormat12to20(SDL_PixelFormat *format20, SDL_Palette *palette20, const SDL12_PixelFormat *format12)
icculus@17
  2323
{
icculus@81
  2324
    if (format12->palette) {
icculus@81
  2325
        palette20->ncolors = format12->palette->ncolors;
icculus@81
  2326
        palette20->colors = format12->palette->colors;
icculus@81
  2327
        palette20->version = 1;
icculus@81
  2328
        palette20->refcount = 1;
icculus@81
  2329
        format20->palette = palette20;
icculus@81
  2330
    } else {
icculus@81
  2331
        format20->palette = NULL;
icculus@81
  2332
    }
icculus@81
  2333
icculus@34
  2334
    format20->format = SDL20_MasksToPixelFormatEnum(format12->BitsPerPixel, format12->Rmask, format12->Gmask, format12->Bmask, format12->Amask);
icculus@17
  2335
    format20->BitsPerPixel = format12->BitsPerPixel;
icculus@17
  2336
    format20->BytesPerPixel = format12->BytesPerPixel;
icculus@17
  2337
    format20->Rmask = format12->Rmask;
icculus@17
  2338
    format20->Gmask = format12->Gmask;
icculus@17
  2339
    format20->Bmask = format12->Bmask;
icculus@17
  2340
    format20->Amask = format12->Amask;
icculus@17
  2341
    format20->Rloss = format12->Rloss;
icculus@17
  2342
    format20->Gloss = format12->Gloss;
icculus@17
  2343
    format20->Bloss = format12->Bloss;
icculus@17
  2344
    format20->Aloss = format12->Aloss;
icculus@17
  2345
    format20->Rshift = format12->Rshift;
icculus@17
  2346
    format20->Gshift = format12->Gshift;
icculus@17
  2347
    format20->Bshift = format12->Bshift;
icculus@17
  2348
    format20->Ashift = format12->Ashift;
icculus@17
  2349
    format20->refcount = 1;
icculus@17
  2350
    format20->next = NULL;
icculus@17
  2351
    return format20;
icculus@17
  2352
}
icculus@17
  2353
icculus@35
  2354
DECLSPEC Uint32 SDLCALL
icculus@17
  2355
SDL_MapRGB(const SDL12_PixelFormat *format12, Uint8 r, Uint8 g, Uint8 b)
icculus@17
  2356
{
icculus@17
  2357
    /* This is probably way slower than apps expect. */
icculus@17
  2358
    SDL_PixelFormat format20;
icculus@17
  2359
    SDL_Palette palette20;
icculus@17
  2360
    return SDL20_MapRGB(PixelFormat12to20(&format20, &palette20, format12), r, g, b);
icculus@17
  2361
}
icculus@17
  2362
icculus@35
  2363
DECLSPEC Uint32 SDLCALL
icculus@17
  2364
SDL_MapRGBA(const SDL12_PixelFormat *format12, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
icculus@17
  2365
{
icculus@17
  2366
    /* This is probably way slower than apps expect. */
icculus@17
  2367
    SDL_PixelFormat format20;
icculus@17
  2368
    SDL_Palette palette20;
icculus@17
  2369
    return SDL20_MapRGBA(PixelFormat12to20(&format20, &palette20, format12), r, g, b, a);
icculus@17
  2370
}
icculus@17
  2371
icculus@35
  2372
DECLSPEC void SDLCALL
icculus@17
  2373
SDL_GetRGB(Uint32 pixel, const SDL12_PixelFormat *format12, Uint8 *r, Uint8 *g, Uint8 *b)
icculus@17
  2374
{
icculus@17
  2375
    /* This is probably way slower than apps expect. */
icculus@17
  2376
    SDL_PixelFormat format20;
icculus@17
  2377
    SDL_Palette palette20;
icculus@17
  2378
    return SDL20_GetRGB(pixel, PixelFormat12to20(&format20, &palette20, format12), r, g, b);
icculus@17
  2379
}
icculus@17
  2380
icculus@35
  2381
DECLSPEC void SDLCALL
icculus@17
  2382
SDL_GetRGBA(Uint32 pixel, const SDL12_PixelFormat *format12, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a)
icculus@17
  2383
{
icculus@17
  2384
    /* This is probably way slower than apps expect. */
icculus@17
  2385
    SDL_PixelFormat format20;
icculus@17
  2386
    SDL_Palette palette20;
icculus@31
  2387
    return SDL20_GetRGBA(pixel, PixelFormat12to20(&format20, &palette20, format12), r, g, b, a);
icculus@17
  2388
}
icculus@15
  2389
icculus@35
  2390
DECLSPEC const SDL12_VideoInfo * SDLCALL
icculus@9
  2391
SDL_GetVideoInfo(void)
icculus@9
  2392
{
icculus@9
  2393
    SDL_DisplayMode mode;
icculus@9
  2394
icculus@56
  2395
    FIXME("calculate this in Init12Video(), then this just does: return VideoInfo.vfmt ? &VideoInfo : NULL;");
icculus@39
  2396
icculus@56
  2397
    if (!VideoInfo12.vfmt && SDL20_GetDesktopDisplayMode(VideoDisplayIndex, &mode) == 0) {
icculus@56
  2398
        VideoInfo12.vfmt = SDL20_AllocFormat(mode.format);
icculus@56
  2399
        VideoInfo12.current_w = mode.w;
icculus@56
  2400
        VideoInfo12.current_h = mode.h;
icculus@56
  2401
        FIXME("vidinfo details commented out");
icculus@56
  2402
        //VideoInfo12.wm_available = 1;
icculus@56
  2403
        //VideoInfo12.video_mem = 1024 * 256;
icculus@9
  2404
    }
icculus@56
  2405
    return &VideoInfo12;
icculus@9
  2406
}
icculus@9
  2407
icculus@35
  2408
DECLSPEC int SDLCALL
icculus@9
  2409
SDL_VideoModeOK(int width, int height, int bpp, Uint32 sdl12flags)
icculus@9
  2410
{
icculus@9
  2411
    int i, nummodes, actual_bpp = 0;
icculus@9
  2412
icculus@9
  2413
    if (!SDL20_WasInit(SDL_INIT_VIDEO)) {
icculus@9
  2414
        return 0;
icculus@9
  2415
    }
icculus@9
  2416
icculus@9
  2417
    if (!(sdl12flags & SDL12_FULLSCREEN)) {
icculus@9
  2418
        SDL_DisplayMode mode;
icculus@16
  2419
        SDL20_GetDesktopDisplayMode(VideoDisplayIndex, &mode);
icculus@9
  2420
        return SDL_BITSPERPIXEL(mode.format);
icculus@9
  2421
    }
icculus@9
  2422
icculus@16
  2423
    nummodes = SDL20_GetNumDisplayModes(VideoDisplayIndex);
icculus@9
  2424
    for (i = 0; i < nummodes; ++i) {
icculus@9
  2425
        SDL_DisplayMode mode;
icculus@16
  2426
        SDL20_GetDisplayMode(VideoDisplayIndex, i, &mode);
icculus@9
  2427
        if (!mode.w || !mode.h || (width == mode.w && height == mode.h)) {
icculus@9
  2428
            if (!mode.format) {
icculus@9
  2429
                return bpp;
icculus@9
  2430
            }
icculus@9
  2431
            if (SDL_BITSPERPIXEL(mode.format) >= (Uint32) bpp) {
icculus@9
  2432
                actual_bpp = SDL_BITSPERPIXEL(mode.format);
icculus@9
  2433
            }
icculus@9
  2434
        }
icculus@9
  2435
    }
icculus@9
  2436
    return actual_bpp;
icculus@9
  2437
}
icculus@9
  2438
icculus@73
  2439
DECLSPEC SDL12_Rect ** SDLCALL
icculus@39
  2440
SDL_ListModes(const SDL12_PixelFormat *format12, Uint32 flags)
icculus@9
  2441
{
icculus@39
  2442
    Uint32 fmt;
icculus@39
  2443
    int i;
icculus@9
  2444
icculus@9
  2445
    if (!SDL20_WasInit(SDL_INIT_VIDEO)) {
icculus@9
  2446
        return NULL;
icculus@9
  2447
    }
icculus@9
  2448
icculus@56
  2449
    if ((!format12) && (!VideoInfo12.vfmt)) {
icculus@39
  2450
        SDL20_SetError("No pixel format specified");
icculus@39
  2451
        return NULL;
icculus@39
  2452
    }
icculus@39
  2453
icculus@9
  2454
    if (!(flags & SDL12_FULLSCREEN)) {
icculus@73
  2455
        return (SDL12_Rect **) (-1);  /* any resolution is fine. */
icculus@9
  2456
    }
icculus@9
  2457
icculus@39
  2458
    if (format12) {
icculus@39
  2459
        fmt = SDL20_MasksToPixelFormatEnum(format12->BitsPerPixel, format12->Rmask, format12->Gmask, format12->Bmask, format12->Amask);
icculus@39
  2460
    } else {
icculus@56
  2461
        fmt = VideoInfo12.vfmt->format;
icculus@9
  2462
    }
icculus@9
  2463
icculus@39
  2464
    for (i = 0; i < VideoModesCount; i++) {
icculus@39
  2465
        VideoModeList *modes = &VideoModes[i];
icculus@39
  2466
        if (modes->format == fmt) {
icculus@73
  2467
            return modes->modes12;
icculus@9
  2468
        }
icculus@9
  2469
    }
icculus@39
  2470
icculus@39
  2471
    SDL20_SetError("No modes support requested pixel format");
icculus@39
  2472
    return NULL;
icculus@9
  2473
}
icculus@9
  2474
icculus@35
  2475
DECLSPEC void SDLCALL
icculus@31
  2476
SDL_FreeCursor(SDL12_Cursor *cursor12)
icculus@31
  2477
{
icculus@51
  2478
    if (cursor12) {
icculus@31
  2479
        if (cursor12->wm_cursor)
icculus@31
  2480
            SDL20_FreeCursor(cursor12->wm_cursor);
icculus@31
  2481
        SDL20_free(cursor12->data);
icculus@31
  2482
        SDL20_free(cursor12->mask);
icculus@31
  2483
        SDL20_free(cursor12);
icculus@31
  2484
    }
icculus@31
  2485
}
icculus@23
  2486
icculus@35
  2487
DECLSPEC SDL12_Cursor * SDLCALL
icculus@23
  2488
SDL_CreateCursor(Uint8 *data, Uint8 *mask, int w, int h, int hot_x, int hot_y)
icculus@23
  2489
{
icculus@23
  2490
    const size_t datasize = h * (w / 8);
icculus@23
  2491
    SDL_Cursor *cursor20 = NULL;
icculus@23
  2492
    SDL12_Cursor *retval = NULL;
icculus@23
  2493
icculus@23
  2494
    retval = (SDL12_Cursor *) SDL20_malloc(sizeof (SDL12_Cursor));
icculus@23
  2495
    if (!retval)
icculus@23
  2496
        goto outofmem;
icculus@23
  2497
icculus@34
  2498
    SDL20_zerop(retval);
icculus@23
  2499
icculus@23
  2500
    retval->data = (Uint8 *) SDL20_malloc(datasize);
icculus@31
  2501
    if (!retval->data)
icculus@23
  2502
        goto outofmem;
icculus@23
  2503
icculus@23
  2504
    retval->mask = (Uint8 *) SDL20_malloc(datasize);
icculus@31
  2505
    if (!retval->mask)
icculus@23
  2506
        goto outofmem;
icculus@23
  2507
icculus@23
  2508
    cursor20 = SDL20_CreateCursor(data, mask, w, h, hot_x, hot_y);
icculus@23
  2509
    if (!cursor20)
icculus@23
  2510
        goto failed;
icculus@23
  2511
icculus@23
  2512
    retval->area.w = w;
icculus@23
  2513
    retval->area.h = h;
icculus@23
  2514
    retval->hot_x = hot_x;
icculus@23
  2515
    retval->hot_y = hot_y;
icculus@23
  2516
    retval->wm_cursor = cursor20;
icculus@23
  2517
    /* we always leave retval->save as null pointers. */
icculus@23
  2518
icculus@23
  2519
    SDL20_memcpy(retval->data, data, datasize);
icculus@23
  2520
    SDL20_memcpy(retval->mask, mask, datasize);
icculus@23
  2521
icculus@23
  2522
    return retval;
icculus@23
  2523
icculus@23
  2524
outofmem:
icculus@31
  2525
    SDL20_OutOfMemory();
icculus@23
  2526
icculus@23
  2527
failed:
icculus@23
  2528
    SDL_FreeCursor(retval);
icculus@23
  2529
    return NULL;
icculus@23
  2530
}
icculus@23
  2531
icculus@35
  2532
DECLSPEC void SDLCALL
icculus@23
  2533
SDL_SetCursor(SDL12_Cursor *cursor)
icculus@23
  2534
{
icculus@56
  2535
    CurrentCursor12 = cursor;
icculus@23
  2536
    SDL20_SetCursor(cursor ? cursor->wm_cursor : NULL);
icculus@23
  2537
}
icculus@23
  2538
icculus@35
  2539
DECLSPEC SDL12_Cursor * SDLCALL
icculus@23
  2540
SDL_GetCursor(void)
icculus@23
  2541
{
icculus@56
  2542
    return CurrentCursor12;
icculus@23
  2543
}
icculus@23
  2544
icculus@9
  2545
static void
icculus@59
  2546
GetEnvironmentWindowPosition(int *x, int *y)
icculus@9
  2547
{
icculus@16
  2548
    int display = VideoDisplayIndex;
icculus@58
  2549
    const char *window = SDL20_getenv("SDL_VIDEO_WINDOW_POS");
icculus@58
  2550
    const char *center = SDL20_getenv("SDL_VIDEO_CENTERED");
icculus@9
  2551
    if (window) {
icculus@58
  2552
        if (SDL20_strcmp(window, "center") == 0) {
icculus@58
  2553
            center = window;
icculus@58
  2554
        } else if (SDL20_sscanf(window, "%d,%d", x, y) == 2) {
icculus@9
  2555
            return;
icculus@9
  2556
        }
icculus@9
  2557
    }
icculus@58
  2558
icculus@9
  2559
    if (center) {
icculus@9
  2560
        *x = SDL_WINDOWPOS_CENTERED_DISPLAY(display);
icculus@9
  2561
        *y = SDL_WINDOWPOS_CENTERED_DISPLAY(display);
icculus@9
  2562
    }
icculus@9
  2563
}
icculus@9
  2564
icculus@9
  2565
static void
icculus@49
  2566
SetupScreenSaver(const int flags12)
icculus@9
  2567
{
icculus@9
  2568
    const char *env;
icculus@9
  2569
    SDL_bool allow_screensaver;
icculus@9
  2570
icculus@9
  2571
    /* Allow environment override of screensaver disable */
icculus@58
  2572
    env = SDL20_getenv("SDL_VIDEO_ALLOW_SCREENSAVER");
icculus@9
  2573
    if (env) {
icculus@34
  2574
        allow_screensaver = SDL20_atoi(env) ? SDL_TRUE : SDL_FALSE;
icculus@19
  2575
    } else if (flags12 & SDL12_FULLSCREEN) {
icculus@9
  2576
        allow_screensaver = SDL_FALSE;
icculus@9
  2577
    } else {
icculus@9
  2578
        allow_screensaver = SDL_TRUE;
icculus@9
  2579
    }
icculus@9
  2580
    if (allow_screensaver) {
icculus@17
  2581
        SDL20_EnableScreenSaver();
icculus@9
  2582
    } else {
icculus@17
  2583
        SDL20_DisableScreenSaver();
icculus@9
  2584
    }
icculus@9
  2585
}
icculus@9
  2586
icculus@9
  2587
icculus@59
  2588
static SDL12_Surface *
icculus@59
  2589
EndVidModeCreate(void)
icculus@59
  2590
{
icculus@59
  2591
    if (VideoTexture20) {
icculus@59
  2592
        SDL20_DestroyTexture(VideoTexture20);
icculus@59
  2593
        VideoTexture20 = NULL;
icculus@59
  2594
    }
icculus@59
  2595
    if (VideoRenderer20) {
icculus@59
  2596
        SDL20_DestroyRenderer(VideoRenderer20);
icculus@59
  2597
        VideoRenderer20 = NULL;
icculus@59
  2598
    }
icculus@59
  2599
    if (VideoGLContext20) {
icculus@59
  2600
        SDL20_GL_MakeCurrent(NULL, NULL);
icculus@59
  2601
        SDL20_GL_DeleteContext(VideoGLContext20);
icculus@59
  2602
        VideoGLContext20 = NULL;
icculus@59
  2603
    }
icculus@59
  2604
    if (VideoWindow20) {
icculus@59
  2605
        SDL20_DestroyWindow(VideoWindow20);
icculus@59
  2606
        VideoWindow20 = NULL;
icculus@59
  2607
    }
icculus@59
  2608
    if (VideoSurface12) {
icculus@59
  2609
        SDL20_free(VideoSurface12->pixels);
icculus@59
  2610
        VideoSurface12->pixels = NULL;
icculus@59
  2611
        SDL_FreeSurface(VideoSurface12);
icculus@59
  2612
        VideoSurface12 = NULL;
icculus@59
  2613
    }
icculus@59
  2614
    if (VideoConvertSurface20) {
icculus@59
  2615
        SDL20_FreeSurface(VideoConvertSurface20);
icculus@59
  2616
        VideoConvertSurface20 = NULL;
icculus@59
  2617
    }
icculus@59
  2618
    return NULL;
icculus@59
  2619
}
icculus@59
  2620
icculus@59
  2621
icculus@59
  2622
static SDL12_Surface *
icculus@59
  2623
CreateSurface12WithFormat(const int w, const int h, const Uint32 fmt)
icculus@59
  2624
{
icculus@59
  2625
    Uint32 rmask, gmask, bmask, amask;
icculus@59
  2626
    int bpp;
icculus@59
  2627
    if (!SDL20_PixelFormatEnumToMasks(fmt, &bpp, &rmask, &gmask, &bmask, &amask)) {
icculus@59
  2628
        return NULL;
icculus@59
  2629
    }
icculus@59
  2630
    return SDL_CreateRGBSurface(0, w, h, bpp, rmask, gmask, bmask, amask);
icculus@59
  2631
}
icculus@59
  2632
icculus@59
  2633
static SDL_Surface *
icculus@59
  2634
CreateNullPixelSurface20(const int width, const int height, const Uint32 fmt)
icculus@59
  2635
{
icculus@59
  2636
    SDL_Surface *surface20 = SDL20_CreateRGBSurfaceWithFormat(0, 0, 0, SDL_BITSPERPIXEL(fmt), fmt);
icculus@59
  2637
    if (surface20) {
icculus@59
  2638
        surface20->flags |= SDL_PREALLOC;
icculus@59
  2639
        surface20->pixels = NULL;
icculus@59
  2640
        surface20->w = width;
icculus@59
  2641
        surface20->h = height;
icculus@59
  2642
        surface20->pitch = 0;
icculus@59
  2643
        SDL20_SetClipRect(surface20, NULL);
icculus@59
  2644
    }
icculus@59
  2645
    return surface20;
icculus@59
  2646
}
icculus@59
  2647
icculus@59
  2648
icculus@35
  2649
DECLSPEC SDL12_Surface * SDLCALL
icculus@19
  2650
SDL_SetVideoMode(int width, int height, int bpp, Uint32 flags12)
icculus@9
  2651
{
icculus@59
  2652
    FIXME("currently ignores SDL_WINDOWID, which we could use with SDL_CreateWindowFrom ...?");
icculus@59
  2653
    SDL_DisplayMode dmode;
icculus@59
  2654
    Uint32 fullscreen_flags20 = 0;
icculus@59
  2655
    Uint32 appfmt;
icculus@59
  2656
icculus@59
  2657
    /* SDL_SetVideoMode() implicitly inits if necessary. */
icculus@59
  2658
    if (SDL20_WasInit(SDL_INIT_VIDEO) == 0) {
icculus@59
  2659
        if (SDL20_Init(SDL_INIT_VIDEO) < 0) {
icculus@59
  2660
            return NULL;
icculus@59
  2661
        }
icculus@59
  2662
    }
icculus@59
  2663
icculus@59
  2664
    if ((flags12 & SDL12_OPENGLBLIT) == SDL12_OPENGLBLIT) {
icculus@59
  2665
        FIXME("No OPENGLBLIT support at the moment");
icculus@59
  2666
        SDL20_SetError("SDL_OPENGLBLIT is (currently) unsupported");
icculus@59
  2667
        return NULL;
icculus@59
  2668
    }
icculus@59
  2669
icculus@59
  2670
    FIXME("handle SDL_ANYFORMAT");
icculus@59
  2671
icculus@59
  2672
    if ((width < 0) || (height < 0)) {
icculus@59
  2673
        SDL20_SetError("Invalid width or height");
icculus@59
  2674
        return NULL;
icculus@59
  2675
    }
icculus@59
  2676
icculus@59
  2677
    FIXME("There's an environment variable to choose a display");
icculus@59
  2678
    if (SDL20_GetCurrentDisplayMode(0, &dmode) < 0) {
icculus@59
  2679
        return NULL;
icculus@59
  2680
    }
icculus@59
  2681
icculus@59
  2682
    if (width == 0) {
icculus@59
  2683
        width = dmode.w;
icculus@59
  2684
    }
icculus@59
  2685
icculus@59
  2686
    if (height == 0) {
icculus@59
  2687
        height = dmode.h;
icculus@59
  2688
    }
icculus@59
  2689
icculus@59
  2690
    if (bpp == 0) {
icculus@59
  2691
        bpp = SDL_BITSPERPIXEL(dmode.format);
icculus@59
  2692
    }
icculus@59
  2693
icculus@59
  2694
    switch (bpp) {
icculus@59
  2695
        case  8: appfmt = SDL_PIXELFORMAT_INDEX8; break;
icculus@59
  2696
        case 16: appfmt = SDL_PIXELFORMAT_RGB565; FIXME("bgr instead of rgb?"); break;
icculus@59
  2697
        case 24: appfmt = SDL_PIXELFORMAT_RGB24; FIXME("bgr instead of rgb?"); break;
icculus@59
  2698
        case 32: appfmt = SDL_PIXELFORMAT_ARGB8888; FIXME("bgr instead of rgb?"); break;
icculus@59
  2699
        default: SDL20_SetError("Unsupported bits-per-pixel"); return NULL;
icculus@59
  2700
    }
icculus@59
  2701
icculus@59
  2702
    SDL_assert((VideoSurface12 != NULL) == (VideoWindow20 != NULL));
icculus@59
  2703
icculus@59
  2704
    FIXME("don't do anything if the window's dimensions, etc haven't chang