SDL: testgamepad replaces testjoystick

From d2d26c7b1ef3799dc82268a5c777d5bc1ce313c3 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Tue, 11 Jul 2023 13:36:48 -0700
Subject: [PATCH] testgamepad replaces testjoystick

---
 VisualC/SDL.sln                               |   2 -
 .../tests/testjoystick/testjoystick.vcxproj   | 204 ----------
 test/CMakeLists.txt                           |   1 -
 test/README                                   |   1 -
 test/testjoystick.c                           | 352 ------------------
 5 files changed, 560 deletions(-)
 delete mode 100644 VisualC/tests/testjoystick/testjoystick.vcxproj
 delete mode 100644 test/testjoystick.c

diff --git a/VisualC/SDL.sln b/VisualC/SDL.sln
index bd5dffa72bf0..5c6580cec1fb 100644
--- a/VisualC/SDL.sln
+++ b/VisualC/SDL.sln
@@ -18,8 +18,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testfile", "tests\testfile\
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testgl", "tests\testgl\testgl.vcxproj", "{8B5CFB38-CCBA-40A8-AD7A-89C57B070884}"
 EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testjoystick", "tests\testjoystick\testjoystick.vcxproj", "{55812185-D13C-4022-9C81-32E0F4A08304}"
-EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testoverlay", "tests\testoverlay\testoverlay.vcxproj", "{B51E0D74-F0A2-45A2-BD2A-8B7D95B8204A}"
 EndProject
 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testplatform", "tests\testplatform\testplatform.vcxproj", "{26932B24-EFC6-4E3A-B277-ED653DA37968}"
