[Top][All Lists]
[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() {