--- /dev/null
+
+/*] 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 <SDL/SDL.h>
+#include "fastevents.h"
+
+#include "Backend.hh"
+#include "Error.hh"
+#include "Log.hh"
+
+
+namespace Mf {
+
+
+struct Impl
+{
+ static Error error;
+ static int retainCount;
+};
+
+Error Impl::error(Error::UNINITIALIZED);
+int Impl::retainCount = 0;
+
+
+Backend::Backend()
+{
+ if (Impl::retainCount++ == 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
+ {
+ const char* error = SDL_GetError();
+ Impl::error.init(Error::SDL_INIT, error);
+ return; // fatal
+ }
+ else
+ {
+ char name[128];
+ SDL_VideoDriverName(name, sizeof(name));
+ logInfo << "initialized SDL; using video driver `"
+ << name << "'" << std::endl;
+ }
+
+ if (FE_Init() != 0)
+ {
+ const char* error = FE_GetError();
+ Impl::error.init(Error::FASTEVENTS_INIT, error);
+ return; // fatal
+ }
+
+ Impl::error.init(Error::NONE);
+ }
+}
+
+Backend::Backend(const Backend& backend)
+{
+ ++Impl::retainCount;
+}
+
+Backend::~Backend()
+{
+ if (--Impl::retainCount == 0)
+ {
+ FE_Quit();
+ SDL_Quit();
+
+ Impl::error.reset();
+ }
+}
+
+bool Backend::isInitialized()
+{
+ return Impl::error.code() == Error::NONE;
+}
+
+const Error& Backend::getError()
+{
+ return Impl::error;
+}
+
+
+} // namespace Mf
+