|
|
|
@ -57,6 +57,58 @@ static _GLFWmapping* findMapping(const char* guid) |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Checks whether a gamepad mapping element is present in the hardware
|
|
|
|
|
//
|
|
|
|
|
static GLFWbool isValidElementForJoystick(const _GLFWmapelement* e, |
|
|
|
|
const _GLFWjoystick* js) |
|
|
|
|
{ |
|
|
|
|
if (e->type == _GLFW_JOYSTICK_HATBIT && (e->value >> 4) >= js->hatCount) |
|
|
|
|
return GLFW_FALSE; |
|
|
|
|
else if (e->type == _GLFW_JOYSTICK_BUTTON && e->value >= js->buttonCount) |
|
|
|
|
return GLFW_FALSE; |
|
|
|
|
else if (e->type == _GLFW_JOYSTICK_AXIS && e->value >= js->axisCount) |
|
|
|
|
return GLFW_FALSE; |
|
|
|
|
|
|
|
|
|
return GLFW_TRUE; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Finds a mapping based on joystick GUID and verifies element indices
|
|
|
|
|
//
|
|
|
|
|
static _GLFWmapping* findValidMapping(const _GLFWjoystick* js) |
|
|
|
|
{ |
|
|
|
|
_GLFWmapping* mapping = findMapping(js->guid); |
|
|
|
|
if (mapping) |
|
|
|
|
{ |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
for (i = 0; i <= GLFW_GAMEPAD_BUTTON_LAST; i++) |
|
|
|
|
{ |
|
|
|
|
if (!isValidElementForJoystick(mapping->buttons + i, js)) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_INVALID_VALUE, |
|
|
|
|
"Invalid button in gamepad mapping %s (%s)", |
|
|
|
|
mapping->guid, |
|
|
|
|
mapping->name); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (i = 0; i <= GLFW_GAMEPAD_AXIS_LAST; i++) |
|
|
|
|
{ |
|
|
|
|
if (!isValidElementForJoystick(mapping->axes + i, js)) |
|
|
|
|
{ |
|
|
|
|
_glfwInputError(GLFW_INVALID_VALUE, |
|
|
|
|
"Invalid axis in gamepad mapping %s (%s)", |
|
|
|
|
mapping->guid, |
|
|
|
|
mapping->name); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return mapping; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Parses an SDL_GameControllerDB line and adds it to the mapping list
|
|
|
|
|
//
|
|
|
|
|
static GLFWbool parseMapping(_GLFWmapping* mapping, const char* string) |
|
|
|
@ -318,9 +370,9 @@ _GLFWjoystick* _glfwAllocJoystick(const char* name, |
|
|
|
|
js->axisCount = axisCount; |
|
|
|
|
js->buttonCount = buttonCount; |
|
|
|
|
js->hatCount = hatCount; |
|
|
|
|
js->mapping = findMapping(guid); |
|
|
|
|
|
|
|
|
|
strcpy(js->guid, guid); |
|
|
|
|
js->mapping = findValidMapping(js); |
|
|
|
|
|
|
|
|
|
return js; |
|
|
|
|
} |
|
|
|
@ -973,7 +1025,7 @@ GLFWAPI int glfwUpdateGamepadMappings(const char* string) |
|
|
|
|
{ |
|
|
|
|
_GLFWjoystick* js = _glfw.joysticks + jid; |
|
|
|
|
if (js->present) |
|
|
|
|
js->mapping = findMapping(js->guid); |
|
|
|
|
js->mapping = findValidMapping(js); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return GLFW_TRUE; |
|
|
|
|