src/joystick/windows/SDL_mmjoystick.c
author Philipp Wiesemann <philipp.wiesemann@arcor.de>
Wed, 15 Apr 2015 21:29:55 +0200
changeset 9561 d8ad01792399
parent 9433 bd062398b648
child 9619 b94b6d0bff0f
permissions -rw-r--r--
Fixed typo in internal joystick documentation comments.
slouken@0
     1
/*
slouken@5535
     2
  Simple DirectMedia Layer
slouken@8149
     3
  Copyright (C) 1997-2014 Sam Lantinga <slouken@libsdl.org>
slouken@0
     4
slouken@5535
     5
  This software is provided 'as-is', without any express or implied
slouken@5535
     6
  warranty.  In no event will the authors be held liable for any damages
slouken@5535
     7
  arising from the use of this software.
slouken@0
     8
slouken@5535
     9
  Permission is granted to anyone to use this software for any purpose,
slouken@5535
    10
  including commercial applications, and to alter it and redistribute it
slouken@5535
    11
  freely, subject to the following restrictions:
slouken@0
    12
slouken@5535
    13
  1. The origin of this software must not be misrepresented; you must not
slouken@5535
    14
     claim that you wrote the original software. If you use this software
slouken@5535
    15
     in a product, an acknowledgment in the product documentation would be
slouken@5535
    16
     appreciated but is not required.
slouken@5535
    17
  2. Altered source versions must be plainly marked as such, and must not be
slouken@5535
    18
     misrepresented as being the original software.
slouken@5535
    19
  3. This notice may not be removed or altered from any source distribution.
slouken@0
    20
*/
icculus@8093
    21
#include "../../SDL_internal.h"
slouken@0
    22
slouken@1635
    23
#ifdef SDL_JOYSTICK_WINMM
slouken@1635
    24
slouken@0
    25
/* Win32 MultiMedia Joystick driver, contributed by Andrei de A. Formiga */
slouken@0
    26
slouken@5090
    27
#include "../../core/windows/SDL_windows.h"
slouken@1358
    28
#include <mmsystem.h>
slouken@1358
    29
#include <regstr.h>
slouken@1358
    30
slouken@1330
    31
#include "SDL_events.h"
slouken@0
    32
#include "SDL_joystick.h"
slouken@1361
    33
#include "../SDL_sysjoystick.h"
slouken@1361
    34
#include "../SDL_joystick_c.h"
slouken@0
    35
slouken@7828
    36
#ifdef REGSTR_VAL_JOYOEMNAME 
slouken@7828
    37
#undef REGSTR_VAL_JOYOEMNAME 
slouken@7828
    38
#endif
slouken@7828
    39
#define REGSTR_VAL_JOYOEMNAME "OEMName"
slouken@7828
    40
slouken@7191
    41
#define MAX_JOYSTICKS   16
slouken@7191
    42
#define MAX_AXES    6       /* each joystick can have up to 6 axes */
slouken@7191
    43
#define MAX_BUTTONS 32      /* and 32 buttons                      */
slouken@7191
    44
#define AXIS_MIN    -32768  /* minimum value for axis coordinate */
slouken@7191
    45
#define AXIS_MAX    32767   /* maximum value for axis coordinate */
slouken@834
    46
/* limit axis to 256 possible positions to filter out noise */
slouken@834
    47
#define JOY_AXIS_THRESHOLD      (((AXIS_MAX)-(AXIS_MIN))/256)
slouken@7191
    48
#define JOY_BUTTON_FLAG(n)  (1<<n)
slouken@0
    49
slouken@0
    50
slouken@0
    51
/* array to hold joystick ID values */
slouken@1895
    52
static UINT SYS_JoystickID[MAX_JOYSTICKS];
slouken@7828
    53
static JOYCAPSA SYS_Joystick[MAX_JOYSTICKS];
slouken@1895
    54
static char *SYS_JoystickName[MAX_JOYSTICKS];
slouken@0
    55
slouken@0
    56
/* The private structure used to keep track of a joystick */
slouken@0
    57
