diff --git a/src/main/generic/SDL_sysmain_callbacks.c b/src/main/generic/SDL_sysmain_callbacks.c index 3e47264e3..9a0bab3e6 100644 --- a/src/main/generic/SDL_sysmain_callbacks.c +++ b/src/main/generic/SDL_sysmain_callbacks.c @@ -38,41 +38,41 @@ static void SDLCALL MainCallbackRateHintChanged(void *userdata, const char *name int SDL_EnterAppMainCallbacks(int argc, char* argv[], SDL_AppInit_func appinit, SDL_AppIterate_func appiter, SDL_AppEvent_func appevent, SDL_AppQuit_func appquit) { int rc = SDL_InitMainCallbacks(argc, argv, appinit, appiter, appevent, appquit); + if (rc == 0) { + SDL_AddHintCallback(SDL_HINT_MAIN_CALLBACK_RATE, MainCallbackRateHintChanged, NULL); - SDL_AddHintCallback(SDL_HINT_MAIN_CALLBACK_RATE, MainCallbackRateHintChanged, NULL); + Uint64 next_iteration = callback_rate_increment ? (SDL_GetTicksNS() + callback_rate_increment) : 0; - Uint64 next_iteration = callback_rate_increment ? (SDL_GetTicksNS() + callback_rate_increment) : 0; + while ((rc = SDL_IterateMainCallbacks()) == 0) { + // !!! FIXME: this can be made more complicated if we decide to + // !!! FIXME: optionally hand off callback responsibility to the + // !!! FIXME: video subsystem (for example, if Wayland has a + // !!! FIXME: protocol to drive an animation loop, maybe we hand + // !!! FIXME: off to them here if/when the video subsystem becomes + // !!! FIXME: initialized). - while ((rc = SDL_IterateMainCallbacks()) == 0) { - // !!! FIXME: this can be made more complicated if we decide to - // !!! FIXME: optionally hand off callback responsibility to the - // !!! FIXME: video subsystem (for example, if Wayland has a - // !!! FIXME: protocol to drive an animation loop, maybe we hand - // !!! FIXME: off to them here if/when the video subsystem becomes - // !!! FIXME: initialized). - - // !!! FIXME: maybe respect this hint even if there _is_ a window. - // if there's no window, try to run at about 60fps (or whatever rate - // the hint requested). This makes this not eat all the CPU in - // simple things like loopwave. If there's a window, we run as fast - // as possible, which means we'll clamp to vsync in common cases, - // and won't be restrained to vsync if the app is doing a benchmark - // or doesn't want to be, based on how they've set up that window. - if ((callback_rate_increment == 0) || SDL_HasWindows()) { - next_iteration = 0; // just clear the timer and run at the pace the video subsystem allows. - } else { - const Uint64 now = SDL_GetTicksNS(); - if (next_iteration > now) { // Running faster than the limit, sleep a little. - SDL_DelayNS(next_iteration - now); + // !!! FIXME: maybe respect this hint even if there _is_ a window. + // if there's no window, try to run at about 60fps (or whatever rate + // the hint requested). This makes this not eat all the CPU in + // simple things like loopwave. If there's a window, we run as fast + // as possible, which means we'll clamp to vsync in common cases, + // and won't be restrained to vsync if the app is doing a benchmark + // or doesn't want to be, based on how they've set up that window. + if ((callback_rate_increment == 0) || SDL_HasWindows()) { + next_iteration = 0; // just clear the timer and run at the pace the video subsystem allows. } else { - next_iteration = now; // running behind (or just lost the window)...reset the timer. + const Uint64 now = SDL_GetTicksNS(); + if (next_iteration > now) { // Running faster than the limit, sleep a little. + SDL_DelayNS(next_iteration - now); + } else { + next_iteration = now; // running behind (or just lost the window)...reset the timer. + } + next_iteration += callback_rate_increment; } - next_iteration += callback_rate_increment; } + + SDL_DelHintCallback(SDL_HINT_MAIN_CALLBACK_RATE, MainCallbackRateHintChanged, NULL); } - - SDL_DelHintCallback(SDL_HINT_MAIN_CALLBACK_RATE, MainCallbackRateHintChanged, NULL); - SDL_QuitMainCallbacks(); return (rc < 0) ? 1 : 0;