#include "engine.h" #define _(x) x bool mogltk::engine::inited = false, mogltk::engine::postsetuped = false; bool mogltk::engine::appactive = false, mogltk::engine::cursorvisible = false, mogltk::engine::quitrequest = false; int mogltk::engine::setup() throw(GeneralException) { if (inited) { printm(M_WARNING, "mogltk::engine::setup() called twice, ignoring second call.\n"); return -1; } if (SDL_Init(0) < 0) { throw GeneralException(_("Unable to start SDL base system")); } atexit(SDL_Quit); inited = true; return 0; } int mogltk::engine::postsetup() throw(GeneralException) { if (postsetuped) { printm(M_WARNING, "mogltk::engine::postsetup() called twice, ignoring second call.\n"); return -1; } SDL_EnableUNICODE(1); postsetuped = true; return 0; } int mogltk::engine::GetInited() { return inited; } class embedRWops : public Base { public: embedRWops(Handle *); int seek(int, int); int read(void *, int, int); int write(const void *, int, int); private: Handle * h; }; embedRWops::embedRWops(Handle * ah) : h(ah) {} int embedRWops::seek(int offset, int whence) { return h->seek(offset, whence); } int embedRWops::read(void * ptr, int size, int num) { return h->read(ptr, size * num); } int embedRWops::write(const void * ptr, int size, int num) { return h->write(ptr, size * num); } static int embedRWseek(SDL_RWops * context, int offset, int whence) { if (context->hidden.unknown.data1) return ((embedRWops *)(context->hidden.unknown.data1))->seek(offset, whence); return -1; } static int embedRWread(SDL_RWops * context, void * ptr, int size, int num) { if (context->hidden.unknown.data1) return ((embedRWops *)(context->hidden.unknown.data1))->read(ptr, size, num); return -1; } static int embedRWwrite(SDL_RWops * context, const void * ptr, int size, int num) { if (context->hidden.unknown.data1) return ((embedRWops *)(context->hidden.unknown.data1))->write(ptr, size, num); return -1; } static int embedRWclose(SDL_RWops * context) { if (context->hidden.unknown.data1) { delete ((embedRWops *)(context->hidden.unknown.data1)); context->hidden.unknown.data1 = 0; return 0; } return -1; } SDL_RWops * mogltk::engine::RWFromHandle(Handle * h) throw (GeneralException) { SDL_RWops * r = 0; if (h) { if (!(r = SDL_AllocRW())) throw GeneralException(_("Couldn't allocate memory for SDL_RWops")); r->hidden.unknown.data1 = (void *) new embedRWops(h); r->seek = embedRWseek; r->read = embedRWread; r->write = embedRWwrite; r->close = embedRWclose; } return r; } void mogltk::engine::pollevents() { SDL_Event event; bool hastoreturn = appactive; if (!postsetuped) postsetup(); while(true) { if (hastoreturn) if (!SDL_PollEvent(NULL)) return; SDL_WaitEvent(&event); switch(event.type) { case SDL_ACTIVEEVENT: switch (event.active.state) { case SDL_APPMOUSEFOCUS: printm(M_INFO, String("Application ") + (event.active.gain ? "gained" : "loosed") + " mouse focus\n"); break; case SDL_APPINPUTFOCUS: printm(M_INFO, String("Application ") + (event.active.gain ? "gained" : "loosed") + " input focus\n"); break; case SDL_APPACTIVE: printm(M_INFO, String("Application was ") + (event.active.gain ? "restored" : "iconified")); break; } break; case SDL_KEYDOWN: case SDL_KEYUP: printm(M_INFO, String("Key ") + event.key.keysym.scancode + " on keyboard " + event.key.which + (event.key.state == SDL_PRESSED ? " pressed" : " released") + "\n"); printm(M_INFO, "SDL keysym: %i - Unicode: %04x - modifiers: %04x\n", event.key.keysym.sym, event.key.keysym.unicode, event.key.keysym.mod); break; case SDL_MOUSEMOTION: printm(M_INFO, "Mouse slept over the screen - (%i, %i)\n", event.motion.x, event.motion.y); if (cursorvisible) hastoreturn = true; break; case SDL_QUIT: printm(M_INFO, "Quit requested\n"); hastoreturn = quitrequest = true; break; case SDL_VIDEOEXPOSE: printm(M_INFO, "Needs to redraw\n"); hastoreturn = true; break; default: printm(M_INFO, "Unknow event: %i\n", event.type); break; } } } void mogltk::engine::setappactive(bool p) { appactive = p; } bool mogltk::engine::getappactive() { return appactive; } void mogltk::engine::setcursorvisible(bool p) { cursorvisible = p; } bool mogltk::engine::getcursorvisible() { return cursorvisible; } bool mogltk::engine::quitrequested() { return quitrequest; }