struct joystick_hwdata
slouken@0
    58
{
slouken@1895
    59
    /* joystick ID */
slouken@1895
    60
    UINT id;
slouken@0
    61
slouken@1895
    62
    /* values used to translate device-specific coordinates into
slouken@1895
    63
       SDL-standard ranges */
slouken@1895
    64
    struct _transaxis
slouken@1895
    65
    {
slouken@1895
    66
        int offset;
slouken@1895
    67
        float scale;
slouken@1895
    68
    } transaxis[6];
slouken@0
    69
};
slouken@0
    70
slouken@5062
    71
/* Convert a Windows Multimedia API return code to a text message */
slouken@0
    72
static void SetMMerror(char *function, int code);
slouken@0
    73
slouken@0
    74
slouken@1895
    75
static char *
slouken@1895
    76
GetJoystickName(int index, const char *szRegKey)
slouken@937
    77
{
slouken@1895
    78
    /* added 7/24/2004 by Eckhard Stolberg */
slouken@1895
    79
    /*
slouken@1895
    80
       see if there is a joystick for the current
slouken@1895
    81
       index (1-16) listed in the registry
slouken@1895
    82
     */
slouken@1895
    83
    char *name = NULL;
slouken@2176
    84
    HKEY hTopKey;
slouken@1895
    85
    HKEY hKey;
slouken@1895
    86
    DWORD regsize;
slouken@1895
    87
    LONG regresult;
slouken@2176
    88
    char regkey[256];
slouken@2176
    89
    char regvalue[256];
slouken@2176
    90
    char regname[256];
slouken@937
    91
slouken@2176
    92
    SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s\\%s",
slouken@1895
    93
                 REGSTR_PATH_JOYCONFIG, szRegKey, REGSTR_KEY_JOYCURR);
slouken@2176
    94
    hTopKey = HKEY_LOCAL_MACHINE;
slouken@2176
    95
    regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey);
slouken@2176
    96
    if (regresult != ERROR_SUCCESS) {
slouken@2176
    97
        hTopKey = HKEY_CURRENT_USER;
slouken@2176
    98
        regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey);
slouken@2176
    99
    }
slouken@2176
   100
    if (regresult != ERROR_SUCCESS) {
slouken@2176
   101
        return NULL;
slouken@2176
   102
    }
slouken@2176
   103
slouken@2176
   104
    /* find the registry key name for the joystick's properties */
slouken@2176
   105
    regsize = sizeof(regname);
slouken@2176
   106
    SDL_snprintf(regvalue, SDL_arraysize(regvalue), "Joystick%d%s", index + 1,
slouken@2176
   107
                 REGSTR_VAL_JOYOEMNAME);
slouken@2176
   108
    regresult =
slouken@2176
   109
        RegQueryValueExA(hKey, regvalue, 0, 0, (LPBYTE) regname, &regsize);
slouken@2176
   110
    RegCloseKey(hKey);
slouken@2176
   111
slouken@2176
   112
    if (regresult != ERROR_SUCCESS) {
slouken@2176
   113
        return NULL;
slouken@2176
   114
    }
slouken@2176
   115
slouken@2176
   116
    /* open that registry key */
slouken@2176
   117
    SDL_snprintf(regkey, SDL_arraysize(regkey), "%s\\%s", REGSTR_PATH_JOYOEM,
slouken@2176
   118
                 regname);
slouken@2176
   119
    regresult = RegOpenKeyExA(hTopKey, regkey, 0, KEY_READ, &hKey);
slouken@2176
   120
    if (regresult != ERROR_SUCCESS) {
slouken@2176
   121
        return NULL;
slouken@2176
   122
    }
slouken@2176
   123
slouken@2176
   124
    /* find the size for the OEM name text */
slouken@2176
   125
    regsize = sizeof(regvalue);
slouken@2176
   126
    regresult =
slouken@2176
   127
        RegQueryValueExA(hKey, REGSTR_VAL_JOYOEMNAME, 0, 0, NULL, &regsize);
