[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: |
Fri, 16 Nov 2007 17:35:35 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Sandro Santilli <strk> 07/11/16 17:35:34
Modified files:
. : ChangeLog
server : movie_root.cpp
server/asobj : Key.cpp Key.h
testsuite/actionscript.all: Key.as
Log message:
Initialize the Key object as an usual AsBroadcaster.
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4880&r2=1.4881
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.124&r2=1.125
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Key.cpp?cvsroot=gnash&r1=1.44&r2=1.45
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Key.h?cvsroot=gnash&r1=1.30&r2=1.31
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/actionscript.all/Key.as?cvsroot=gnash&r1=1.4&r2=1.5
Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.4880
retrieving revision 1.4881
diff -u -b -r1.4880 -r1.4881
--- ChangeLog 16 Nov 2007 15:36:56 -0000 1.4880
+++ ChangeLog 16 Nov 2007 17:35:33 -0000 1.4881
@@ -1,5 +1,13 @@
2007-11-16 Sandro Santilli <address@hidden>
+ * server/asobj/Key.{cpp,h}: Initialize the Key object as an usual
+ AsBroadcaster.
+ * server/movie_root.cpp: don't cleanup Key object listeners as they
+ will follow usual AsBroadcaster cleaning convention.
+ * testsuite/actionscript.all/Key.as: successes.
+
+2007-11-16 Sandro Santilli <address@hidden>
+
* configure.ac: quote arguments of test(1)
* server/asobj/MovieClipLoader.cpp (dispatchEvent): don't lookup
broadcastMessage, as it's a named string.
Index: server/movie_root.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
retrieving revision 1.124
retrieving revision 1.125
diff -u -b -r1.124 -r1.125
--- server/movie_root.cpp 16 Nov 2007 13:24:30 -0000 1.124
+++ server/movie_root.cpp 16 Nov 2007 17:35:34 -0000 1.125
@@ -894,11 +894,6 @@
}
}
- if( _keyobject )
- {
- // remove unloaded character listeners from global Key object
- _keyobject->cleanup_unloaded_listeners();
- }
}
void movie_root::notify_key_listeners(key::code k, bool down)
Index: server/asobj/Key.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Key.cpp,v
retrieving revision 1.44
retrieving revision 1.45
diff -u -b -r1.44 -r1.45
--- server/asobj/Key.cpp 16 Nov 2007 07:43:53 -0000 1.44
+++ server/asobj/Key.cpp 16 Nov 2007 17:35:34 -0000 1.45
@@ -30,6 +30,8 @@
#include "VM.h"
#include "builtin_function.h"
#include "Object.h" // for getObjectInterface()
+#include "AsBroadcaster.h" // for initializing self as a broadcaster
+#include "namedStrings.h"
#include <boost/algorithm/string/case_conv.hpp>
@@ -44,10 +46,17 @@
key_as_object::key_as_object()
:
-as_object(getObjectInterface()),
+ as_object(getObjectInterface()),
m_last_key_event(0)
{
memset(m_unreleased_keys, 0, sizeof(m_unreleased_keys));
+
+ // Key is a broadcaster only in SWF6 and up (correct?)
+ int swfversion = VM::get().getSWFVersion();
+ if ( swfversion > 5 )
+ {
+ AsBroadcaster::initialize(*this);
+ }
}
bool
@@ -110,108 +119,22 @@
void
-key_as_object::notify_listeners(const event_id key_event)
+key_as_object::notify_listeners(const event_id& key_event)
{
- if( m_listeners.empty() )
- {
- return;
- }
-
- std::string handler_name;
// 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) )
- {
- handler_name = key_event.get_function_name();
- if ( _vm.getSWFVersion() < 7 )
- {
- boost::to_lower(handler_name, _vm.getLocale());
- }
- }
- else
- {
- return;
- }
-
- for (Listeners::iterator iter = m_listeners.begin(); iter !=
m_listeners.end(); ++iter)
- {
- if (*iter == NULL) continue;
-
- as_value event_handler;
- bool found_handler =
- iter->get()->get_member(_vm.getStringTable().find(handler_name),
&event_handler);
-
- if(found_handler)
- {
- character* ch = dynamic_cast<character *>(iter->get());
- if(ch && !ch->isUnloaded())
- {
- // execute character handlers
- call_method(event_handler, &ch->get_environment(), ch, 0, 0);
- }
- else
- {
- // execute non-character handlers
- call_method(event_handler, NULL, iter->get(), 0, 0);
- }
- }
- } // end of for
-
-}
+ 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());
-void
-key_as_object::cleanup_unloaded_listeners()
-{
- for (Listeners::iterator iter = m_listeners.begin(); iter !=
m_listeners.end(); )
- {
- boost::intrusive_ptr<character> ch = dynamic_cast<character *>
(iter->get());
- if (ch && ch->isUnloaded())
- {
- m_listeners.erase(iter++);
- continue;
- }
- else
- {
- ++iter;
- }
- }
-}
+ as_value ev(handler_name);
+ /// no environment to start with...
+ as_environment env;
-void
-key_as_object::add_listener(boost::intrusive_ptr<as_object> listener)
-{
- // Should we bother doing this every time someone calls add_listener(),
- // or should we perhaps skip this check and use unique later?
- for (Listeners::iterator i = m_listeners.begin(), e = m_listeners.end(); i
!= e; ++i)
- {
- if (*i == listener)
- {
- // Already in the list.
- return;
- }
- }
-
- m_listeners.push_back(listener);
+ log_debug("notify_listeners calling broadcastMessage with arg %s",
ev.to_debug_string().c_str());
+ callMethod(NSV::PROP_BROADCAST_MESSAGE, env, ev);
}
-
-void
-key_as_object::remove_listener(boost::intrusive_ptr<as_object> listener)
-{
-
- for (Listeners::iterator iter = m_listeners.begin(); iter !=
m_listeners.end(); )
- {
- if (*iter == listener)
- {
- m_listeners.erase(iter++);
- continue;
- }
- iter++;
- }
-}
-
-
int
key_as_object::get_last_key() const
{
@@ -219,35 +142,6 @@
}
-as_value
-key_add_listener(const fn_call& fn)
-{
-
- boost::intrusive_ptr<key_as_object> ko =
ensureType<key_as_object>(fn.this_ptr);
-
- if (fn.nargs < 1)
- {
- IF_VERBOSE_ASCODING_ERRORS(
- log_aserror(_("Key.addListener needs one argument (the listener
object)"));
- );
- return as_value();
- }
-
- boost::intrusive_ptr<as_object> toadd = fn.arg(0).to_object();
- if (toadd == NULL)
- {
- IF_VERBOSE_ASCODING_ERRORS(
- log_aserror(_("Key.addListener passed a NULL object; ignored"));
- );
- return as_value();
- }
-
- ko->add_listener(toadd);
-
- return as_value();
-}
-
-
/// Return the ascii number of the last key pressed.
static as_value
key_get_ascii(const fn_call& fn)
@@ -301,41 +195,11 @@
return as_value(false);
}
-/// Remove a previously-added listener.
-static as_value
-key_remove_listener(const fn_call& fn)
-{
-
- if (fn.nargs < 1)
- {
- IF_VERBOSE_ASCODING_ERRORS(
- log_aserror(_("Key.removeListener needs one argument (the listener
object)"));
- );
- return as_value();
- }
-
- boost::intrusive_ptr<as_object> toremove = fn.arg(0).to_object();
- if (toremove == NULL)
- {
- IF_VERBOSE_ASCODING_ERRORS(
- log_aserror(_("Key.removeListener passed a NULL object; ignored"));
- );
- return as_value();
- }
-
- boost::intrusive_ptr<key_as_object> ko =
ensureType<key_as_object>(fn.this_ptr);
-
- ko->remove_listener(toremove);
-
- return as_value();
-}
-
void key_class_init(as_object& global)
{
// GNASH_REPORT_FUNCTION;
//
- int swfversion = VM::get().getSWFVersion();
// Create built-in key object.
// NOTE: _global.Key *is* an object, not a constructor
@@ -369,11 +233,14 @@
key_obj->init_member("isToggled", new builtin_function(key_is_toggled));
// These are only for SWF6 and up
+#if 0 // done by AsBroadcaster
+ int swfversion = VM::get().getSWFVersion();
if ( swfversion > 5 )
{
key_obj->init_member("addListener", new
builtin_function(key_add_listener));
key_obj->init_member("removeListener", new
builtin_function(key_remove_listener));
}
+#endif
global.init_member("Key", key_obj);
}
Index: server/asobj/Key.h
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Key.h,v
retrieving revision 1.30
retrieving revision 1.31
diff -u -b -r1.30 -r1.31
--- server/asobj/Key.h 16 Nov 2007 07:43:53 -0000 1.30
+++ server/asobj/Key.h 16 Nov 2007 17:35:34 -0000 1.31
@@ -16,7 +16,7 @@
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
//
-/* $Id: Key.h,v 1.30 2007/11/16 07:43:53 zoulunkai Exp $ */
+/* $Id: Key.h,v 1.31 2007/11/16 17:35:34 strk Exp $ */
#ifndef __KEY_H__
#define __KEY_H__
@@ -86,14 +86,8 @@
/// Responsible for user defined key events handlers only;
/// take over both characters and non-characters object.
- void notify_listeners(const event_id key_event_type);
+ void notify_listeners(const event_id& key_event_type);
- /// Remove unloaded character listeners from the list.
- void cleanup_unloaded_listeners();
-
- void add_listener(boost::intrusive_ptr<as_object> listener);
-
- void remove_listener(boost::intrusive_ptr<as_object> listener);
};
void key_class_init(as_object& global);
Index: testsuite/actionscript.all/Key.as
===================================================================
RCS file: /sources/gnash/gnash/testsuite/actionscript.all/Key.as,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -b -r1.4 -r1.5
--- testsuite/actionscript.all/Key.as 29 Sep 2007 16:22:57 -0000 1.4
+++ testsuite/actionscript.all/Key.as 16 Nov 2007 17:35:34 -0000 1.5
@@ -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: Key.as,v 1.4 2007/09/29 16:22:57 strk Exp $";
+rcsid="$Id: Key.as,v 1.5 2007/11/16 17:35:34 strk Exp $";
#include "check.as"
@@ -38,10 +38,10 @@
// See http://www.senocular.com/flash/tutorials/listenersasbroadcaster/?page=2
check_equals(typeof(Key.addListener), 'function');
check_equals(typeof(Key.removeListener), 'function');
- xcheck_equals(typeof(Key.broadcastMessage), 'function');
- xcheck(Key.hasOwnProperty("_listeners"));
- xcheck_equals(typeof(Key._listeners), 'object');
- xcheck(Key._listeners instanceof Array);
+ check_equals(typeof(Key.broadcastMessage), 'function');
+ check(Key.hasOwnProperty("_listeners"));
+ check_equals(typeof(Key._listeners), 'object');
+ check(Key._listeners instanceof Array);
#else // OUTPUT_VERSION <= 5
- [Gnash-commit] gnash ChangeLog server/movie_root.cpp server/as...,
Sandro Santilli <=