68 lines
1.2 KiB
C++
68 lines
1.2 KiB
C++
#include <psemek/sdl2/init.hpp>
|
|
|
|
#include <SDL2/SDL.h>
|
|
|
|
namespace psemek::sdl2
|
|
{
|
|
|
|
namespace
|
|
{
|
|
|
|
struct sdl_initializer
|
|
{
|
|
sdl_initializer()
|
|
{
|
|
if (SDL_Init(0) != 0)
|
|
fail("Failed to initialize SDL2: ");
|
|
}
|
|
|
|
~sdl_initializer()
|
|
{
|
|
SDL_Quit();
|
|
}
|
|
|
|
static std::shared_ptr<sdl_initializer> instance()
|
|
{
|
|
static std::weak_ptr<sdl_initializer> ptr;
|
|
|
|
if (auto p = ptr.lock(); p)
|
|
return p;
|
|
|
|
auto p = std::make_shared<sdl_initializer>();
|
|
ptr = p;
|
|
return p;
|
|
}
|
|
};
|
|
|
|
struct subsystem_initializer
|
|
{
|
|
std::shared_ptr<sdl_initializer> sdl_init;
|
|
std::uint32_t subsystems;
|
|
|
|
subsystem_initializer(std::uint32_t subsystems)
|
|
: sdl_init(sdl_initializer::instance())
|
|
, subsystems(subsystems)
|
|
{
|
|
if (SDL_InitSubSystem(subsystems) != 0)
|
|
fail("Failed to initialize SDL2 subsystems: ");
|
|
}
|
|
|
|
~subsystem_initializer()
|
|
{
|
|
SDL_QuitSubSystem(subsystems);
|
|
}
|
|
};
|
|
|
|
}
|
|
|
|
[[noreturn]] void fail(std::string const & message)
|
|
{
|
|
throw std::runtime_error(message + SDL_GetError());
|
|
}
|
|
|
|
std::shared_ptr<void> init(std::uint32_t subsystems)
|
|
{
|
|
return std::make_shared<subsystem_initializer>(subsystems);
|
|
}
|
|
|
|
}
|