slouken@1895
   128
    if (regresult == ERROR_SUCCESS) {
slouken@2176
   129
        /* allocate enough memory for the OEM name text ... */
slouken@2176
   130
        name = (char *) SDL_malloc(regsize);
slouken@2176
   131
        if (name) {
slouken@2176
   132
            /* ... and read it from the registry */
slouken@2176
   133
            regresult = RegQueryValueExA(hKey,
slouken@1895
   134
                                         REGSTR_VAL_JOYOEMNAME, 0, 0,
slouken@2176
   135
                                         (LPBYTE) name, &regsize);
slouken@1895
   136
        }
slouken@1895
   137
    }
slouken@2176
   138
    RegCloseKey(hKey);
slouken@2176
   139
slouken@1895
   140
    return (name);
slouken@937
   141
}
slouken@937
   142
slouken@6698
   143
static int SDL_SYS_numjoysticks = 0;
slouken@6698
   144
slouken@0
   145
/* Function to scan the system for joysticks.
philipp@9311
   146
 * Joystick 0 should be the system default joystick.
slouken@0
   147
 * It should return 0, or -1 on an unrecoverable fatal error.
slouken@0
   148
 */
slouken@1895
   149
int
slouken@1895
   150
SDL_SYS_JoystickInit(void)
slouken@0
   151
{
slouken@1895
   152
    int i;
slouken@1895
   153
    int maxdevs;
slouken@1895
   154
    JOYINFOEX joyinfo;
slouken@7828
   155
    JOYCAPSA joycaps;
slouken@1895
   156
    MMRESULT result;
slouken@0
   157
slouken@1895
   158
    /* Reset the joystick ID & name mapping tables */
slouken@1895
   159
    for (i = 0; i < MAX_JOYSTICKS; ++i) {
slouken@1895
   160
        SYS_JoystickID[i] = 0;
slouken@1895
   161
        SYS_JoystickName[i] = NULL;
slouken@1895
   162
    }
slouken@531
   163
slouken@1895
   164
    /* Loop over all potential joystick devices */
slouken@6698
   165
    SDL_SYS_numjoysticks = 0;
slouken@1895
   166
    maxdevs = joyGetNumDevs();
slouken@6698
   167
    for (i = JOYSTICKID1; i < maxdevs && SDL_SYS_numjoysticks < MAX_JOYSTICKS; ++i) {
slouken@1895
   168
slouken@1895
   169
        joyinfo.dwSize = sizeof(joyinfo);
slouken@1895
   170
        joyinfo.dwFlags = JOY_RETURNALL;
icculus@2061
   171
        result = joyGetPosEx(i, &joyinfo);
slouken@1895
   172
        if (result == JOYERR_NOERROR) {
slouken@7828
   173
            result = joyGetDevCapsA(i, &joycaps, sizeof(joycaps));
slouken@1895
   174
            if (result == JOYERR_NOERROR) {
slouken@6698
   175
                SYS_JoystickID[SDL_SYS_numjoysticks] = i;
slouken@6698
   176
                SYS_Joystick[SDL_SYS_numjoysticks] = joycaps;
slouken@6698
   177
                SYS_JoystickName[SDL_SYS_numjoysticks] =
slouken@1895
   178
                    GetJoystickName(i, joycaps.szRegKey);
slouken@6698
   179
                SDL_SYS_numjoysticks++;
slouken@1895
   180
            }
slouken@1895
   181
        }
slouken@1895
   182
    }
slouken@6698
   183
    return (SDL_SYS_numjoysticks);
slouken@0
   184
}
slouken@0
   185
slouken@6707
   186
int SDL_SYS_NumJoysticks()
slouken@6707
   187
{
slouken@6707
   188
    return SDL_SYS_numjoysticks;
slouken@6707
   189
}
slouken@6707
   190
slouken@6707
   191
void SDL_SYS_JoystickDetect()
slouken@6707
   192
{
slouken@6707
   193
}
slouken@6707
   194
slouken@0
   195
/* Function to get the device-dependent name of a joystick */
slouken@1895
   196
const char *
slouken@6707
   197
