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: 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
 




reply via email to

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