diff --git a/test/testgamepad.c b/test/testgamepad.c index 1e24565e90..369eca1d38 100644 --- a/test/testgamepad.c +++ b/test/testgamepad.c @@ -99,6 +99,68 @@ static float virtual_axis_start_x; static float virtual_axis_start_y; static SDL_GamepadButton virtual_button_active = SDL_GAMEPAD_BUTTON_INVALID; + +static void PrintJoystickInfo(SDL_JoystickID instance_id) +{ + char guid[64]; + const char *name; + const char *path; + const char *description; + + SDL_GetJoystickGUIDString(SDL_GetJoystickInstanceGUID(instance_id), guid, sizeof(guid)); + + if (SDL_IsGamepad(instance_id)) { + name = SDL_GetGamepadInstanceName(instance_id); + path = SDL_GetGamepadInstancePath(instance_id); + switch (SDL_GetGamepadInstanceType(instance_id)) { + case SDL_GAMEPAD_TYPE_AMAZON_LUNA: + description = "Amazon Luna Controller"; + break; + case SDL_GAMEPAD_TYPE_GOOGLE_STADIA: + description = "Google Stadia Controller"; + break; + case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT: + case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT: + case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR: + description = "Nintendo Switch Joy-Con"; + break; + case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO: + description = "Nintendo Switch Pro Controller"; + break; + case SDL_GAMEPAD_TYPE_PS3: + description = "PS3 Controller"; + break; + case SDL_GAMEPAD_TYPE_PS4: + description = "PS4 Controller"; + break; + case SDL_GAMEPAD_TYPE_PS5: + description = "PS5 Controller"; + break; + case SDL_GAMEPAD_TYPE_XBOX360: + description = "XBox 360 Controller"; + break; + case SDL_GAMEPAD_TYPE_XBOXONE: + description = "XBox One Controller"; + break; + case SDL_GAMEPAD_TYPE_VIRTUAL: + description = "Virtual Gamepad"; + break; + default: + description = "Gamepad"; + break; + } + } else { + name = SDL_GetJoystickInstanceName(instance_id); + path = SDL_GetJoystickInstancePath(instance_id); + description = "Joystick"; + } + SDL_Log("%s: %s%s%s (guid %s, VID 0x%.4x, PID 0x%.4x, player index = %d)\n", + description, name ? name : "Unknown", path ? ", " : "", path ? path : "", guid, + SDL_GetJoystickInstanceVendor(instance_id), + SDL_GetJoystickInstanceProduct(instance_id), + SDL_GetJoystickInstancePlayerIndex(instance_id)); +} + static void UpdateWindowTitle() { if (window == NULL) { @@ -562,6 +624,10 @@ void loop(void *arg) /* Process all currently pending events */ while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EVENT_FIRST, SDL_EVENT_LAST) == 1) { switch (event.type) { + case SDL_EVENT_JOYSTICK_ADDED: + PrintJoystickInfo(event.jdevice.which); + break; + case SDL_EVENT_GAMEPAD_ADDED: SDL_Log("Gamepad device %" SDL_PRIu32 " added.\n", event.cdevice.which); AddGamepad(event.cdevice.which, SDL_TRUE); @@ -783,11 +849,7 @@ void loop(void *arg) int main(int argc, char *argv[]) { int i; - SDL_JoystickID *joysticks; - int joystick_count = 0; - int gamepad_count = 0; int gamepad_index = 0; - char guid[64]; SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, "0"); SDL_SetHint(SDL_HINT_JOYSTICK_HIDAPI_PS4_RUMBLE, "1"); @@ -821,75 +883,6 @@ int main(int argc, char *argv[]) SDL_Log("\n"); } - /* Print information about the gamepads */ - joysticks = SDL_GetJoysticks(&joystick_count); - if (joysticks) { - for (i = 0; joysticks[i]; ++i) { - SDL_JoystickID instance_id = joysticks[i]; - const char *name; - const char *path; - const char *description; - - SDL_GetJoystickGUIDString(SDL_GetJoystickInstanceGUID(instance_id), - guid, sizeof(guid)); - - if (SDL_IsGamepad(instance_id)) { - gamepad_count++; - name = SDL_GetGamepadInstanceName(instance_id); - path = SDL_GetGamepadInstancePath(instance_id); - switch (SDL_GetGamepadInstanceType(instance_id)) { - case SDL_GAMEPAD_TYPE_AMAZON_LUNA: - description = "Amazon Luna Controller"; - break; - case SDL_GAMEPAD_TYPE_GOOGLE_STADIA: - description = "Google Stadia Controller"; - break; - case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT: - case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT: - case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR: - description = "Nintendo Switch Joy-Con"; - break; - case SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO: - description = "Nintendo Switch Pro Controller"; - break; - case SDL_GAMEPAD_TYPE_PS3: - description = "PS3 Controller"; - break; - case SDL_GAMEPAD_TYPE_PS4: - description = "PS4 Controller"; - break; - case SDL_GAMEPAD_TYPE_PS5: - description = "PS5 Controller"; - break; - case SDL_GAMEPAD_TYPE_XBOX360: - description = "XBox 360 Controller"; - break; - case SDL_GAMEPAD_TYPE_XBOXONE: - description = "XBox One Controller"; - break; - case SDL_GAMEPAD_TYPE_VIRTUAL: - description = "Virtual Gamepad"; - break; - default: - description = "Gamepad"; - break; - } - AddGamepad(instance_id, SDL_FALSE); - } else { - name = SDL_GetJoystickInstanceName(instance_id); - path = SDL_GetJoystickInstancePath(instance_id); - description = "Joystick"; - } - SDL_Log("%s %d: %s%s%s (guid %s, VID 0x%.4x, PID 0x%.4x, player index = %d)\n", - description, i, name ? name : "Unknown", path ? ", " : "", path ? path : "", guid, - SDL_GetJoystickInstanceVendor(instance_id), - SDL_GetJoystickInstanceProduct(instance_id), - SDL_GetJoystickInstancePlayerIndex(instance_id)); - } - SDL_free(joysticks); - } - SDL_Log("There are %d gamepad(s) attached (%d joystick(s))\n", gamepad_count, joystick_count); - /* Create a window to display gamepad state */ window = SDL_CreateWindow("Gamepad Test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, SCREEN_WIDTH, @@ -928,8 +921,8 @@ int main(int argc, char *argv[]) SDL_SetTextureColorMod(button_texture, 10, 255, 21); SDL_SetTextureColorMod(axis_texture, 10, 255, 21); - /* !!! FIXME: */ - /*SDL_SetRenderLogicalSize(screen, background->w, background->h);*/ + /* Process the initial gamepad list */ + loop(NULL); for (i = 1; i < argc; ++i) { if (SDL_strcmp(argv[i], "--virtual") == 0) {