SDL_SYS_JoystickNameForDeviceIndex(int device_index)
slouken@0
   198
{
slouken@6707
   199
    if (SYS_JoystickName[device_index] != NULL) {
slouken@6707
   200
        return (SYS_JoystickName[device_index]);
slouken@1895
   201
    } else {
slouken@6707
   202
        return (SYS_Joystick[device_index].szPname);
slouken@1895
   203
    }
slouken@0
   204
}
slouken@0
   205
slouken@6707
   206
/* Function to perform the mapping from device index to the instance id for this index */
slouken@6707
   207
SDL_JoystickID SDL_SYS_GetInstanceIdOfDeviceIndex(int device_index)
slouken@6707
   208
{
slouken@6707
   209
    return device_index;
slouken@6707
   210
}
slouken@6707
   211
slouken@0
   212
/* Function to open a joystick for use.
philipp@9380
   213
   The joystick to open is specified by the device index.
slouken@0
   214
   This should fill the nbuttons and naxes fields of the joystick structure.
slouken@0
   215
   It returns 0, or -1 if there is an error.
slouken@0
   216
 */
slouken@1895
   217
int
slouken@6698
   218
SDL_SYS_JoystickOpen(SDL_Joystick * joystick, int device_index)
slouken@0
   219
{
slouken@1895
   220
    int index, i;
slouken@1895
   221
    int caps_flags[MAX_AXES - 2] =
slouken@1895
   222
        { JOYCAPS_HASZ, JOYCAPS_HASR, JOYCAPS_HASU, JOYCAPS_HASV };
slouken@1895
   223
    int axis_min[MAX_AXES], axis_max[MAX_AXES];
slouken@0
   224
slouken@0
   225
slouken@1895
   226
    /* shortcut */
slouken@6698
   227
    index = device_index;
slouken@1895
   228
    axis_min[0] = SYS_Joystick[index].wXmin;
slouken@1895
   229
    axis_max[0] = SYS_Joystick[index].wXmax;
slouken@1895
   230
    axis_min[1] = SYS_Joystick[index].wYmin;
slouken@1895
   231
    axis_max[1] = SYS_Joystick[index].wYmax;
slouken@1895
   232
    axis_min[2] = SYS_Joystick[index].wZmin;
slouken@1895
   233
    axis_max[2] = SYS_Joystick[index].wZmax;
slouken@1895
   234
    axis_min[3] = SYS_Joystick[index].wRmin;
slouken@1895
   235
    axis_max[3] = SYS_Joystick[index].wRmax;
slouken@1895
   236
    axis_min[4] = SYS_Joystick[index].wUmin;
slouken@1895
   237
    axis_max[4] = SYS_Joystick[index].wUmax;
slouken@1895
   238
    axis_min[5] = SYS_Joystick[index].wVmin;
slouken@1895
   239
    axis_max[5] = SYS_Joystick[index].wVmax;
slouken@0
   240
slouken@1895
   241
    /* allocate memory for system specific hardware data */
slouken@6698
   242
    joystick->instance_id = device_index;
slouken@1895
   243
    joystick->hwdata =
slouken@1895
   244
        (struct joystick_hwdata *) SDL_malloc(sizeof(*joystick->hwdata));
slouken@1895
   245
    if (joystick->hwdata == NULL) {
icculus@7037
   246
        return SDL_OutOfMemory();
slouken@1895
   247
    }
slouken@1895
   248
    SDL_memset(joystick->hwdata, 0, sizeof(*joystick->hwdata));
slouken@0
   249
slouken@1895
   250
    /* set hardware data */
slouken@1895
   251
    joystick->hwdata->id = SYS_JoystickID[index];
slouken@1895
   252
    for (i = 0; i < MAX_AXES; ++i) {
slouken@1895
   253
        if ((i < 2) || (SYS_Joystick[index].wCaps & caps_flags[i - 2])) {
slouken@1895
   254
            joystick->hwdata->transaxis[i].offset = AXIS_MIN - axis_min[i];
slouken@1895
   255
            joystick->hwdata->transaxis[i].scale =
slouken@1895
   256
                (float) (AXIS_MAX - AXIS_MIN) / (axis_max[i] - axis_min[i]);
slouken@1895
   257
        } else {
slouken@1895
   258
            joystick->hwdata->transaxis[i].offset = 0;
slouken@1895
   259
            joystick->hwdata->transaxis[i].scale = 1.0; /* Just in case */
slouken@1895
   260
        }
slouken@1895
   261
    }
slouken@0
   262
slouken@1895
   263
    /* fill nbuttons, naxes, and nhats fields */
slouken@1895
   264
    joystick->nbuttons = SYS_Joystick[index].wNumButtons;
slouken@1895
   265
    joystick->naxes = SYS_Joystick[index].wNumAxes;
slouken@1895
   266
    if (SYS_Joystick[index].wCaps & JOYCAPS_HASPOV) {
slouken@1895
   267
        joystick->nhats = 1;
slouken@1895
   268
    } else {
slouken@1895
   269
        joystick->nhats = 0;
slouken@1895
   270
    }
slouken@1895
   271
    return (0);
slouken@0
   272
}
slouken@0
   273
