+
+/*] Copyright (c) 2009-2010, Charles McGarvey [**************************
+**] All rights reserved.
+*
+* vi:ts=4 sw=4 tw=75
+*
+* Distributable under the terms and conditions of the 2-clause BSD license;
+* see the file COPYING for a complete text of the license.
+*
+**************************************************************************/
+
+#include <stdexcept>
+
+#include <SDL/SDL.h>
+#include "fastevents.h"
+
+#include "backend.hh"
+#include "log.hh"
+
+
+namespace moof {
+
+
+struct impl
+{
+ static bool is_initialized;
+ static int retain_count;
+};
+
+bool impl::is_initialized = false;
+int impl::retain_count = 0;
+
+
+backend::backend()
+{
+ if (impl::retain_count++ == 0)
+ {
+#if defined(_WIN32)
+ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) != 0)
+#else
+ if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTTHREAD) != 0)
+#endif
+ {
+ throw std::runtime_error(SDL_GetError());
+ }
+ else
+ {
+ char name[128];
+ SDL_VideoDriverName(name, sizeof(name));
+ log_info << "initialized SDL; using video driver `"
+ << name << "'" << std::endl;
+ }
+
+ if (FE_Init() != 0)
+ {
+ throw std::runtime_error(FE_GetError());
+ }
+ }
+
+ impl::is_initialized = true;
+}
+
+backend::backend(const backend& backend)
+{
+ ++impl::retain_count;
+}
+
+backend& backend::operator=(const backend& backend)
+{
+ ++impl::retain_count;
+ return *this;
+}
+
+backend::~backend()
+{
+ if (--impl::retain_count == 0)
+ {
+ FE_Quit();
+ SDL_Quit();
+
+ impl::is_initialized = false;
+ }
+}
+
+bool backend::is_initialized()
+{
+ return impl::is_initialized;
+}
+
+
+} // namespace moof
+