From 201400b974b63eb7f23eb7d8563589df9c699d7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Camilla=20L=C3=B6wy?= Date: Wed, 23 Jun 2021 18:53:06 +0200 Subject: [PATCH] Simplify parsing of default gamepad mappings The outer glfwUpdateGamepadMappings function is now bypassed when parsing the default gamepad mappings. The data in mappings.h does not contain any comments or line breaks. Also this is done before joystick support has been initialized, so there is no need to look for matching devices. Finally, the array of default mappings is pre-allocated. This has no measurable performance impact but does generate a lot of calls, which won't be nice for a user provided custom allocator to deal with. --- src/init.c | 17 ++--------------- src/input.c | 16 ++++++++++++++++ src/internal.h | 1 + src/mappings.h | 2 -- src/mappings.h.in | 2 -- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/src/init.c b/src/init.c index bca59baa..25a6b4f3 100644 --- a/src/init.c +++ b/src/init.c @@ -28,7 +28,6 @@ //======================================================================== #include "internal.h" -#include "mappings.h" #include #include @@ -256,24 +255,12 @@ GLFWAPI int glfwInit(void) _glfwPlatformSetTls(&_glfw.errorSlot, &_glfwMainThreadError); + _glfwInitGamepadMappings(); + _glfw.initialized = GLFW_TRUE; _glfw.timer.offset = _glfwPlatformGetTimerValue(); glfwDefaultWindowHints(); - - { - int i; - - for (i = 0; _glfwDefaultMappings[i]; i++) - { - if (!glfwUpdateGamepadMappings(_glfwDefaultMappings[i])) - { - terminate(); - return GLFW_FALSE; - } - } - } - return GLFW_TRUE; } diff --git a/src/input.c b/src/input.c index 56f8c84d..4f4830b5 100644 --- a/src/input.c +++ b/src/input.c @@ -28,6 +28,7 @@ //======================================================================== #include "internal.h" +#include "mappings.h" #include #include @@ -412,6 +413,21 @@ void _glfwInputJoystickHat(_GLFWjoystick* js, int hat, char value) ////// GLFW internal API ////// ////////////////////////////////////////////////////////////////////////// +// Adds the built-in set of gamepad mappings +// +void _glfwInitGamepadMappings(void) +{ + size_t i; + const size_t count = sizeof(_glfwDefaultMappings) / sizeof(char*); + _glfw.mappings = calloc(count, sizeof(_GLFWmapping)); + + for (i = 0; i < count; i++) + { + if (parseMapping(&_glfw.mappings[_glfw.mappingCount], _glfwDefaultMappings[i])) + _glfw.mappingCount++; + } +} + // Returns an available joystick object with arrays and name allocated // _GLFWjoystick* _glfwAllocJoystick(const char* name, diff --git a/src/internal.h b/src/internal.h index ce9783f9..efa7e5b8 100644 --- a/src/internal.h +++ b/src/internal.h @@ -781,6 +781,7 @@ void _glfwAllocGammaArrays(GLFWgammaramp* ramp, unsigned int size); void _glfwFreeGammaArrays(GLFWgammaramp* ramp); void _glfwSplitBPP(int bpp, int* red, int* green, int* blue); +void _glfwInitGamepadMappings(void); _GLFWjoystick* _glfwAllocJoystick(const char* name, const char* guid, int axisCount, diff --git a/src/mappings.h b/src/mappings.h index 007bf129..553fe2a2 100644 --- a/src/mappings.h +++ b/src/mappings.h @@ -997,7 +997,5 @@ const char* _glfwDefaultMappings[] = "03000000120c0000100e000011010000,ZEROPLUS P4 Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,", "03000000120c0000101e000011010000,ZEROPLUS P4 Wired Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,", #endif // GLFW_BUILD_LINUX_MAPPINGS - -NULL }; diff --git a/src/mappings.h.in b/src/mappings.h.in index 3e7b2689..f2604390 100644 --- a/src/mappings.h.in +++ b/src/mappings.h.in @@ -78,7 +78,5 @@ const char* _glfwDefaultMappings[] = #if defined(GLFW_BUILD_LINUX_MAPPINGS) @GLFW_LINUX_MAPPINGS@ #endif // GLFW_BUILD_LINUX_MAPPINGS - -NULL };