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 <[EMAIL PROTECTED]> + * 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 <[EMAIL PROTECTED]> + * 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 mailing list Gnash-commit@gnu.org http://lists.gnu.org/mailman/listinfo/gnash-commit