summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Dalos/Dalos.cc46
1 files changed, 37 insertions, 9 deletions
diff --git a/Dalos/Dalos.cc b/Dalos/Dalos.cc
index 1262d73..23006c0 100644
--- a/Dalos/Dalos.cc
+++ b/Dalos/Dalos.cc
@@ -17,7 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-/* $Id: Dalos.cc,v 1.24 2006-02-02 17:25:28 pixel Exp $ */
+/* $Id: Dalos.cc,v 1.25 2006-02-09 17:13:31 pixel Exp $ */
#include <SDL.h>
#include <SDL_thread.h>
@@ -32,6 +32,7 @@
#include <LuaHandle.h>
#include <LuaConfigFile.h>
#include <LuaRegex.h>
+#include <LuaGL.h>
#include <engine.h>
#include <glbase.h>
@@ -55,6 +56,10 @@
bool auto_exec = true;
bool lua_started = false;
bool do_lua_break = false;
+bool do_lua_pause = false;
+bool lua_paused = false;
+
+Lua * L;
CODE_BEGINS
@@ -72,7 +77,12 @@ class threaded_Lua : public Lua {
virtual void unlock() {
SDL_mutexV(mutex);
}
+ protected:
+ virtual Lua * spawn_from_thread(lua_State * __L) {
+ return new threaded_Lua(__L);
+ }
private:
+ threaded_Lua(lua_State * __L) : Lua(__L) { }
SDL_mutex * mutex;
};
@@ -111,12 +121,21 @@ static void lua_hook(lua_State * __L, lua_Debug * ar) {
L->do_break();
do_lua_break = false;
}
+
+ if (do_lua_pause) {
+ L->yield();
+ do_lua_pause = false;
+ lua_paused = true;
+ }
}
void start_lua() {
- Lua * L = new threaded_Lua();
+ Lua * L1;
+ L = new threaded_Lua();
bool use_builtin_cdtool = false;
+ L->lock();
+
L->open_base();
L->open_math();
L->open_string();
@@ -131,12 +150,15 @@ void start_lua() {
CD_PUSHSTATICS(L);
Luapsx::pushstatics(L);
+
+ luaopen_opengl(L);
+ L->pop();
L->push("print");
L->push(lua_print);
L->setvar();
-
- L->sethook(lua_hook, LUA_MASKLINE, 0);
+
+ L->unlock();
console_lock = SDL_CreateMutex();
console_sem = SDL_CreateSemaphore(0);
@@ -158,8 +180,10 @@ void start_lua() {
printm(M_WARNING, "There was an error loading built-in cd-tool.lua: %s\n", e.GetMsg());
}
}
-
- SDL_CreateThread(LuaThread, L);
+
+ L1 = L->thread();
+ L1->sethook(lua_hook, LUA_MASKLINE, 0);
+ SDL_CreateThread(LuaThread, L1);
}
static int LuaThread(void * d) {
@@ -169,7 +193,7 @@ static int LuaThread(void * d) {
lua_started = true;
SDL_mutexP(console_lock);
try {
- L->load(&console_buffer);
+ L->resume(&console_buffer);
}
catch (LuaException e) {
/* If there was an error, ignore it, and free the stack */
@@ -192,7 +216,7 @@ class myprinter : public printer_t {
myprinter() : lock(SDL_CreateMutex()) { }
virtual ~myprinter() { SDL_DestroyMutex(lock); }
virtual bool printm(int level, const char * m, va_list ap) {
- static String heads[] = {"EE", "--", "WW", "II"};
+ static const String heads[] = {"EE", "--", "WW", "II"};
static char buffer[20480];
if (level >= M_INFO)
@@ -268,6 +292,10 @@ class timer : public mogltk::widget {
String fps;
fps.set("FPS: %6.2f", mogltk::engine::FPS());
Application->MainMenu->SetCaption(3, fps);
+
+ L->resume("fps = " + String(mogltk::engine::FPS()));
+ L->resume("tick = " + String(tick));
+
return true;
}
return false;
@@ -358,7 +386,7 @@ virtual int startup() throw (GeneralException) {
new hexview::hexview_keyevent;
new console::console_keyevent; // Should be one of the last
- new mogltk::widgets::InputDialog(0, sh, MainPanel, "Test", "blah blah blah");
+// new mogltk::widgets::InputDialog(0, sh, MainPanel, "Test", "blah blah blah");
// And launching the main loop
Root->mainloop();