philipp@9561
   274
/* Function to determine if this joystick is attached to the system right now */
slouken@6707
   275
SDL_bool SDL_SYS_JoystickAttached(SDL_Joystick *joystick)
slouken@6707
   276
{
slouken@6707
   277
    return SDL_TRUE;
slouken@6707
   278
}
slouken@6707
   279
slouken@1895
   280
static Uint8
slouken@1895
   281
TranslatePOV(DWORD value)
slouken@0
   282
{
slouken@1895
   283
    Uint8 pos;
slouken@0
   284
slouken@1895
   285
    pos = SDL_HAT_CENTERED;
slouken@1895
   286
    if (value != JOY_POVCENTERED) {
slouken@1895
   287
        if ((value > JOY_POVLEFT) || (value < JOY_POVRIGHT)) {
slouken@1895
   288
            pos |= SDL_HAT_UP;
slouken@1895
   289
        }
slouken@1895
   290
        if ((value > JOY_POVFORWARD) && (value < JOY_POVBACKWARD)) {
slouken@1895
   291
            pos |= SDL_HAT_RIGHT;
slouken@1895
   292
        }
slouken@1895
   293
        if ((value > JOY_POVRIGHT) && (value < JOY_POVLEFT)) {
slouken@1895
   294
            pos |= SDL_HAT_DOWN;
slouken@1895
   295
        }
slouken@1895
   296
        if (value > JOY_POVBACKWARD) {
slouken@1895
   297
            pos |= SDL_HAT_LEFT;
slouken@1895
   298
        }
slouken@1895
   299
    }
slouken@1895
   300
    return (pos);
slouken@0
   301
}
slouken@0
   302
slouken@0
   303
/* Function to update the state of a joystick - called as a device poll.
slouken@0
   304
 * This function shouldn't update the joystick structure directly,
slouken@0
   305
 * but instead should call SDL_PrivateJoystick*() to deliver events
slouken@0
   306
 * and update joystick device state.
slouken@0
   307
 */
slouken@1895
   308
void
slouken@1895
   309
