CVSROOT: /sources/gnash Module name: gnash Changes by: Sandro Santilli <strk> 07/11/28 12:47:04
Modified files: . : ChangeLog server : movie_root.cpp server/asobj : Key.cpp MovieClipLoader.cpp Stage.cpp Stage.h testsuite/actionscript.all: Stage.as Log message: Make _global.Stage an AsBroadcaster, register its native props and stub missing ones. Register native methods of MovieClipLoader CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4993&r2=1.4994 http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.129&r2=1.130 http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Key.cpp?cvsroot=gnash&r1=1.47&r2=1.48 http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/MovieClipLoader.cpp?cvsroot=gnash&r1=1.37&r2=1.38 http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Stage.cpp?cvsroot=gnash&r1=1.26&r2=1.27 http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Stage.h?cvsroot=gnash&r1=1.10&r2=1.11 http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/Stage.as?cvsroot=gnash&r1=1.16&r2=1.17 Patches: Index: ChangeLog =================================================================== RCS file: /sources/gnash/gnash/ChangeLog,v retrieving revision 1.4993 retrieving revision 1.4994 diff -u -b -r1.4993 -r1.4994 --- ChangeLog 28 Nov 2007 12:23:47 -0000 1.4993 +++ ChangeLog 28 Nov 2007 12:47:03 -0000 1.4994 @@ -1,5 +1,16 @@ 2007-11-28 Sandro Santilli <[EMAIL PROTECTED]> + * server/asobj/Stage.{cpp,h}: make Stage an AsBroadcaster and + register its native methods; stage align and showMenu members. + * server/movie_root.cpp: update use of Stage to its AsBroadcaster + interface. + * server/asobj/Key.cpp: minor cleanups. + * server/asobj/MovieClipLoader.cpp: cleanups and native methods + registration. + * testsuite/actionscript.all/Stage.as: few more successes. + +2007-11-28 Sandro Santilli <[EMAIL PROTECTED]> + * testsuite/actionscript.all/Function.as: 'new' is a reserved word, protect it as a string when used as property name (or Ming 0.4.0.beta6 won't compile it) Index: server/movie_root.cpp =================================================================== RCS file: /sources/gnash/gnash/server/movie_root.cpp,v retrieving revision 1.129 retrieving revision 1.130 diff -u -b -r1.129 -r1.130 --- server/movie_root.cpp 27 Nov 2007 20:37:53 -0000 1.129 +++ server/movie_root.cpp 28 Nov 2007 12:47:04 -0000 1.130 @@ -287,8 +287,7 @@ { //log_msg("Rescaling disabled"); boost::intrusive_ptr<Stage> stage = getStageObject(); - // how do I get the environment from ?? - if ( stage ) stage->onResize(NULL); + if ( stage ) stage->onResize(); } assert(testInvariant()); Index: server/asobj/Key.cpp =================================================================== RCS file: /sources/gnash/gnash/server/asobj/Key.cpp,v retrieving revision 1.47 retrieving revision 1.48 diff -u -b -r1.47 -r1.48 --- server/asobj/Key.cpp 28 Nov 2007 09:02:23 -0000 1.47 +++ server/asobj/Key.cpp 28 Nov 2007 12:47:04 -0000 1.48 @@ -33,8 +33,6 @@ #include "AsBroadcaster.h" // for initializing self as a broadcaster #include "namedStrings.h" -#include <boost/algorithm/string/case_conv.hpp> - namespace gnash { /************************************************************************ @@ -52,7 +50,7 @@ memset(m_unreleased_keys, 0, sizeof(m_unreleased_keys)); // Key is a broadcaster only in SWF6 and up (correct?) - int swfversion = VM::get().getSWFVersion(); + int swfversion = _vm.getSWFVersion(); if ( swfversion > 5 ) { AsBroadcaster::initialize(*this); @@ -124,12 +122,7 @@ // There is no user defined "onKeyPress" event handler if( (key_event.m_id != event_id::KEY_DOWN) && (key_event.m_id != event_id::KEY_UP) ) return; - std::string handler_name = PROPNAME(key_event.get_function_name()); - - as_value ev(handler_name); - - /// no environment to start with... - as_environment env; + as_value ev(key_event.get_function_name()); log_debug("notify_listeners calling broadcastMessage with arg %s", ev.to_debug_string().c_str()); callMethod(NSV::PROP_BROADCAST_MESSAGE, ev); Index: server/asobj/MovieClipLoader.cpp =================================================================== RCS file: /sources/gnash/gnash/server/asobj/MovieClipLoader.cpp,v retrieving revision 1.37 retrieving revision 1.38 diff -u -b -r1.37 -r1.38 --- server/asobj/MovieClipLoader.cpp 20 Nov 2007 12:04:55 -0000 1.37 +++ server/asobj/MovieClipLoader.cpp 28 Nov 2007 12:47:04 -0000 1.38 @@ -50,8 +50,6 @@ static as_value moviecliploader_unloadclip(const fn_call& fn); static as_value moviecliploader_getprogress(const fn_call& fn); static as_value moviecliploader_new(const fn_call& fn); -static as_value moviecliploader_addlistener(const fn_call& fn); -static as_value moviecliploader_removelistener(const fn_call& fn); static void attachMovieClipLoaderInterface(as_object& o) @@ -60,11 +58,6 @@ o.init_member("unloadClip", new builtin_function(moviecliploader_unloadclip)); o.init_member("getProgress", new builtin_function(moviecliploader_getprogress)); -#if 0 // done by AsBroadcaster - o.init_member("addListener", new builtin_function(moviecliploader_addlistener)); - o.init_member("removeListener", new builtin_function(moviecliploader_removelistener)); -#endif - #if 0 // Load the default event handlers. These should really never // be called directly, as to be useful they are redefined @@ -124,19 +117,8 @@ /// @ { /// -#if 0 - /// Add an object to the list of event listeners - // - /// This function will call add_ref() on the - /// given object. - /// - void addListener(boost::intrusive_ptr<as_object> listener); - - void removeListener(boost::intrusive_ptr<as_object> listener); -#endif - /// Invoke any listener for the specified event - void dispatchEvent(const std::string& eventName, as_environment& env, const as_value& arg); + void dispatchEvent(const std::string& eventName, const as_value& arg); /// @ } @@ -208,8 +190,7 @@ // Call the callback since we've started loading the file // TODO: probably we should move this below, after // the loading thread actually started - as_environment env; - dispatchEvent("onLoadStart", env, as_value(&target)); + dispatchEvent("onLoadStart", as_value(&target)); bool ret = target.loadMovie(url); if ( ! ret ) @@ -230,7 +211,7 @@ /// this function though... /// //dispatchEvent("onLoadInit", events_call); - dispatchEvent("onLoadInit", env, as_value(&target)); + dispatchEvent("onLoadInit", as_value(&target)); struct mcl *mcl_data = getProgress(&target); @@ -245,7 +226,7 @@ log_unimpl (_("FIXME: MovieClipLoader calling onLoadComplete *before* movie has actually been fully loaded (cheating)")); //dispatchEvent("onLoadComplete", events_call); - dispatchEvent("onLoadComplete", env, as_value(&target)); + dispatchEvent("onLoadComplete", as_value(&target)); return true; } @@ -258,7 +239,7 @@ // Callbacks void -MovieClipLoader::dispatchEvent(const std::string& event, as_environment& env, const as_value& arg) +MovieClipLoader::dispatchEvent(const std::string& event, const as_value& arg) { as_value ev(event); Index: server/asobj/Stage.cpp =================================================================== RCS file: /sources/gnash/gnash/server/asobj/Stage.cpp,v retrieving revision 1.26 retrieving revision 1.27 diff -u -b -r1.26 -r1.27 --- server/asobj/Stage.cpp 20 Nov 2007 00:44:04 -0000 1.26 +++ server/asobj/Stage.cpp 28 Nov 2007 12:47:04 -0000 1.27 @@ -29,34 +29,51 @@ #include "builtin_function.h" // need builtin_function #include "VM.h" #include "Object.h" // for getObjectInterface() +#include "AsBroadcaster.h" // for initializing self as a broadcaster #include "namedStrings.h" #include <string> namespace gnash { -as_value stage_addlistener(const fn_call& fn); -as_value stage_removelistener(const fn_call& fn); as_value stage_scalemode_getset(const fn_call& fn); +as_value stage_align_getset(const fn_call& fn); +as_value stage_showMenu_getset(const fn_call& fn); as_value stage_width_getset(const fn_call& fn); as_value stage_height_getset(const fn_call& fn); static void attachStageInterface(as_object& o) { - if ( VM::get().getSWFVersion() < 6 ) return; + VM& vm = o.getVM(); - o.init_member("addListener", new builtin_function(stage_addlistener)); - o.init_member("removeListener", new builtin_function(stage_removelistener)); + if ( vm.getSWFVersion() < 6 ) return; - boost::intrusive_ptr<builtin_function> getset(new builtin_function(stage_scalemode_getset)); - o.init_property("scaleMode", *getset, *getset); + // Stage.scaleMode getter-setter + vm.registerNative(stage_scalemode_getset, 666, 1); + vm.registerNative(stage_scalemode_getset, 666, 2); + o.init_property("scaleMode", *(vm.getNative(666,1)), *(vm.getNative(666,2))); + + // Stage.align getter-setter + vm.registerNative(stage_align_getset, 666, 3); + vm.registerNative(stage_align_getset, 666, 4); + o.init_property("width", *(vm.getNative(666,3)), *(vm.getNative(666,4))); + + // Stage.width getter-setter + vm.registerNative(stage_width_getset, 666, 5); + vm.registerNative(stage_width_getset, 666, 6); + o.init_property("width", *(vm.getNative(666,5)), *(vm.getNative(666,6))); + + // Stage.height getter-setter + vm.registerNative(stage_height_getset, 666, 7); + vm.registerNative(stage_height_getset, 666, 8); + o.init_property("height", *(vm.getNative(666,7)), *(vm.getNative(666,8))); + + // Stage.showMenu getter-setter + vm.registerNative(stage_showMenu_getset, 666, 9); + vm.registerNative(stage_showMenu_getset, 666, 10); + o.init_property("showMenu", *(vm.getNative(666,9)), *(vm.getNative(666,10))); - getset = new builtin_function(stage_width_getset); - o.init_property("width", *getset, *getset); - - getset = new builtin_function(stage_height_getset); - o.init_property("height", *getset, *getset); } Stage::Stage() @@ -65,50 +82,36 @@ _scaleMode(showAll) { attachStageInterface(*this); -} -void -Stage::onResize(as_environment* env) -{ - as_value v; - if (get_member(NSV::PROP_SCALE_MODE, &v) && v.to_string() == "noScale" ) + int swfversion = _vm.getSWFVersion(); + if ( swfversion > 5 ) { - notifyResize(env); + AsBroadcaster::initialize(*this); } } void -Stage::notifyResize(as_environment* env) +Stage::onResize() { - for (ListenersList::iterator it=_listeners.begin(), - itEnd=_listeners.end(); - it != itEnd; ++it) + as_value v; + if (get_member(NSV::PROP_SCALE_MODE, &v) && v.to_string() == "noScale" ) { - notifyResize(*it, env); + notifyResize(); } } -/// Notify an object about an resize event void -Stage::notifyResize(boost::intrusive_ptr<as_object> obj, as_environment* env) +Stage::notifyResize() { - as_value method; - if ( ! obj->get_member(NSV::PROP_ON_RESIZE, &method) ) { - // nothing to do - return; - } - - boost::intrusive_ptr<as_function> func = method.to_as_function(); - if ( ! func ) return; // method is not a function - - func->call(fn_call(obj.get(), env, 0, 0)); + log_debug("notifying Stage listeners about a resize"); + callMethod(NSV::PROP_BROADCAST_MESSAGE, "onResize"); } unsigned Stage::getWidth() const { //if (_scaleMode==showAll) <-- the only mode implemented in Gnash - return VM::get().getRoot().get_movie_definition()->get_width_pixels(); + return (unsigned int)VM::get().getRoot().get_movie_definition()->get_width_pixels(); /* else return VM::get().getRoot().getWidth(); @@ -119,27 +122,13 @@ Stage::getHeight() const { //if (_scaleMode==showAll) <-- the only mode implemented in Gnash - return VM::get().getRoot().get_movie_definition()->get_height_pixels(); + return (unsigned int)VM::get().getRoot().get_movie_definition()->get_height_pixels(); /* else return VM::get().getRoot().getHeight(); */ } -void -Stage::addListener(boost::intrusive_ptr<as_object> obj) -{ - //log_msg("Adding listener %p to Stage %p", obj.get(), this); - _listeners.push_back(obj); -} - -void -Stage::removeListener(boost::intrusive_ptr<as_object> obj) -{ - //log_msg("Removing listener %p from Stage %p", obj.get(), this); - _listeners.remove(obj); -} - const char* Stage::getScaleModeString() { @@ -172,62 +161,6 @@ } } -as_value stage_addlistener(const fn_call& fn) -{ - boost::intrusive_ptr<Stage> stage = ensureType<Stage>(fn.this_ptr); - - if ( fn.nargs < 1 ) - { - IF_VERBOSE_ASCODING_ERRORS( - log_aserror(_("Stage.addListener() needs one argument")); - ); - return as_value(); - } - - boost::intrusive_ptr<as_object> obj = fn.arg(0).to_object(); - if ( ! obj ) - { - IF_VERBOSE_ASCODING_ERRORS( - std::stringstream ss; - fn.dump_args(ss); - log_aserror(_("Invalid call to Stage.addListener(%s) : first arg doesn't cast to an object"), - ss.str().c_str()); - ); - return as_value(); - } - - stage->addListener(obj); - return as_value(); -} - -as_value stage_removelistener(const fn_call& fn) -{ - boost::intrusive_ptr<Stage> stage = ensureType<Stage>(fn.this_ptr); - - if ( fn.nargs < 1 ) - { - IF_VERBOSE_ASCODING_ERRORS( - log_aserror(_("Stage.removeListener() needs one argument")); - ); - return as_value(); - } - - boost::intrusive_ptr<as_object> obj = fn.arg(0).to_object(); - if ( ! obj ) - { - IF_VERBOSE_ASCODING_ERRORS( - std::stringstream ss; - fn.dump_args(ss); - log_aserror(_("Invalid call to Stage.removeListener(%s) : first arg doesn't cast to an object"), - ss.str().c_str()); - ); - return as_value(); - } - - stage->removeListener(obj); - return as_value(); -} - as_value stage_scalemode_getset(const fn_call& fn) { boost::intrusive_ptr<Stage> stage = ensureType<Stage>(fn.this_ptr); @@ -286,25 +219,45 @@ } } -// extern (used by Global.cpp) -void stage_class_init(as_object& global) +as_value +stage_align_getset(const fn_call& fn) { - static boost::intrusive_ptr<as_object> obj = new Stage(); - global.init_member("Stage", obj.get()); + boost::intrusive_ptr<Stage> stage = ensureType<Stage>(fn.this_ptr); + + if ( fn.nargs == 0 ) // getter + { + log_unimpl("Stage.align getter"); + return as_value(); + } + else // setter + { + log_unimpl("Stage.align setter"); + return as_value(); + } } -#ifdef GNASH_USE_GC -void -Stage::markReachableResources() const +as_value +stage_showMenu_getset(const fn_call& fn) { - for (ListenersList::const_iterator i=_listeners.begin(), e=_listeners.end(); i!=e; ++i) + boost::intrusive_ptr<Stage> stage = ensureType<Stage>(fn.this_ptr); + + if ( fn.nargs == 0 ) // getter { - (*i)->setReachable(); + log_unimpl("Stage.showMenu getter"); + return as_value(); } + else // setter + { + log_unimpl("Stage.showMenu setter"); + return as_value(); + } +} - // Invoke generic as_object marker - markAsObjectReachable(); +// extern (used by Global.cpp) +void stage_class_init(as_object& global) +{ + static boost::intrusive_ptr<as_object> obj = new Stage(); + global.init_member("Stage", obj.get()); } -#endif // def GNASH_USE_GC } // end of gnash namespace Index: server/asobj/Stage.h =================================================================== RCS file: /sources/gnash/gnash/server/asobj/Stage.h,v retrieving revision 1.10 retrieving revision 1.11 diff -u -b -r1.10 -r1.11 --- server/asobj/Stage.h 3 Aug 2007 21:56:59 -0000 1.10 +++ server/asobj/Stage.h 28 Nov 2007 12:47:04 -0000 1.11 @@ -54,16 +54,8 @@ // override from as_object ? //double get_numeric_value() const { return 0; } - void addListener(boost::intrusive_ptr<as_object> obj); - - void removeListener(boost::intrusive_ptr<as_object> obj); - /// Recive a resize event. - // - /// @param env - /// Environment to use for notifying listeners - /// - void onResize(as_environment* env); + void onResize(); /// Get current stage width, in pixels unsigned getWidth() const; @@ -86,29 +78,10 @@ /// const char* getScaleModeString(); -protected: - -#ifdef GNASH_USE_GC - /// Mark all Stage listeners as reachable - void markReachableResources() const; -#endif - private: /// Notify all listeners about a resize event - // - /// @param env - /// Environment to use for notifying listeners - /// - void notifyResize(as_environment* env); - - - /// Notify an object about an resize event - void notifyResize(boost::intrusive_ptr<as_object> obj, as_environment* env); - - typedef std::list<boost::intrusive_ptr<as_object> > ListenersList; - - ListenersList _listeners; + void notifyResize(); ScaleMode _scaleMode; }; Index: testsuite/actionscript.all/Stage.as =================================================================== RCS file: /sources/gnash/gnash/testsuite/actionscript.all/Stage.as,v retrieving revision 1.16 retrieving revision 1.17 diff -u -b -r1.16 -r1.17 --- testsuite/actionscript.all/Stage.as 29 Sep 2007 16:22:58 -0000 1.16 +++ testsuite/actionscript.all/Stage.as 28 Nov 2007 12:47:04 -0000 1.17 @@ -20,7 +20,7 @@ // compile this test case with Ming makeswf, and then // execute it like this gnash -1 -r 0 -v out.swf -rcsid="$Id: Stage.as,v 1.16 2007/09/29 16:22:58 strk Exp $"; +rcsid="$Id: Stage.as,v 1.17 2007/11/28 12:47:04 strk Exp $"; #include "check.as" @@ -37,11 +37,11 @@ // See http://www.senocular.com/flash/tutorials/listenersasbroadcaster/?page=2 check_equals (typeof(Stage.addListener), 'function'); check_equals (typeof(Stage.removeListener), 'function'); -xcheck_equals(typeof(Stage.broadcastMessage), 'function'); +check_equals(typeof(Stage.broadcastMessage), 'function'); -xcheck(Stage.hasOwnProperty("_listeners")); -xcheck_equals(typeof(Stage._listeners), 'object'); -xcheck(Stage._listeners instanceof Array); +check(Stage.hasOwnProperty("_listeners")); +check_equals(typeof(Stage._listeners), 'object'); +check(Stage._listeners instanceof Array); listener = new Object; listener.onResize = function() { _______________________________________________ Gnash-commit mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit