diff --git a/test/testgamecontroller.c b/test/testgamecontroller.c index 3d9101ab3..77d63f2d6 100644 --- a/test/testgamecontroller.c +++ b/test/testgamecontroller.c @@ -31,8 +31,6 @@ #define MAX_NUM_AXES 6 #define MAX_NUM_HATS 2 -static SDL_bool s_ForceQuit = SDL_FALSE; - static void DrawRect(SDL_Renderer *r, const int x, const int y, const int w, const int h) { @@ -85,7 +83,7 @@ ControllerButtonName(const SDL_GameControllerButton button) } } -void +SDL_bool WatchGameController(SDL_GameController * gamecontroller) { const char *name = SDL_GameControllerName(gamecontroller); @@ -94,7 +92,8 @@ WatchGameController(SDL_GameController * gamecontroller) char *title = (char *)SDL_malloc(titlelen); SDL_Window *window = NULL; SDL_Renderer *screen = NULL; - int done = 0; + SDL_bool retval = SDL_FALSE; + SDL_bool done = SDL_FALSE; SDL_Event event; int i; @@ -108,14 +107,14 @@ WatchGameController(SDL_GameController * gamecontroller) SCREEN_HEIGHT, 0); if (window == NULL) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create window: %s\n", SDL_GetError()); - return; + return SDL_FALSE; } screen = SDL_CreateRenderer(window, -1, 0); if (screen == NULL) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create renderer: %s\n", SDL_GetError()); SDL_DestroyWindow(window); - return; + return SDL_FALSE; } SDL_SetRenderDrawColor(screen, 0x00, 0x00, 0x00, SDL_ALPHA_OPAQUE); @@ -157,8 +156,7 @@ WatchGameController(SDL_GameController * gamecontroller) } /* Fall through to signal quit */ case SDL_QUIT: - done = 1; - s_ForceQuit = SDL_TRUE; + done = SDL_TRUE; break; default: break; @@ -200,12 +198,15 @@ WatchGameController(SDL_GameController * gamecontroller) SDL_RenderPresent(screen); - if ( !done ) - done = SDL_GameControllerGetAttached( gamecontroller ) == 0; + if (!SDL_GameControllerGetAttached(gamecontroller)) { + done = SDL_TRUE; + retval = SDL_TRUE; /* keep going, wait for reattach. */ + } } SDL_DestroyRenderer(screen); SDL_DestroyWindow(window); + return retval; } int @@ -250,6 +251,9 @@ main(int argc, char *argv[]) SDL_Log("There are %d game controller(s) attached (%d joystick(s))\n", nController, SDL_NumJoysticks()); if (argv[1]) { + SDL_bool reportederror = SDL_FALSE; + SDL_bool keepGoing = SDL_TRUE; + SDL_Event event; int device = atoi(argv[1]); if (device >= SDL_NumJoysticks()) { SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "%i is an invalid joystick index.\n", device); @@ -259,12 +263,36 @@ main(int argc, char *argv[]) guid, sizeof (guid)); SDL_Log("Attempting to open device %i, guid %s\n", device, guid); gamecontroller = SDL_GameControllerOpen(device); - if (gamecontroller == NULL) { - SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open joystick %d: %s\n", device, SDL_GetError()); - retcode = 1; - } else { - WatchGameController(gamecontroller); - SDL_GameControllerClose(gamecontroller); + while (keepGoing) { + if (gamecontroller == NULL) { + if (!reportederror) { + if (gamecontroller == NULL) { + SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't open gamecontroller %d: %s\n", device, SDL_GetError()); + retcode = 1; + } + keepGoing = SDL_FALSE; + reportederror = SDL_TRUE; + } + } else { + reportederror = SDL_FALSE; + keepGoing = WatchGameController(gamecontroller); + SDL_GameControllerClose(gamecontroller); + } + + gamecontroller = NULL; + if (keepGoing) { + SDL_Log("Waiting for attach\n"); + } + while (keepGoing) { + SDL_WaitEvent(&event); + if ((event.type == SDL_QUIT) || (event.type == SDL_FINGERDOWN) + || (event.type == SDL_MOUSEBUTTONDOWN)) { + keepGoing = SDL_FALSE; + } else if (event.type == SDL_CONTROLLERDEVICEADDED) { + gamecontroller = SDL_GameControllerOpen(event.cdevice.which); + break; + } + } } } }