SDL_SYS_JoystickUpdate(SDL_Joystick * joystick)
slouken@0
   310
{
slouken@1895
   311
    MMRESULT result;
slouken@1895
   312
    int i;
slouken@1895
   313
    DWORD flags[MAX_AXES] = { JOY_RETURNX, JOY_RETURNY, JOY_RETURNZ,
slouken@1895
   314
        JOY_RETURNR, JOY_RETURNU, JOY_RETURNV
slouken@1895
   315
    };
slouken@1895
   316
    DWORD pos[MAX_AXES];
slouken@1895
   317
    struct _transaxis *transaxis;
slouken@1895
   318
    int value, change;
slouken@1895
   319
    JOYINFOEX joyinfo;
slouken@0
   320
slouken@1895
   321
    joyinfo.dwSize = sizeof(joyinfo);
slouken@1895
   322
    joyinfo.dwFlags = JOY_RETURNALL | JOY_RETURNPOVCTS;
slouken@1895
   323
    if (!joystick->hats) {
slouken@1895
   324
        joyinfo.dwFlags &= ~(JOY_RETURNPOV | JOY_RETURNPOVCTS);
slouken@1895
   325
    }
slouken@1895
   326
    result = joyGetPosEx(joystick->hwdata->id, &joyinfo);
slouken@1895
   327
    if (result != JOYERR_NOERROR) {
slouken@1895
   328
        SetMMerror("joyGetPosEx", result);
slouken@1895
   329
        return;
slouken@1895
   330
    }
slouken@0
   331
slouken@1895
   332
    /* joystick motion events */
slouken@1895
   333
    pos[0] = joyinfo.dwXpos;
slouken@1895
   334
    pos[1] = joyinfo.dwYpos;
slouken@1895
   335
    pos[2] = joyinfo.dwZpos;
slouken@1895
   336
    pos[3] = joyinfo.dwRpos;
slouken@1895
   337
    pos[4] = joyinfo.dwUpos;
slouken@1895
   338
    pos[5] = joyinfo.dwVpos;
slouken@0
   339
slouken@1895
   340
    transaxis = joystick->hwdata->transaxis;
slouken@1895
   341
    for (i = 0; i < joystick->naxes; i++) {
slouken@1895
   342
        if (joyinfo.dwFlags & flags[i]) {
slouken@1895
   343
            value =
slouken@1895
   344
                (int) (((float) pos[i] +
slouken@1895
   345
                        transaxis[i].offset) * transaxis[i].scale);
slouken@1895
   346
            change = (value - joystick->axes[i]);
slouken@1895
   347
            if ((change < -JOY_AXIS_THRESHOLD)
slouken@1895
   348
                || (change > JOY_AXIS_THRESHOLD)) {
slouken@1895
   349
                SDL_PrivateJoystickAxis(joystick, (Uint8) i, (Sint16) value);
slouken@1895
   350
            }
slouken@1895
   351
        }
slouken@1895
   352
    }
slouken@0
   353
slouken@1895
   354
    /* joystick button events */
slouken@1895
   355
    if (joyinfo.dwFlags & JOY_RETURNBUTTONS) {
slouken@1895
   356
        for (i = 0; i < joystick->nbuttons; ++i) {
slouken@1895
   357
            if (joyinfo.dwButtons & JOY_BUTTON_FLAG(i)) {
slouken@1895
   358
                if (!joystick->buttons[i]) {
slouken@1895
   359
                    SDL_PrivateJoystickButton(joystick, (Uint8) i,
slouken@1895
   360
                                              SDL_PRESSED);
slouken@1895
   361
                }
slouken@1895
   362
            } else {
slouken@1895
   363
                if (joystick->buttons[i]) {
slouken@1895
   364
                    SDL_PrivateJoystickButton(joystick, (Uint8) i,
slouken@1895
   365
                                              SDL_RELEASED);
slouken@1895
   366
                }
slouken@1895
   367
            }
slouken@1895
   368
        }
slouken@1895
   369
    }
slouken@0
   370
slouken@1895
   371
    /* joystick hat events */
slouken@1895
   372
    if (joyinfo.dwFlags & JOY_RETURNPOV) {
slouken@1895
   373
        Uint8 pos;
slouken@0
   374
slouken@1895
   375
        pos = TranslatePOV(joyinfo.dwPOV);
slouken@1895
   376
        if (pos != joystick->hats[0]) {
slouken@1895
   377
            SDL_PrivateJoystickHat(joystick, 0, pos);
slouken@1895
   378
        }
slouken@1895
   379
    }
slouken@0
   380
}
slouken@0
   381
slouken@0
   382
/* Function to close a joystick after use */
slouken@1895
   383
void
slouken@1895
   384
SDL_SYS_JoystickClose(SDL_Joystick * joystick)
slouken@0
   385
{
slouken@7719
   386
    SDL_free(joystick->hwdata);
slouken@0
   387
}
slouken@0
   388
slouken@0
   389
/* Function to perform any system-specific joystick related cleanup */
slouken@1895
   390
void
slouken@1895
   391