diff --git a/VisualC/tests/testjoystick/testjoystick.vcxproj b/VisualC/tests/testjoystick/testjoystick.vcxproj
deleted file mode 100644
index d35450f42d22..000000000000
--- a/VisualC/tests/testjoystick/testjoystick.vcxproj
+++ /dev/null
@@ -1,204 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
-  <ItemGroup Label="ProjectConfigurations">
-    <ProjectConfiguration Include="Debug|Win32">
-      <Configuration>Debug</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Debug|x64">
-      <Configuration>Debug</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|Win32">
-      <Configuration>Release</Configuration>
-      <Platform>Win32</Platform>
-    </ProjectConfiguration>
-    <ProjectConfiguration Include="Release|x64">
-      <Configuration>Release</Configuration>
-      <Platform>x64</Platform>
-    </ProjectConfiguration>
-  </ItemGroup>
-  <PropertyGroup Label="Globals">
-    <ProjectGuid>{55812185-D13C-4022-9C81-32E0F4A08304}</ProjectGuid>
-    <RootNamespace>testjoystick</RootNamespace>
-    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' != '10.0'">$(DefaultPlatformToolset)</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' != '10.0'">$(DefaultPlatformToolset)</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' != '10.0'">$(DefaultPlatformToolset)</PlatformToolset>
-  </PropertyGroup>
-  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
-    <ConfigurationType>Application</ConfigurationType>
-    <PlatformToolset Condition="'$(VisualStudioVersion)' != '10.0'">$(DefaultPlatformToolset)</PlatformToolset>
-  </PropertyGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
-  <ImportGroup Label="ExtensionSettings">
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC70.props" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC70.props" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC70.props" />
-  </ImportGroup>
-  <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
-    <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
-    <Import Project="$(VCTargetsPath)Microsoft.CPP.UpgradeFromVC70.props" />
-  </ImportGroup>
-  <PropertyGroup Label="UserMacros" />
-  <PropertyGroup>
-    <_ProjectFileVersion>10.0.40219.1</_ProjectFileVersion>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(Platform)\$(Configuration)\</IntDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(Platform)\$(Configuration)\</IntDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(Platform)\$(Configuration)\</IntDir>
-    <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(SolutionDir)$(Platform)\$(Configuration)\</OutDir>
-    <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(Platform)\$(Configuration)\</IntDir>
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
-    <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
-    <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
-    <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
-  </PropertyGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <TypeLibraryName>.\Release/testjoystick.tlb</TypeLibraryName>
-    </Midl>
-    <ClCompile>
-      <AdditionalIncludeDirectories>$(SolutionDir)/../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
-    <Midl>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
-      <TypeLibraryName>.\Release/testjoystick.tlb</TypeLibraryName>
-    </Midl>
-    <ClCompile>
-      <AdditionalIncludeDirectories>$(SolutionDir)/../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
-      <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
-    <Link>
-      <SubSystem>Windows</SubSystem>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
-    <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>Win32</TargetEnvironment>
-      <TypeLibraryName>.\Debug/testjoystick.tlb</TypeLibraryName>
-    </Midl>
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)/../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>OldStyle</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
-    <Midl>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <MkTypLibCompatible>true</MkTypLibCompatible>
-      <SuppressStartupBanner>true</SuppressStartupBanner>
-      <TargetEnvironment>X64</TargetEnvironment>
-      <TypeLibraryName>.\Debug/testjoystick.tlb</TypeLibraryName>
-    </Midl>
-    <ClCompile>
-      <Optimization>Disabled</Optimization>
-      <AdditionalIncludeDirectories>$(SolutionDir)/../include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
-      <AdditionalUsingDirectories>%(AdditionalUsingDirectories)</AdditionalUsingDirectories>
-      <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
-      <WarningLevel>Level3</WarningLevel>
-      <DebugInformationFormat>OldStyle</DebugInformationFormat>
-    </ClCompile>
-    <ResourceCompile>
-      <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
-      <Culture>0x0409</Culture>
-    </ResourceCompile>
-    <Link>
-      <GenerateDebugInformation>true</GenerateDebugInformation>
-      <SubSystem>Windows</SubSystem>
-    </Link>
-  </ItemDefinitionGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\..\SDL\SDL.vcxproj">
-      <Project>{81ce8daf-ebb2-4761-8e45-b71abcca8c68}</Project>
-      <Private>false</Private>
-      <CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
-      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
-    </ProjectReference>
-    <ProjectReference Include="..\..\SDL_test\SDL_test.vcxproj">
-      <Project>{da956fd3-e143-46f2-9fe5-c77bebc56b1a}</Project>
-      <Private>false</Private>
-      <CopyLocalSatelliteAssemblies>false</CopyLocalSatelliteAssemblies>
-      <ReferenceOutputAssembly>true</ReferenceOutputAssembly>
-    </ProjectReference>
-  </ItemGroup>
-  <ItemGroup>
-    <ClCompile Include="..\..\..\test\testjoystick.c" />
-  </ItemGroup>
-  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
-  <ImportGroup Label="ExtensionTargets">
-  </ImportGroup>
-</Project>
\ No newline at end of file
diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt
index cd5cf591ebd2..5d903493650f 100644
--- a/test/CMakeLists.txt
+++ b/test/CMakeLists.txt
@@ -224,7 +224,6 @@ add_sdl_test_executable(testrumble SOURCES testrumble.c)
 add_sdl_test_executable(testthread NONINTERACTIVE NONINTERACTIVE_TIMEOUT 40 SOURCES testthread.c)
 add_sdl_test_executable(testiconv NEEDS_RESOURCES TESTUTILS SOURCES testiconv.c)
 add_sdl_test_executable(testime NEEDS_RESOURCES TESTUTILS SOURCES testime.c)
-add_sdl_test_executable(testjoystick SOURCES testjoystick.c)
 add_sdl_test_executable(testkeys SOURCES testkeys.c)
 add_sdl_test_executable(testloadso SOURCES testloadso.c)
 add_sdl_test_executable(testlocale NONINTERACTIVE SOURCES testlocale.c)
diff --git a/test/README b/test/README
index c4d7cccfa042..914c1143049f 100644
--- a/test/README
+++ b/test/README
@@ -10,7 +10,6 @@ These are test programs for the SDL library:
 	testfile	Tests RWops layer
 	testgl		A very simple example of using OpenGL with SDL
 	testiconv	Tests international string conversion
-	testjoystick	List joysticks and watch joystick events
 	testkeys	List the available keyboard keys
 	testloadso	Tests the loadable library layer
 	testlocale  Test Locale API
