gnash-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Gnash-commit] gnash ChangeLog server/movie_root.cpp server/as...


From: Sandro Santilli
Subject: [Gnash-commit] gnash ChangeLog server/movie_root.cpp server/as...
Date: Wed, 28 Nov 2007 12:47:05 +0000

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 <address@hidden>
 
+       * 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 <address@hidden>
+
        * 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() {




reply via email to

[Prev in Thread] Current Thread [Next in Thread]