SDL_SYS_JoystickQuit(void)
slouken@0
   392
{
slouken@1895
   393
    int i;
slouken@1895
   394
    for (i = 0; i < MAX_JOYSTICKS; i++) {
slouken@7719
   395
        SDL_free(SYS_JoystickName[i]);
slouken@7719
   396
        SYS_JoystickName[i] = NULL;
slouken@1895
   397
    }
slouken@0
   398
}
slouken@0
   399
slouken@6738
   400
SDL_JoystickGUID SDL_SYS_JoystickGetDeviceGUID( int device_index )
slouken@6698
   401
{
slouken@6738
   402
    SDL_JoystickGUID guid;
slouken@7191
   403
    /* the GUID is just the first 16 chars of the name for now */
slouken@6707
   404
    const char *name = SDL_SYS_JoystickNameForDeviceIndex( device_index );
slouken@6698
   405
    SDL_zero( guid );
slouken@6698
   406
    SDL_memcpy( &guid, name, SDL_min( sizeof(guid), SDL_strlen( name ) ) );
slouken@6698
   407
    return guid;
slouken@6698
   408
}
slouken@6698
   409
slouken@6738
   410
SDL_JoystickGUID SDL_SYS_JoystickGetGUID(SDL_Joystick * joystick)
slouken@6698
   411
{
slouken@6738
   412
    SDL_JoystickGUID guid;
slouken@7191
   413
    /* the GUID is just the first 16 chars of the name for now */
slouken@6698
   414
    const char *name = joystick->name;
slouken@6698
   415
    SDL_zero( guid );
slouken@6698
   416
    SDL_memcpy( &guid, name, SDL_min( sizeof(guid), SDL_strlen( name ) ) );
slouken@6698
   417
    return guid;
slouken@6698
   418
}
slouken@6698
   419
slouken@0
   420
slouken@0
   421
/* implementation functions */
slouken@1895
   422
void
slouken@1895
   423
SetMMerror(char *function, int code)
slouken@0
   424
{
slouken@1895
   425
    static char *error;
slouken@1895
   426
    static char errbuf[1024];
slouken@0
   427
slouken@1895
   428
    errbuf[0] = 0;
slouken@1895
   429
    switch (code) {
slouken@1895
   430
    case MMSYSERR_NODRIVER:
slouken@1895
   431
        error = "Joystick driver not present";
slouken@1895
   432
        break;
slouken@0
   433
slouken@1895
   434
    case MMSYSERR_INVALPARAM:
slouken@1895
   435
    case JOYERR_PARMS:
slouken@1895
   436
        error = "Invalid parameter(s)";
slouken@1895
   437
        break;
slouken@0
   438
slouken@1895
   439
    case MMSYSERR_BADDEVICEID:
slouken@1895
   440
        error = "Bad device ID";
slouken@1895
   441
        break;
slouken@0
   442
slouken@1895
   443
    case JOYERR_UNPLUGGED:
slouken@1895
   444
        error = "Joystick not attached";
slouken@1895
   445
        break;
slouken@0
   446
slouken@1895
   447
    case JOYERR_NOCANDO:
slouken@1895
   448
        error = "Can't capture joystick input";
slouken@1895
   449
        break;
slouken@0
   450
slouken@1895
   451
    default:
slouken@1895
   452
        SDL_snprintf(errbuf, SDL_arraysize(errbuf),
slouken@1895
   453
                     "%s: Unknown Multimedia system error: 0x%x",
slouken@1895
   454
                     function, code);
slouken@1895
   455
        break;
slouken@1895
   456
    }
slouken@1895
   457
slouken@1895
   458
    if (!errbuf[0]) {
slouken@1895
   459
        SDL_snprintf(errbuf, SDL_arraysize(errbuf), "%s: %s", function,
slouken@1895
   460
                     error);
slouken@1895
   461
    }
slouken@1895
   462
    SDL_SetError("%s", errbuf);
slouken@0
   463
}
slouken@1635
   464
slouken@1635
   465
#endif /* SDL_JOYSTICK_WINMM */
slouken@6707
   466
slouken@1895
   467
/* vi: set ts=4 sw=4 expandtab: */