diff --git a/test/testjoystick.c b/test/testjoystick.c
deleted file mode 100644
index 0e77ef6c5648..000000000000
--- a/test/testjoystick.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
-  Copyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org>
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely.
-*/
-
-/* Simple program to test the SDL joystick routines */
-
-#include <stdlib.h>
-
-#include <SDL3/SDL.h>
-#include <SDL3/SDL_main.h>
-#include <SDL3/SDL_test.h>
-
-#ifdef __EMSCRIPTEN__
-#include <emscripten/emscripten.h>
-#endif
-
-#ifdef __IOS__
-#define SCREEN_WIDTH  320
-#define SCREEN_HEIGHT 480
-#else
-#define SCREEN_WIDTH  640
-#define SCREEN_HEIGHT 480
-#endif
-
-static SDL_Window *window = NULL;
-static SDL_Renderer *screen = NULL;
-static SDL_Joystick *joystick = NULL;
-
-static void
-PrintJoystick(SDL_Joystick *joy)
-{
-    const char *type;
-    char guid[64];
-
-    SDL_assert(SDL_GetJoystickFromInstanceID(SDL_GetJoystickInstanceID(joy)) == joy);
-    SDL_GetJoystickGUIDString(SDL_GetJoystickGUID(joy), guid, sizeof(guid));
-    switch (SDL_GetJoystickType(joy)) {
-    case SDL_JOYSTICK_TYPE_GAMEPAD:
-        type = "Game Controller";
-        break;
-    case SDL_JOYSTICK_TYPE_WHEEL:
-        type = "Wheel";
-        break;
-    case SDL_JOYSTICK_TYPE_ARCADE_STICK:
-        type = "Arcade Stick";
-        break;
-    case SDL_JOYSTICK_TYPE_FLIGHT_STICK:
-        type = "Flight Stick";
-        break;
-    case SDL_JOYSTICK_TYPE_DANCE_PAD:
-        type = "Dance Pad";
-        break;
-    case SDL_JOYSTICK_TYPE_GUITAR:
-        type = "Guitar";
-        break;
-    case SDL_JOYSTICK_TYPE_DRUM_KIT:
-        type = "Drum Kit";
-        break;
-    case SDL_JOYSTICK_TYPE_ARCADE_PAD:
-        type = "Arcade Pad";
-        break;
-    case SDL_JOYSTICK_TYPE_THROTTLE:
-        type = "Throttle";
-        break;
-    default:
-        type = "Unknown";
-        break;
-    }
-    SDL_Log("Joystick\n");
-    SDL_Log("          name: %s\n", SDL_GetJoystickName(joy));
-    SDL_Log("          type: %s\n", type);
-    SDL_Log("           LED: %s\n", SDL_JoystickHasLED(joy) ? "yes" : "no");
-    SDL_Log("        rumble: %s\n", SDL_JoystickHasRumble(joy) ? "yes" : "no");
-    SDL_Log("trigger rumble: %s\n", SDL_JoystickHasRumbleTriggers(joy) ? "yes" : "no");
-    SDL_Log("          axes: %d\n", SDL_GetNumJoystickAxes(joy));
-    SDL_Log("          hats: %d\n", SDL_GetNumJoystickHats(joy));
-    SDL_Log("       buttons: %d\n", SDL_GetNumJoystickButtons(joy));
-    SDL_Log("   instance id: %" SDL_PRIu32 "\n", SDL_GetJoystickInstanceID(joy));
-    SDL_Log("          guid: %s\n", guid);
-    SDL_Log("       VID/PID: 0x%.4x/0x%.4x\n", SDL_GetJoystickVendor(joy), SDL_GetJoystickProduct(joy));
-}
-
-static void
-DrawRect(SDL_Renderer *r, const int x, const int y, const int w, const int h)
-{
-    SDL_FRect area;
-    area.x = (float)x;
-    area.y = (float)y;
-    area.w = (float)w;
-    area.h = (float)h;
-    SDL_RenderFillRect(r, &area);
-}
-
-static void loop(void *arg)
-{
-    SDL_Event event;
-    int i;
-    SDL_bool *done = (SDL_bool*)arg;
-
-    /* blank screen, set up for drawing this frame. */
-    SDL_SetRenderDrawColor(screen, 0x0, 0x0, 0x0, SDL_ALPHA_OPAQUE);
-    SDL_RenderClear(screen);
-
-    while (SDL_PollEvent(&event)) {
-        switch (event.type) {
-
-        case SDL_EVENT_JOYSTICK_ADDED:
-            SDL_Log("Joystick device %" SDL_PRIu32 " added.\n", event.jdevice.which);
-            if (joystick == NULL) {
-                joystick = SDL_OpenJoystick(event.jdevice.which);
-                if (joystick) {
-                    PrintJoystick(joystick);
-                } else {
-                    SDL_Log("Couldn't open joystick: %s\n", SDL_GetError());
-                }
-            }
-            break;
-
-        case SDL_EVENT_JOYSTICK_REMOVED:
-            SDL_Log("Joystick device %" SDL_PRIu32 " removed.\n", event.jdevice.which);
-            if (event.jdevice.which == SDL_GetJoystickInstanceID(joystick)) {
-                SDL_JoystickID *joysticks;
-
-                SDL_CloseJoystick(joystick);
-                joystick = NULL;
-
-                joysticks = SDL_GetJoysticks(NULL);
-                if (joysticks) {
-                    if (joysticks[0]) {
-                        joystick = SDL_OpenJoystick(joysticks[0]);
-                        if (joystick) {
-                            PrintJoystick(joystick);
-                        } else {
-                            SDL_Log("Couldn't open joystick: %s\n", SDL_GetError());
-                        }
-                    }
-                    SDL_free(joysticks);
-                }
-            }
-            break;
-
-        case SDL_EVENT_JOYSTICK_AXIS_MOTION:
-            SDL_Log("Joystick %" SDL_PRIu32 " axis %d value: %d\n",
-                    event.jaxis.which,
-                    event.jaxis.axis, event.jaxis.value);
-            break;
-        case SDL_EVENT_JOYSTICK_HAT_MOTION:
-            SDL_Log("Joystick %" SDL_PRIu32 " hat %d value:",
-                    event.jhat.which, event.jhat.hat);
-            if (event.jhat.value == SDL_HAT_CENTERED) {
-                SDL_Log(" centered");
-            }
-            if (event.jhat.value & SDL_HAT_UP) {
-                SDL_Log(" up");
-            }
-            if (event.jhat.value & SDL_HAT_RIGHT) {
-                SDL_Log(" right");
-            }
-            if (event.jhat.value & SDL_HAT_DOWN) {
-                SDL_Log(" down");
-            }
-            if (event.jhat.value & SDL_HAT_LEFT) {
-                SDL_Log(" left");
-            }
-            SDL_Log("\n");
-            break;
-        case SDL_EVENT_JOYSTICK_BUTTON_DOWN:
-            SDL_Log("Joystick %" SDL_PRIu32 " button %d down\n",
-                    event.jbutton.which, event.jbutton.button);
-            /* First button triggers a 0.5 second full strength rumble */
-            if (event.jbutton.button == 0) {
-                SDL_RumbleJoystick(joystick, 0xFFFF, 0xFFFF, 500);
-            }
-            break;
-        case SDL_EVENT_JOYSTICK_BUTTON_UP:
-            SDL_Log("Joystick %" SDL_PRIu32 " button %d up\n",
-                    event.jbutton.which, event.jbutton.button);
-            break;
-        case SDL_EVENT_KEY_DOWN:
-            /* Press the L key to lag for 3 seconds, to see what happens
-                when SDL doesn't service the event loop quickly. */
-            if (event.key.keysym.sym == SDLK_l) {
-                SDL_Log("Lagging for 3 seconds...\n");
-                SDL_Delay(3000);
-                break;
-            }
-
-            if ((event.key.keysym.sym != SDLK_ESCAPE) &&
-                (event.key.keysym.sym != SDLK_AC_BACK)) {
-                break;
-            }
-            SDL_FALLTHROUGH;
-        case SDL_EVENT_FINGER_DOWN:
-        case SDL_EVENT_MOUSE_BUTTON_DOWN:
-        case SDL_EVENT_QUIT:
-            *done = SDL_TRUE;
-            break;
-        default:
-            break;
-        }
-    }
-
-    if (joystick) {
-        const int BUTTONS_PER_LINE = ((SCREEN_WIDTH - 4) / 34);
-        int x, y;
-
-        /* Update visual joystick state */
-        SDL_SetRenderDrawColor(screen, 0x00, 0xFF, 0x00, SDL_ALPHA_OPAQUE);
-        y = SCREEN_HEIGHT - ((((SDL_GetNumJoystickButtons(joystick) + (BUTTONS_PER_LINE - 1)) / BUTTONS_PER_LINE) + 1) * 34);
-        for (i = 0; i < SDL_GetNumJoystickButtons(joystick); ++i) {
-            if ((i % BUTTONS_PER_LINE) == 0) {
-                y += 34;
-            }
-            if (SDL_GetJoystickButton(joystick, i) == SDL_PRESSED) {
-                x = 2 + (i % BUTTONS_PER_LINE) * 34;
-                DrawRect(screen, x, y, 32, 32);
-            }
-        }
-
-        SDL_SetRenderDrawColor(screen, 0xFF, 0x00, 0x00, SDL_ALPHA_OPAQUE);
-        for (i = 0; i < SDL_GetNumJoystickAxes(joystick); ++i) {
-            /* Draw the X/Y axis */
-            x = (((int)SDL_GetJoystickAxis(joystick, i)) + 32768);
-            x *= SCREEN_WIDTH;
-            x /= 65535;
-            if (x < 0) {
-                x = 0;
-            } else if (x > (SCREEN_WIDTH - 16)) {
-                x = SCREEN_WIDTH - 16;
-            }
-            ++i;
-            if (i < SDL_GetNumJoystickAxes(joystick)) {
-                y = (((int)SDL_GetJoystickAxis(joystick, i)) + 32768);
-            } else {
-                y = 32768;
-            }
-            y *= SCREEN_HEIGHT;
-            y /= 65535;
-            if (y < 0) {
-                y = 0;
-            } else if (y > (SCREEN_HEIGHT - 16)) {
-                y = SCREEN_HEIGHT - 16;
-            }
-
-            DrawRect(screen, x, y, 16, 16);
-        }
-
-        SDL_SetRenderDrawColor(screen, 0x00, 0x00, 0xFF, SDL_ALPHA_OPAQUE);
-        for (i = 0; i < SDL_GetNumJoystickHats(joystick); ++i) {
-            /* Derive the new position */
-            const Uint8 hat_pos = SDL_GetJoystickHat(joystick, i);
-            x = SCREEN_WIDTH / 2;
-            y = SCREEN_HEIGHT / 2;
-
-            if (hat_pos & SDL_HAT_UP) {
-                y = 0;
-            } else if (hat_pos & SDL_HAT_DOWN) {
-                y = SCREEN_HEIGHT - 8;
-            }
-
-            if (hat_pos & SDL_HAT_LEFT) {
-                x = 0;
-            } else if (hat_pos & SDL_HAT_RIGHT) {
-                x = SCREEN_WIDTH - 8;
-            }
-
-            DrawRect(screen, x, y, 8, 8);
-        }
-    }
-
-    SDL_Delay(16);
-    SDL_RenderPresent(screen);
-
-#ifdef __EMSCRIPTEN__
-    if (*done == SDL_TRUE) {
-        emscripten_cancel_main_loop();
-    }
-#endif
-}
-
-int main(int argc, char *argv[])
-{
-    SDL_bool done;
-    SDLTest_CommonState *state;
-
-    /* Initialize test framework */
-    state = SDLTest_CommonCreateState(argv, 0);
-    if (state == NULL) {
-        return 1;
-    }
-
-    SDL_SetHint(SDL_HINT_ACCELEROMETER_AS_JOYSTICK, "0");
-
-    /* Enable standard application logging */
-    SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
-
-    /* Parse commandline */
-    if (!SDLTest_CommonDefaultArgs(state, argc, argv)) {
-        return 1;
-    }
-
-    /* Initialize SDL (Note: video is required to start event loop) */
-    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0) {
-        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s\n", SDL_GetError());
-        exit(1);
-    }
-
-    /* Create a window to display joystick axis position */
-    window = SDL_CreateWindow("Joystick Test", SCREEN_WIDTH, SCREEN_HEIGHT, 0);
-    if (window == NULL) {
-        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create window: %s\n", SDL_GetError());
-        return SDL_FALSE;
-    }
-
-    screen = SDL_CreateRenderer(window, NULL, 0);
-    if (screen == NULL) {
-        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create renderer: %s\n", SDL_GetError());
-        SDL_DestroyWindow(window);
-        return SDL_FALSE;
-    }
-
-    SDL_SetRenderDrawColor(screen, 0x00, 0x00, 0x00, SDL_ALPHA_OPAQUE);
-    SDL_RenderClear(screen);
-    SDL_RenderPresent(screen);
-
-    done = SDL_FALSE;
-
-    /* Loop, getting joystick events! */
-#ifdef __EMSCRIPTEN__
-    emscripten_set_main_loop_arg(loop, &done, 0, 1);
-#else
-    while (!done) {
-        loop(&done);
-    }
-#endif
-
-    SDL_DestroyRenderer(screen);
-    SDL_DestroyWindow(window);
-
-    SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK);
-    SDLTest_CommonDestroyState(state);
-
-    return 0;
-}