X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FScripting%2FNasalSys.cxx;h=b38e0fbcd35137e43dd8d7cc8d78281380068995;hb=688d76613e2ece5fdb0e36b5d836719d7a68830c;hp=3be65c325e92372585b89d56f8a76d46fe683b87;hpb=a132ced0846d5e54596375b170652e735ffe862b;p=flightgear.git diff --git a/src/Scripting/NasalSys.cxx b/src/Scripting/NasalSys.cxx index 3be65c325..b38e0fbcd 100644 --- a/src/Scripting/NasalSys.cxx +++ b/src/Scripting/NasalSys.cxx @@ -27,10 +27,15 @@ #include "NasalSys.hxx" #include "NasalPositioned.hxx" +#include "NasalCanvas.hxx" +#include "NasalClipboard.hxx" +#include "NasalCondition.hxx" + #include
#include
#include
+ using std::map; static FGNasalSys* nasalSys = 0; @@ -99,18 +104,38 @@ FGNasalSys::FGNasalSys() _callCount = 0; } +// Utility. Sets a named key in a hash by C string, rather than nasal +// string object. +void FGNasalSys::hashset(naRef hash, const char* key, naRef val) +{ + naRef s = naNewString(_context); + naStr_fromdata(s, (char*)key, strlen(key)); + naHash_set(hash, s, val); +} + +void FGNasalSys::globalsSet(const char* key, naRef val) +{ + hashset(_globals, key, val); +} + +naRef FGNasalSys::call(naRef code, int argc, naRef* args, naRef locals) +{ + return callMethod(code, naNil(), argc, args, locals); +} + // Does a naCall() in a new context. Wrapped here to make lock // tracking easier. Extension functions are called with the lock, but // we have to release it before making a new naCall(). So rather than // drop the lock in every extension function that might call back into // Nasal, we keep a stack depth counter here and only unlock/lock // around the naCall if it isn't the first one. -naRef FGNasalSys::call(naRef code, int argc, naRef* args, naRef locals) + +naRef FGNasalSys::callMethod(naRef code, naRef self, int argc, naRef* args, naRef locals) { naContext ctx = naNewContext(); if(_callCount) naModUnlock(); _callCount++; - naRef result = naCall(ctx, code, argc, args, naNil(), locals); + naRef result = naCall(ctx, code, argc, args, self, locals); if(naGetError(ctx)) logError(ctx); _callCount--; @@ -162,15 +187,6 @@ FGNasalScript* FGNasalSys::parseScript(const char* src, const char* name) return script; } -// Utility. Sets a named key in a hash by C string, rather than nasal -// string object. -void FGNasalSys::hashset(naRef hash, const char* key, naRef val) -{ - naRef s = naNewString(_context); - naStr_fromdata(s, (char*)key, strlen(key)); - naHash_set(hash, s, val); -} - // The get/setprop functions accept a *list* of strings and walk // through the property tree with them to find the appropriate node. // This allows a Nasal object to hold onto a property path and use it @@ -542,6 +558,9 @@ void FGNasalSys::init() hashset(_globals, "__gcsave", _gcHash); initNasalPositioned(_globals, _context, _gcHash); + initNasalCanvas(_globals, _context, _gcHash); + NasalClipboard::init(this); + initNasalCondition(_globals, _context, _gcHash); // Now load the various source files in the Nasal directory simgear::Dir nasalDir(SGPath(globals->get_fg_root(), "Nasal")); @@ -564,10 +583,16 @@ void FGNasalSys::init() // Pull scripts out of the property tree, too loadPropertyScripts(); + + // now Nasal modules are loaded, we can do some delayed work + postinitNasalPositioned(_globals, _context); } void FGNasalSys::update(double) { + if( NasalClipboard::getInstance() ) + NasalClipboard::getInstance()->update(); + if(!_dead_listener.empty()) { vector::iterator it, end = _dead_listener.end(); for(it = _dead_listener.begin(); it != end; ++it) delete *it; @@ -807,11 +832,12 @@ naRef FGNasalSys::parse(const char* filename, const char* buf, int len) return naBindFunction(_context, code, _globals); } -bool FGNasalSys::handleCommand(const SGPropertyNode* arg) +bool FGNasalSys::handleCommand( const char* moduleName, + const char* fileName, + const char* src, + const SGPropertyNode* arg ) { - const char* nasal = arg->getStringValue("script"); - const char* moduleName = arg->getStringValue("module"); - naRef code = parse(arg->getPath(true).c_str(), nasal, strlen(nasal)); + naRef code = parse(fileName, src, strlen(src)); if(naIsNil(code)) return false; // Commands can be run "in" a module. Make sure that module @@ -836,6 +862,17 @@ bool FGNasalSys::handleCommand(const SGPropertyNode* arg) return true; } +bool FGNasalSys::handleCommand(const SGPropertyNode* arg) +{ + const char* src = arg->getStringValue("script"); + const char* moduleName = arg->getStringValue("module"); + + return handleCommand( moduleName, + arg ? arg->getPath(true).c_str() : moduleName, + src, + arg ); +} + // settimer(func, dt, simtime) extension function. The first argument // is a Nasal function to call, the second is a delta time (from now), // in seconds. The third, if present, is a boolean value indicating