#include #include #include "engine.h" #include "glfont.h" #ifdef HAVE_CONFIG_H #include "config.h" #endif #ifndef _ #define _(x) x #endif 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::mx, mogltk::engine::my, mogltk::engine::mbuttons; int mogltk::engine::frames, mogltk::engine::locked = 0; double mogltk::engine::curfps = -1; Uint32 mogltk::engine::curticks; mogltk::glbase * mogltk::engine::glbase_o = 0; mogltk::base * mogltk::engine::base_o = 0; #define UPDATERATE 1000 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); curticks = SDL_GetTicks(); postsetuped = true; if (glbase_o) mogltk::SystemFont = new mogltk::glfont(&Input("font.bin")); else mogltk::SystemFont = new mogltk::font(&Input("font.bin")); 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(); if (appactive) { Uint32 ticks = SDL_GetTicks(); frames++; if (ticks - curticks > UPDATERATE) { curfps = (double) frames * 1000 / (ticks - curticks); frames = 0; curticks = ticks; } } else { curfps = -1; } while(true) { if (hastoreturn) if (!SDL_PollEvent(NULL)) { updatemouse(); 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"); if (cursorvisible) hastoreturn = true; break; case SDL_APPINPUTFOCUS: printm(M_INFO, String("Application ") + (event.active.gain ? "gained" : "loosed") + " input focus\n"); if (cursorvisible) hastoreturn = true; break; case SDL_APPACTIVE: printm(M_INFO, String("Application was ") + (event.active.gain ? "restored" : "iconified")); if (cursorvisible) hastoreturn = true; 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 = `%c`- modifiers: %04x\n", event.key.keysym.sym, event.key.keysym.unicode, event.key.keysym.unicode, event.key.keysym.mod); if (event.key.keysym.sym == 27) hastoreturn = quitrequest = true; break; case SDL_MOUSEMOTION: printm(M_INFO, "Mouse slept over the screen - (%i, %i)\n", event.motion.x, event.motion.y); if (locked) { if (!((event.motion.x == mx) && (event.motion.y == my))) { SDL_WarpMouse(mx, my); } } 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; } void mogltk::engine::updatemouse() { mbuttons = SDL_GetMouseState(&mx, &my); } int mogltk::engine::mouseX() { return mx; } int mogltk::engine::mouseY() { return my; } int mogltk::engine::mousebuttons() { return mbuttons; } double mogltk::engine::FPS() { return curfps; } void mogltk::engine::lockmouse() { locked = 1; } void mogltk::engine::unlockmouse() { locked = 0; }