From 828a0a4a10ca26a41576c98cfdf78158a04d60e3 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Thu, 11 Nov 2021 07:13:29 -0800 Subject: [PATCH] Fixed mapping for PS4 controller when using the classic Joystick interface on Linux --- src/joystick/linux/SDL_sysjoystick.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/joystick/linux/SDL_sysjoystick.c b/src/joystick/linux/SDL_sysjoystick.c index 188d05a06..a5e80d604 100644 --- a/src/joystick/linux/SDL_sysjoystick.c +++ b/src/joystick/linux/SDL_sysjoystick.c @@ -1573,6 +1573,7 @@ LINUX_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out) SDL_OutOfMemory(); return SDL_FALSE; } + SDL_memcpy(&joystick->guid, &item->guid, sizeof(item->guid)); joystick->hwdata = (struct joystick_hwdata *) SDL_calloc(1, sizeof(*joystick->hwdata)); @@ -1611,14 +1612,27 @@ LINUX_JoystickGetGamepadMapping(int device_index, SDL_GamepadMapping *out) out->b.target = joystick->hwdata->key_map[BTN_B]; } - if (joystick->hwdata->has_key[BTN_X]) { - out->x.kind = EMappingKind_Button; - out->x.target = joystick->hwdata->key_map[BTN_X]; - } + /* Xbox controllers use BTN_X and BTN_Y, and PS4 controllers use BTN_WEST and BTN_NORTH */ + if (SDL_JoystickGetVendor(joystick) == USB_VENDOR_SONY) { + if (joystick->hwdata->has_key[BTN_WEST]) { + out->x.kind = EMappingKind_Button; + out->x.target = joystick->hwdata->key_map[BTN_WEST]; + } - if (joystick->hwdata->has_key[BTN_Y]) { - out->y.kind = EMappingKind_Button; - out->y.target = joystick->hwdata->key_map[BTN_Y]; + if (joystick->hwdata->has_key[BTN_NORTH]) { + out->y.kind = EMappingKind_Button; + out->y.target = joystick->hwdata->key_map[BTN_NORTH]; + } + } else { + if (joystick->hwdata->has_key[BTN_X]) { + out->x.kind = EMappingKind_Button; + out->x.target = joystick->hwdata->key_map[BTN_X]; + } + + if (joystick->hwdata->has_key[BTN_Y]) { + out->y.kind = EMappingKind_Button; + out->y.target = joystick->hwdata->key_map[BTN_Y]; + } } if (joystick->hwdata->has_key[BTN_SELECT]) {