This commit is contained in:
Snowiiii 2022-05-04 04:05:18 +08:00 committed by GitHub
commit d9583a45f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 93 additions and 55 deletions

10
deps/mingw/xinput.h vendored
View File

@ -117,7 +117,10 @@
#define XINPUT_DEVSUBTYPE_FLIGHT_SICK 0x04 #define XINPUT_DEVSUBTYPE_FLIGHT_SICK 0x04
#define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05 #define XINPUT_DEVSUBTYPE_DANCE_PAD 0x05
#define XINPUT_DEVSUBTYPE_GUITAR 0x06 #define XINPUT_DEVSUBTYPE_GUITAR 0x06
#define XINPUT_DEVSUBTYPE_GUITAR_ALTERNATE 0x07
#define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08 #define XINPUT_DEVSUBTYPE_DRUM_KIT 0x08
#define XINPUT_DEVSUBTYPE_GUITAR_BASS 0x0b
#define XINPUT_DEVSUBTYPE_ARCADE_PAD 0x13
/* /*
* These are used with the XInputGetCapabilities function to * These are used with the XInputGetCapabilities function to
@ -156,6 +159,11 @@
#define XUSER_MAX_COUNT 4 #define XUSER_MAX_COUNT 4
#define XUSER_INDEX_ANY 0x000000FF #define XUSER_INDEX_ANY 0x000000FF
#define XINPUT_CAPS_FFB_SUPPORTED 0x0001
#define XINPUT_CAPS_WIRELESS 0x0002
#define XINPUT_CAPS_PMD_SUPPORTED 0x0008
#define XINPUT_CAPS_NO_NAVIGATION 0x0010
/* /*
* Defines the structure of an xbox 360 joystick. * Defines the structure of an xbox 360 joystick.
*/ */
@ -232,6 +240,8 @@ DWORD WINAPI XInputGetCapabilities(DWORD, DWORD, XINPUT_CAPABILITIES*);
DWORD WINAPI XInputGetDSoundAudioDeviceGuids(DWORD, GUID*, GUID*); DWORD WINAPI XInputGetDSoundAudioDeviceGuids(DWORD, GUID*, GUID*);
DWORD WINAPI XInputGetBatteryInformation(DWORD, BYTE, XINPUT_BATTERY_INFORMATION*); DWORD WINAPI XInputGetBatteryInformation(DWORD, BYTE, XINPUT_BATTERY_INFORMATION*);
DWORD WINAPI XInputGetStateEx(DWORD, XINPUT_STATE*);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -244,25 +244,17 @@ int _glfw_max(int a, int b)
float _glfw_fminf(float a, float b) float _glfw_fminf(float a, float b)
{ {
if (a != a) if (b != b || a < b)
return b;
else if (b != b)
return a; return a;
else if (a < b)
return a;
else
return b; return b;
} }
float _glfw_fmaxf(float a, float b) float _glfw_fmaxf(float a, float b)
{ {
if (a != a) if (b != b || a > b)
return b;
else if (b != b)
return a; return a;
else if (a > b)
return a;
else
return b; return b;
} }
@ -343,37 +335,54 @@ void _glfwInputError(int code, const char* format, ...)
} }
else else
{ {
if (code == GLFW_NOT_INITIALIZED) switch (code)
{
case GLFW_NOT_INITIALIZED:
strcpy(description, "The GLFW library is not initialized"); strcpy(description, "The GLFW library is not initialized");
else if (code == GLFW_NO_CURRENT_CONTEXT) break;
case GLFW_NO_CURRENT_CONTEXT:
strcpy(description, "There is no current context"); strcpy(description, "There is no current context");
else if (code == GLFW_INVALID_ENUM) break;
case GLFW_INVALID_ENUM:
strcpy(description, "Invalid argument for enum parameter"); strcpy(description, "Invalid argument for enum parameter");
else if (code == GLFW_INVALID_VALUE) break;
case GLFW_INVALID_VALUE:
strcpy(description, "Invalid value for parameter"); strcpy(description, "Invalid value for parameter");
else if (code == GLFW_OUT_OF_MEMORY) break;
case GLFW_OUT_OF_MEMORY:
strcpy(description, "Out of memory"); strcpy(description, "Out of memory");
else if (code == GLFW_API_UNAVAILABLE) break;
case GLFW_API_UNAVAILABLE:
strcpy(description, "The requested API is unavailable"); strcpy(description, "The requested API is unavailable");
else if (code == GLFW_VERSION_UNAVAILABLE) break;
case GLFW_VERSION_UNAVAILABLE:
strcpy(description, "The requested API version is unavailable"); strcpy(description, "The requested API version is unavailable");
else if (code == GLFW_PLATFORM_ERROR) break;
case GLFW_PLATFORM_ERROR:
strcpy(description, "A platform-specific error occurred"); strcpy(description, "A platform-specific error occurred");
else if (code == GLFW_FORMAT_UNAVAILABLE) break;
case GLFW_FORMAT_UNAVAILABLE:
strcpy(description, "The requested format is unavailable"); strcpy(description, "The requested format is unavailable");
else if (code == GLFW_NO_WINDOW_CONTEXT) break;
case GLFW_NO_WINDOW_CONTEXT:
strcpy(description, "The specified window has no context"); strcpy(description, "The specified window has no context");
else if (code == GLFW_CURSOR_UNAVAILABLE) break;
case GLFW_CURSOR_UNAVAILABLE:
strcpy(description, "The specified cursor shape is unavailable"); strcpy(description, "The specified cursor shape is unavailable");
else if (code == GLFW_FEATURE_UNAVAILABLE) break;
case GLFW_FEATURE_UNAVAILABLE:
strcpy(description, "The requested feature cannot be implemented for this platform"); strcpy(description, "The requested feature cannot be implemented for this platform");
else if (code == GLFW_FEATURE_UNIMPLEMENTED) break;
case GLFW_FEATURE_UNIMPLEMENTED:
strcpy(description, "The requested feature has not yet been implemented for this platform"); strcpy(description, "The requested feature has not yet been implemented for this platform");
else if (code == GLFW_PLATFORM_UNAVAILABLE) break;
case GLFW_PLATFORM_UNAVAILABLE:
strcpy(description, "The requested platform is unavailable"); strcpy(description, "The requested platform is unavailable");
else break;
default:
strcpy(description, "ERROR: UNKNOWN GLFW ERROR"); strcpy(description, "ERROR: UNKNOWN GLFW ERROR");
} }
}
if (_glfw.initialized) if (_glfw.initialized)
{ {

View File

@ -202,14 +202,21 @@ static GLFWbool parseMapping(_GLFWmapping* mapping, const char* string)
c += 1; c += 1;
} }
if (*c == 'a') switch (*c)
{
case 'a':
e->type = _GLFW_JOYSTICK_AXIS; e->type = _GLFW_JOYSTICK_AXIS;
else if (*c == 'b')
e->type = _GLFW_JOYSTICK_BUTTON;
else if (*c == 'h')
e->type = _GLFW_JOYSTICK_HATBIT;
else
break; break;
case 'b':
e->type = _GLFW_JOYSTICK_BUTTON;
break;
case 'h':
e->type = _GLFW_JOYSTICK_HATBIT;
break;
default:
break;
}
if (e->type == _GLFW_JOYSTICK_HATBIT) if (e->type == _GLFW_JOYSTICK_HATBIT)
{ {
@ -1331,7 +1338,9 @@ GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state)
for (i = 0; i <= GLFW_GAMEPAD_BUTTON_LAST; i++) for (i = 0; i <= GLFW_GAMEPAD_BUTTON_LAST; i++)
{ {
const _GLFWmapelement* e = js->mapping->buttons + i; const _GLFWmapelement* e = js->mapping->buttons + i;
if (e->type == _GLFW_JOYSTICK_AXIS) switch (e->type)
{
case _GLFW_JOYSTICK_AXIS:
{ {
const float value = js->axes[e->index] * e->axisScale + e->axisOffset; const float value = js->axes[e->index] * e->axisScale + e->axisOffset;
// HACK: This should be baked into the value transform // HACK: This should be baked into the value transform
@ -1347,26 +1356,33 @@ GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state)
state->buttons[i] = GLFW_PRESS; state->buttons[i] = GLFW_PRESS;
} }
} }
else if (e->type == _GLFW_JOYSTICK_HATBIT) break;
case _GLFW_JOYSTICK_HATBIT:
{ {
const unsigned int hat = e->index >> 4; const unsigned int hat = e->index >> 4;
const unsigned int bit = e->index & 0xf; const unsigned int bit = e->index & 0xf;
if (js->hats[hat] & bit) if (js->hats[hat] & bit)
state->buttons[i] = GLFW_PRESS; state->buttons[i] = GLFW_PRESS;
break;
} }
else if (e->type == _GLFW_JOYSTICK_BUTTON) case _GLFW_JOYSTICK_BUTTON:
state->buttons[i] = js->buttons[e->index]; state->buttons[i] = js->buttons[e->index];
break;
}
} }
for (i = 0; i <= GLFW_GAMEPAD_AXIS_LAST; i++) for (i = 0; i <= GLFW_GAMEPAD_AXIS_LAST; i++)
{ {
const _GLFWmapelement* e = js->mapping->axes + i; const _GLFWmapelement* e = js->mapping->axes + i;
if (e->type == _GLFW_JOYSTICK_AXIS) switch (e->type)
{
case _GLFW_JOYSTICK_AXIS:
{ {
const float value = js->axes[e->index] * e->axisScale + e->axisOffset; const float value = js->axes[e->index] * e->axisScale + e->axisOffset;
state->axes[i] = _glfw_fminf(_glfw_fmaxf(value, -1.f), 1.f); state->axes[i] = _glfw_fminf(_glfw_fmaxf(value, -1.f), 1.f);
} }
else if (e->type == _GLFW_JOYSTICK_HATBIT) break;
case _GLFW_JOYSTICK_HATBIT:
{ {
const unsigned int hat = e->index >> 4; const unsigned int hat = e->index >> 4;
const unsigned int bit = e->index & 0xf; const unsigned int bit = e->index & 0xf;
@ -1375,8 +1391,11 @@ GLFWAPI int glfwGetGamepadState(int jid, GLFWgamepadstate* state)
else else
state->axes[i] = -1.f; state->axes[i] = -1.f;
} }
else if (e->type == _GLFW_JOYSTICK_BUTTON) break;
case _GLFW_JOYSTICK_BUTTON:
state->axes[i] = js->buttons[e->index] * 2.f - 1.f; state->axes[i] = js->buttons[e->index] * 2.f - 1.f;
break;
}
} }
return GLFW_TRUE; return GLFW_TRUE;