gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/as_object.cpp server/as_...


From: Zou Lunkai
Subject: [Gnash-commit] gnash ChangeLog server/as_object.cpp server/as_...
Date: Fri, 16 Nov 2007 07:43:54 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Zou Lunkai <zoulunkai>  07/11/16 07:43:54

Modified files:
        .              : ChangeLog 
        server         : as_object.cpp as_object.h 
                         button_character_instance.cpp character.h 
                         edit_text_character.cpp movie_root.cpp 
                         movie_root.h sprite_instance.cpp 
        server/asobj   : Key.cpp Key.h 
        testsuite/misc-ming.all: key_event_test.c 
                                 key_event_testrunner.cpp 

Log message:
        * server/as_object.{h,cpp}, server/asobj/Key.{h,cpp},
          server/character.h,
          server/button_character_instance.cpp,
          server/edit_text_character.cpp,
          server/movie_root.{h,cpp},
          server/sprite_instance.cpp: drop new key listeners design and fix the
          old design with caring about listeners invoking order.
        * testsuite/key_event_test.c, key_event_testrunner.cpp: xcheck->check.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4874&r2=1.4875
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.cpp?cvsroot=gnash&r1=1.79&r2=1.80
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.h?cvsroot=gnash&r1=1.82&r2=1.83
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.cpp?cvsroot=gnash&r1=1.64&r2=1.65
http://cvs.savannah.gnu.org/viewcvs/gnash/server/character.h?cvsroot=gnash&r1=1.108&r2=1.109
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.cpp?cvsroot=gnash&r1=1.130&r2=1.131
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.122&r2=1.123
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.h?cvsroot=gnash&r1=1.87&r2=1.88
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.387&r2=1.388
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Key.cpp?cvsroot=gnash&r1=1.43&r2=1.44
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Key.h?cvsroot=gnash&r1=1.29&r2=1.30
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/key_event_test.c?cvsroot=gnash&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/gnash/testsuite/misc-ming.all/key_event_testrunner.cpp?cvsroot=gnash&r1=1.14&r2=1.15

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.4874
retrieving revision 1.4875
diff -u -b -r1.4874 -r1.4875
--- ChangeLog   15 Nov 2007 23:38:13 -0000      1.4874
+++ ChangeLog   16 Nov 2007 07:43:52 -0000      1.4875
@@ -1,3 +1,14 @@
+2007-11-16 Zou Lunkai <address@hidden>
+
+       * server/as_object.{h,cpp}, server/asobj/Key.{h,cpp},
+         server/character.h,
+         server/button_character_instance.cpp,
+         server/edit_text_character.cpp,
+         server/movie_root.{h,cpp},
+         server/sprite_instance.cpp: drop new key listeners design and fix the
+         old design with caring about listeners invoking order.
+       * testsuite/key_event_test.c, key_event_testrunner.cpp: xcheck->check.
+         
 2007-11-15 Sandro Santilli <address@hidden>
 
        * testsuite/actionscript.all/ops.as: a couple of tests more.

Index: server/as_object.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.cpp,v
retrieving revision 1.79
retrieving revision 1.80
diff -u -b -r1.79 -r1.80
--- server/as_object.cpp        30 Oct 2007 18:55:42 -0000      1.79
+++ server/as_object.cpp        16 Nov 2007 07:43:52 -0000      1.80
@@ -808,7 +808,6 @@
        return tmp.to_object();
 }
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
 bool
 as_object::on_event(const event_id& id )
 {
@@ -829,7 +828,6 @@
 
        return false;
 }
-#endif 
 
 as_value
 as_object::getMember(string_table::key name, string_table::key nsname)

Index: server/as_object.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.h,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -b -r1.82 -r1.83
--- server/as_object.h  30 Oct 2007 18:55:42 -0000      1.82
+++ server/as_object.h  16 Nov 2007 07:43:52 -0000      1.83
@@ -33,10 +33,7 @@
 #include "smart_ptr.h"
 #include "as_prop_flags.h" // for enum
 #include "GnashException.h"
-#define NEW_KEY_LISTENER_LIST_DESIGN
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-  #include "event_id.h" // for event_id
-#endif
+#include "event_id.h" // for event_id
 #include <sstream>
 
 #if defined(__GNUC__) && __GNUC__ > 2
@@ -246,9 +243,7 @@
        std::pair<bool,bool> update_member(string_table::key key, const 
as_value& val,
                string_table::key nsname = 0);
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
        virtual bool on_event(const event_id& id );
-#endif
 
        /// Reserve a slot
        ///

Index: server/button_character_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/button_character_instance.cpp,v
retrieving revision 1.64
retrieving revision 1.65
diff -u -b -r1.64 -r1.65
--- server/button_character_instance.cpp        10 Nov 2007 11:51:42 -0000      
1.64
+++ server/button_character_instance.cpp        16 Nov 2007 07:43:53 -0000      
1.65
@@ -268,11 +268,7 @@
        {
                if (m_def->m_button_actions[i].m_conditions & 0xFE00)   // 
check up on CondKeyPress: UB[7]
                {
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-                       _vm.getRoot().add_key_listener(KeyListener(this, 
KeyListener::ON_CLIP_DEF));
-#else
                        _vm.getRoot().add_key_listener(this);
-#endif
                        break;
                }
        }

Index: server/character.h
===================================================================
RCS file: /sources/gnash/gnash/server/character.h,v
retrieving revision 1.108
retrieving revision 1.109
diff -u -b -r1.108 -r1.109
--- server/character.h  10 Nov 2007 11:51:42 -0000      1.108
+++ server/character.h  16 Nov 2007 07:43:53 -0000      1.109
@@ -19,7 +19,7 @@
 //
 //
 
-/* $Id: character.h,v 1.108 2007/11/10 11:51:42 strk Exp $ */
+/* $Id: character.h,v 1.109 2007/11/16 07:43:53 zoulunkai Exp $ */
 
 #ifndef GNASH_CHARACTER_H
 #define GNASH_CHARACTER_H
@@ -195,7 +195,7 @@
        {
            return _event_handlers;
        }
-#ifndef NEW_KEY_LISTENER_LIST_DESIGN
+
        /// Return a user defined event handler, if any
        //
        /// @param name
@@ -208,7 +208,7 @@
        ///     casts to an as_function. A NULL pointer otherwise.
        ///
        boost::intrusive_ptr<as_function> getUserDefinedEventHandler(const 
std::string& name) const;
-#endif 
+
        void set_event_handlers(const Events& copyfrom);
 
        /// Used to assign a name to unnamed instances

Index: server/edit_text_character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character.cpp,v
retrieving revision 1.130
retrieving revision 1.131
diff -u -b -r1.130 -r1.131
--- server/edit_text_character.cpp      10 Nov 2007 11:51:42 -0000      1.130
+++ server/edit_text_character.cpp      16 Nov 2007 07:43:53 -0000      1.131
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: edit_text_character.cpp,v 1.130 2007/11/10 11:51:42 strk Exp $ */
+/* $Id: edit_text_character.cpp,v 1.131 2007/11/16 07:43:53 zoulunkai Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -2089,11 +2089,9 @@
 
        m_has_focus = true;
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-       _vm.getRoot().add_key_listener(KeyListener(this, 
KeyListener::ON_CLIP_DEF));
-#else
+       // why should we add to the key listener list every time
+       // we call setFocus()???
        _vm.getRoot().add_key_listener(this);
-#endif
 
        m_cursor = _text.size();
        format_text();

Index: server/movie_root.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
retrieving revision 1.122
retrieving revision 1.123
diff -u -b -r1.122 -r1.123
--- server/movie_root.cpp       14 Nov 2007 13:23:46 -0000      1.122
+++ server/movie_root.cpp       16 Nov 2007 07:43:53 -0000      1.123
@@ -34,9 +34,6 @@
 #include "URL.h"
 #include "namedStrings.h"
 #include "GnashException.h"
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-  #include "action.h"
-#endif
 
 #include <iostream>
 #include <string>
@@ -371,19 +368,16 @@
 bool
 movie_root::notify_key_event(key::code k, bool down)
 {
-//GNASH_REPORT_FUNCTION;
-
        //
        // First of all, notify the _global.Key object about key event
        //
        key_as_object * global_key = notify_global_key(k, down);
 
-       // Notify character key listeners.
+       // Notify character key listeners for clip key events
        notify_key_listeners(k, down);
-#ifndef NEW_KEY_LISTENER_LIST_DESIGN
+
        // Notify both character and non-character Key listeners
        //      for user defined handerlers.
-       // FIXME: this may violates the event order
        if(global_key)
        {
                if(down)
@@ -394,7 +388,7 @@
                else
                        global_key->notify_listeners(event_id::KEY_UP);
        }
-#endif 
+
        processActionQueue();
 
        return false; // should return true if needs update ...
@@ -779,12 +773,6 @@
        // NOTE: can throw ActionLimitException
        executeTimers();
 
-#ifndef NEW_KEY_LISTENER_LIST_DESIGN
-       // Cleanup key listeners (remove unloaded characters)
-       // FIXME: not all key listeners could be cleaned here!
-       // (eg. characters unloaded by loop-back won't be cleared until next 
advancement)
-       cleanup_key_listeners();
-#endif
        // random should go continuously that:
        // 1. after restart of the player the situation has not repeated
        // 2. by different machines the random gave different numbers
@@ -795,9 +783,7 @@
        // NOTE: can throw ActionLimitException
        advanceLiveChars(delta_time); 
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
        cleanup_key_listeners();
-#endif
 
        // Process queued actions
        // NOTE: can throw ActionLimitException
@@ -892,151 +878,15 @@
        return getLevel(0)->call_method_args(method_name, method_arg_fmt, args);
 }
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-
-void movie_root::cleanup_key_listeners()
-{
-#ifdef KEY_LISTENERS_DEBUG
-    size_t prevsize = _keyListeners.size();
-    log_msg("Cleaning up %u key listeners", _keyListeners.size());
-#endif
-
-    for (KeyListeners::iterator iter = _keyListeners.begin();
-        iter != _keyListeners.end(); )
-    {
-        // The listener object has no registered key event handlers, remove it.
-        if( !iter->hasUserRegistered() && !iter->hasOnClipRegistered() )
-        {
-            _keyListeners.erase(iter++);
-        }
-        else 
-        {
-            boost::intrusive_ptr<as_object> obj = iter->get();
-                       character* ch = dynamic_cast<character*>(obj.get());
-            // The listener object is unloaded, remove it.
-            // TODO: Don't do this again in the character destructors. should 
we?
-            if ( ch && ch->isUnloaded() ) 
-            {
-                _keyListeners.erase(iter++);
-            }
-            else
-                ++iter;
-        }
-    }
-
-#ifdef KEY_LISTENERS_DEBUG
-    size_t currsize = _keyListeners.size();
-    log_msg("Cleaned up %u listeners (from %u to %u)", prevsize-currsize, 
prevsize, currsize);
-#endif
-}
-
-void movie_root::notify_key_listeners(key::code k, bool down)
-{
-    //log_msg("Notifying " SIZET_FMT " keypress listeners", 
_keyListeners.size());
-
-    for (KeyListeners::iterator iter = _keyListeners.begin();
-        iter != _keyListeners.end(); ++iter)
-    {
-               boost::intrusive_ptr<as_object> obj = iter->get();
-        character* ch = dynamic_cast<character*>(obj.get());
-        // notify character listeners
-        if ( ch && ! ch->isUnloaded() ) 
-        {
-            if(down)
-            {
-                // invoke onClipKeyDown handler
-                ch->on_event(event_id(event_id::KEY_DOWN, key::INVALID));
-                
-                if(iter->hasUserRegistered())
-                // invoke onKeyDown handler
-                {
-                       VM& vm = VM::get();
-                       string_table& st =vm.getStringTable();
-                       ch->callMethod(st.find(PROPNAME("onKeyDown")), 
ch->get_environment());
-                }
-                // invoke onClipKeyPress handler
-                ch->on_event(event_id(event_id::KEY_PRESS, 
key::codeMap[k][0]));
-            }
-            else
-            {
-                //invoke onClipKeyUp handler
-                ch->on_event(event_id(event_id::KEY_UP, key::INVALID));   
-
-                if(iter->hasUserRegistered())
-                // invoke onKeyUp handler
-                {
-                       VM& vm = VM::get();
-                       string_table& st =vm.getStringTable();
-                       ch->callMethod(st.find(PROPNAME("onKeyUp")), 
ch->get_environment());
-                }
-            }
-        }
-        // notify non-character listeners
-        else 
-        {
-            if(down) 
-            {
-                iter->get()->on_event(event_id(event_id::KEY_DOWN, 
key::INVALID));
-            }
-            else 
-            {
-                iter->get()->on_event(event_id(event_id::KEY_UP, 
key::INVALID));
-            }
-        }
-    }
-    assert(testInvariant());
-}
-
-void movie_root::add_key_listener(const KeyListener & listener)
-{
-    KeyListeners::iterator target = _keyListeners.find(listener);
-    if(target == _keyListeners.end())
-    // The key listener is not in the container, then add it.
-    {
-        _keyListeners.insert(listener);
-    }
-    else
-    // The key listener is already in the container, then register it(again).
-    {
-        if(listener.hasUserRegistered())
-        {
-            target->registerUserHandler();
-        }
-        if(listener.hasOnClipRegistered())
-        {
-            target->registerOnClipHandler();
-        }
-    }
-
-    assert(testInvariant());
-}
-
-void movie_root::remove_key_listener(as_object* listener)
-{
-    _keyListeners.erase(KeyListener(listener));
-
-    assert(testInvariant());
-}
-
-#else // ndef NEW_KEY_LISTENER_LIST_DESIGN
-
 void movie_root::cleanup_key_listeners()
 {
-#ifdef KEY_LISTENERS_DEBUG
-       size_t prevsize = _keyListeners.size();
-       log_msg("Cleaning up %u key listeners", _keyListeners.size());
-#endif
-
-       for (ListenerSet::iterator iter = m_key_listeners.begin(); iter != 
m_key_listeners.end(); )
+    // remove unloaded character listeners from movie_root
+    for (KeyListeners::iterator iter = m_key_listeners.begin(); iter != 
m_key_listeners.end(); )
        {
-               // TODO: handle non-character objects too !
                character* ch = dynamic_cast<character*>(iter->get());
                if ( ch && ch->isUnloaded() )
                {
-                       ListenerSet::iterator toremove = iter;
-                       ++iter;
-                       //log_msg("cleanup_key_listeners: Removing unloaded key 
listener %p", iter->get());
-                       m_key_listeners.erase(toremove);
+            m_key_listeners.erase(iter++);
                }
                else
                {
@@ -1044,22 +894,22 @@
                }
        }
 
-#ifdef KEY_LISTENERS_DEBUG
-       size_t currsize = _keyListeners.size();
-       log_msg("Cleaned up %u listeners (from %u to %u)", prevsize-currsize, 
prevsize, currsize);
-#endif
+    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)
 {
-       log_msg("Notifying " SIZET_FMT " keypress listeners", 
-               m_key_listeners.size());
+    // log_msg("Notifying " SIZET_FMT " character listeners", 
+    //  m_key_listeners.size());
 
-       for (ListenerSet::iterator iter = m_key_listeners.begin();
+    for (KeyListeners::iterator iter = m_key_listeners.begin();
                         iter != m_key_listeners.end(); ++iter)
        {
                // sprite, button & input_edit_text characters
-               // TODO: invoke functions on non-characters !
                character* ch = dynamic_cast<character*>(iter->get());
                if ( ch && ! ch->isUnloaded() )
                {
@@ -1079,25 +929,33 @@
 
 void movie_root::add_key_listener(as_object* listener)
 {
-       if ( m_key_listeners.insert(listener).second )
-       {
-               //log_msg("Added key listener %p", (void*)listener);
-       }
-       else
+    for(KeyListeners::iterator i = m_key_listeners.begin(), e = 
m_key_listeners.end();
+            i != e; ++i)
        {
-               //log_msg("key listener %p was already in the known set", 
(void*)listener);
+        // Conceptually, we don't need to add the same character twice.
+        // but see edit_text_character::setFocus()...
+        if(*i == listener)  return;
        }
-       assert(testInvariant());
+
+    //for character listeners, first added last called
+    m_key_listeners.push_front(listener);
 }
 
 void movie_root::remove_key_listener(as_object* listener)
 {
-       //log_msg("Removing key listener %p - %u listeners currently ", 
(void*)listener, m_key_listeners.size());
-       m_key_listeners.erase(listener);
-       //log_msg("After removing key listener %p, %u listeners are left", 
(void*)listener, m_key_listeners.size());
-       assert(testInvariant());
+    for(KeyListeners::iterator iter = m_key_listeners.begin(); 
+            iter != m_key_listeners.end(); )
+    {
+        if(*iter == listener) 
+        {
+            m_key_listeners.erase(iter++);
+        }
+        else
+        {
+            iter++;
+        }
+    }
 }
-#endif // ndef NEW_KEY_LISTENER_LIST_DESIGN
 
 void movie_root::add_mouse_listener(as_object* listener)
 {
@@ -1394,21 +1252,12 @@
        }
     }
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-       // Mark key listeners
-       for (KeyListeners::const_iterator i=_keyListeners.begin(), 
e=_keyListeners.end();
-                       i != e; ++i)
-       {
-               i->setReachable();
-       }
-#else
-       // Mark key listeners
-       for (ListenerSet::const_iterator i=m_key_listeners.begin(), 
e=m_key_listeners.end();
+    // Mark character key listeners
+    for (KeyListeners::const_iterator i=m_key_listeners.begin(), 
e=m_key_listeners.end();
                        i != e; ++i)
        {
                (*i)->setReachable();
        }
-#endif
 
        // Mark global key object
        if ( _keyobject ) _keyobject->setReachable();

Index: server/movie_root.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.h,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -b -r1.87 -r1.88
--- server/movie_root.h 14 Nov 2007 13:23:47 -0000      1.87
+++ server/movie_root.h 16 Nov 2007 07:43:53 -0000      1.88
@@ -15,7 +15,7 @@
 // along with this program; if not, write to the Free Software
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
-/* $Id: movie_root.h,v 1.87 2007/11/14 13:23:47 strk Exp $ */
+/* $Id: movie_root.h,v 1.88 2007/11/16 07:43:53 zoulunkai Exp $ */
 
 /// \page events_handling Handling of user events
 ///
@@ -103,76 +103,6 @@
     }
 };
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-class KeyListener{
-    public:
-        
-        KeyListener(boost::intrusive_ptr<as_object> obj, int flag=0)
-        : _listener(obj), _registered_type(flag)
-        {}
-
-        boost::intrusive_ptr<as_object> get() const { return _listener; }
-
-        bool operator == (const KeyListener & rhs ) const { return _listener 
== rhs.get(); }
-        bool operator != (const KeyListener & rhs ) const { return _listener 
!= rhs.get(); }
-        bool operator < (const KeyListener & rhs ) const { return _listener < 
rhs.get(); }
-        
-        enum
-        {
-            ON_CLIP_DEF = 1 << 0,
-            USER_DEF    = 1 << 1
-        };
-
-        /// \brief
-        /// true if the _listener has OnClip defined key event handlers,
-        /// false if the _listener has no OnClip defined key event handlers.
-        ///
-        /// OnClip defined key event handlers are registered automatically and 
can not
-        /// be unregistered when they are defined.
-        bool hasOnClipRegistered() const { return _registered_type & 
ON_CLIP_DEF; }
-        
-        /// \brief
-        /// true if the _listener has been registered by Key.addListener(),
-        /// false if the _listener has not been registered by Key.addListener()
-        /// or unregistered by Key.removeListener().
-        bool hasUserRegistered() const { return _registered_type & USER_DEF; } 
     
-
-        /// register user defined key handler
-        void registerUserHandler() const { _registered_type |= USER_DEF; }
-        
-        /// register OnClip defined key handler
-        void registerOnClipHandler() const { _registered_type |= ON_CLIP_DEF; }
-
-        /// unregister user defined key handler
-        void unregisterUserHandler() const { _registered_type ^= USER_DEF; }
-
-#ifdef GNASH_USE_GC
-        /// Mark the wrapped object as reachable
-        void setReachable() const
-        {
-            if ( _listener ) _listener->setReachable();
-        }
-#endif
-
-    private:
-
-        /// the listener object, could be a character or a general as_object
-        boost::intrusive_ptr<as_object> _listener;
-
-        /// 0: the listener has no registered event handlers, to be removed;
-        /// ON_CLIP_DEF: the listener has registered onClip event handlers;
-        /// USER_DEF: the listener has registered user defined handlers;
-        //
-        // (1) onClip handlers get registered as soon as they are defined, and 
-        //     will never get unregistered;
-        // (2) user defined handlers get registered by Key.addListener(obj),
-        //     and unregistered by Key.removedListener(obj);
-        // mutable here is a hack for using std::set<>, we might drop this 
class 
-        // or change to another container later.
-        mutable int _registered_type;
-    };
-#endif 
-
 /// The movie stage (absolute top level node in the characters hierarchy)
 //
 /// This is a wrapper around the set of loaded levels being played.
@@ -482,24 +412,19 @@
     void * get_userdata() { return m_userdata; }
     void set_userdata(void * ud ) { m_userdata = ud;  }
 
+       /// Notify both the character listeners and general object listeners
     DSOEXPORT void notify_key_listeners(key::code k, bool down);
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-    // Push a new key listener to the container if it is not there,
-    // otherwise, just register it.
-    void add_key_listener(const KeyListener& listener);
     
-    // remove the specified listener from the container if found
-    void remove_key_listener(as_object* listener);
-
-    typedef std::set<KeyListener> KeyListeners;
-    KeyListeners & getKeyListeners() { return _keyListeners; }
-#else
+       /// Push a new character listener to the container after constructing 
the character
     void add_key_listener(as_object* listener);
+
+       /// Remove a character from the container only when the character is 
unloaded
     void remove_key_listener(as_object* listener);
-#endif
 
     DSOEXPORT void notify_mouse_listeners(const event_id& event);
+
     void add_mouse_listener(as_object* listener);
+
     void remove_mouse_listener(as_object* listener);
 
     /// Get the character having focus
@@ -709,14 +634,14 @@
     unsigned int _lastTimerId;
 
     /// A set of as_objects kept by intrusive_ptr
+       /// TODO: dont' use std::use, we need to well control the calling order
     typedef std::set< boost::intrusive_ptr<as_object> > ListenerSet;
 
-    /// Objects listening for key events
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-    KeyListeners _keyListeners;
-#else
-    ListenerSet m_key_listeners;
-#endif
+    /// key listeners container
+    typedef std::list< boost::intrusive_ptr<as_object> > KeyListeners;
+
+    /// Characters for listening key events
+    KeyListeners m_key_listeners;
 
     boost::intrusive_ptr<key_as_object> _keyobject;
 

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.387
retrieving revision 1.388
diff -u -b -r1.387 -r1.388
--- server/sprite_instance.cpp  15 Nov 2007 22:23:34 -0000      1.387
+++ server/sprite_instance.cpp  16 Nov 2007 07:43:53 -0000      1.388
@@ -3356,19 +3356,14 @@
                method_name, method_arg_fmt, args);
 }
 
+/// register characters as key listeners if they have clip key events defined.
+/// Don't call twice for the same chracter.
 void
 sprite_instance::registerAsListener()
 {
        if (m_has_key_event)
        {
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-               // TODO: Don't do this at every advancement
-               // OnClip key handlers should be registered at construction 
time, 
-               // User defined handlers should be registered explicitly by 
Key.addListener();
-               _vm.getRoot().add_key_listener(KeyListener(this, 
KeyListener::ON_CLIP_DEF));
-#else
                _vm.getRoot().add_key_listener(this);
-#endif
        }
        // Mouse events listening is done in has_mouse_event directly.
        // This shows to work better for attachMovieTest.swf,

Index: server/asobj/Key.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Key.cpp,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -b -r1.43 -r1.44
--- server/asobj/Key.cpp        14 Nov 2007 05:12:51 -0000      1.43
+++ server/asobj/Key.cpp        16 Nov 2007 07:43:53 -0000      1.44
@@ -36,15 +36,15 @@
 namespace gnash {
 
 /************************************************************************
- *
- * This has been moved from action.cpp, when things are clean
- * everything should have been moved up
- *
- ************************************************************************/
+*
+* This has been moved from action.cpp, when things are clean
+* everything should have been moved up
+*
+************************************************************************/
 
 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));
@@ -68,7 +68,7 @@
 }
 
 void
-key_as_object::set_key_down(int code)
+    key_as_object::set_key_down(int code)
 {
     if (code < 0 || code >= key::KEYCOUNT) return;
 
@@ -108,73 +108,85 @@
     m_unreleased_keys[byte_index] &= ~mask;
 }
 
-#ifndef NEW_KEY_LISTENER_LIST_DESIGN
+
 void 
-key_as_object::notify_listeners(const event_id key_event_type)
+key_as_object::notify_listeners(const event_id key_event)
 {
-    
-    std::string funcname = key_event_type.get_function_name();
-    // There is no user defined "onKeyPress" event handler
-    if( ( funcname != "onKeyDown") && (funcname != "onKeyUp") )
+    if( m_listeners.empty() )  
+    {
         return;
+    }
 
-    VM& vm = VM::get();
-    if ( vm.getSWFVersion() < 7 )
+    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
     {
-        boost::to_lower(funcname, vm.getLocale());
+        return;
     }
 
-    // Notify listeners.
-    for (std::vector<boost::intrusive_ptr<as_object> >::iterator iter = 
m_listeners.begin();
-         iter != m_listeners.end(); ++iter) {
-      if (*iter == NULL)
-        continue;
+    for (Listeners::iterator iter = m_listeners.begin(); iter != 
m_listeners.end(); ++iter) 
+    {
+        if (*iter == NULL)  continue;
 
-      boost::intrusive_ptr<as_object>  listener = *iter; // Hold an owning 
reference.
-      as_value method;
+        as_value event_handler;
+        bool found_handler = 
+            iter->get()->get_member(_vm.getStringTable().find(handler_name), 
&event_handler);
 
-       if (listener->get_member(VM::get().getStringTable().find(funcname), 
&method))
-        call_method(method, NULL /* or root? */, listener.get(), 0, 0);
+        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);
     }
-}
-#endif // ndef NEW_KEY_LISTENER_LIST_DESIGN
+            else
+            {
+                // execute non-character handlers
+                call_method(event_handler, NULL, iter->get(), 0, 0);
+            }
+        }
+    } // end of for
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-void
-key_as_object::add_listener(const KeyListener& listener)
-{
-    _vm.getRoot().add_key_listener(listener);
 }
 
+
 void
-key_as_object::remove_listener(boost::intrusive_ptr<as_object> listener)
+key_as_object::cleanup_unloaded_listeners()
 {
-    // Should keep consistent with definiton in movie_root.h
-    typedef std::set<KeyListener> KeyListeners;
-
-    KeyListeners & listeners = _vm.getRoot().getKeyListeners();
-    
-    KeyListeners::iterator target = listeners.find(KeyListener(listener));
-
-       KeyListeners::iterator it_end = listeners.end();
-
-    if(target != it_end)
+    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
     {
-        target->unregisterUserHandler();
+            ++iter;
+        }
     }
 }
 
-#else // ndef NEW_KEY_LISTENER_LIST_DESIGN
 
 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?
-    std::vector<boost::intrusive_ptr<as_object> >::const_iterator end = 
m_listeners.end();
-    for (std::vector<boost::intrusive_ptr<as_object> >::iterator iter = 
m_listeners.begin();
-         iter != end; ++iter) {
-      if (*iter == NULL) {
+    for (Listeners::iterator i = m_listeners.begin(), e = m_listeners.end(); i 
!= e; ++i)
+    {
+        if (*i == listener) 
+        {
         // Already in the list.
         return;
       }
@@ -183,21 +195,22 @@
     m_listeners.push_back(listener);
 }
 
+
 void
 key_as_object::remove_listener(boost::intrusive_ptr<as_object> listener)
 {
 
-    for (std::vector<boost::intrusive_ptr<as_object> >::iterator iter = 
m_listeners.begin(); iter != m_listeners.end(); )
+    for (Listeners::iterator iter = m_listeners.begin(); iter != 
m_listeners.end(); )
     {
         if (*iter == listener)
         {
-            iter = m_listeners.erase(iter);
+            m_listeners.erase(iter++);
             continue;
         }
         iter++;
     }
 }
-#endif // ndef NEW_KEY_LISTENER_LIST_DESIGN
+
 
 int
 key_as_object::get_last_key() const
@@ -229,22 +242,13 @@
         return as_value();
     }
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-
-    ko->add_listener(KeyListener(toadd, KeyListener::USER_DEF));
-
-#else // ndef NEW_KEY_LISTENER_LIST_DESIGN
-
     ko->add_listener(toadd);
 
-#endif // ndef NEW_KEY_LISTENER_LIST_DESIGN
-
     return as_value();
 }
 
 
-// Return the ascii value of the last key pressed.
-/// FIXME: return the ascii number(not string) of the last pressed key!
+/// Return the ascii number of the last key pressed.
 static as_value   
 key_get_ascii(const fn_call& fn)
 {
@@ -255,9 +259,9 @@
                return as_value(gnash::key::codeMap[code][2]);
 }
 
-// Returns the keycode of the last key pressed.
+/// Returns the keycode of the last key pressed.
 static as_value   
-key_get_code(const fn_call& fn)
+    key_get_code(const fn_call& fn)
 {
     boost::intrusive_ptr<key_as_object> ko = 
ensureType<key_as_object>(fn.this_ptr);
                
@@ -329,8 +333,8 @@
 void key_class_init(as_object& global)
 {
 
-//  GNASH_REPORT_FUNCTION;
-//
+    //  GNASH_REPORT_FUNCTION;
+    //
     int swfversion = VM::get().getSWFVersion();
 
     // Create built-in key object.
@@ -375,7 +379,6 @@
 }
 
 #ifdef GNASH_USE_GC
-#ifndef NEW_KEY_LISTENER_LIST_DESIGN
 void
 key_as_object::markReachableResources() const
 {
@@ -386,7 +389,6 @@
         (*i)->setReachable();
     }
 }
-#endif // ndef NEW_KEY_LISTENER_LIST_DESIGN
 #endif // def GNASH_USE_GC
 
 } // end of gnash namespace

Index: server/asobj/Key.h
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Key.h,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -b -r1.29 -r1.30
--- server/asobj/Key.h  10 Oct 2007 14:07:58 -0000      1.29
+++ server/asobj/Key.h  16 Nov 2007 07:43:53 -0000      1.30
@@ -16,7 +16,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 // 
 
-/* $Id: Key.h,v 1.29 2007/10/10 14:07:58 bwy Exp $ */
+/* $Id: Key.h,v 1.30 2007/11/16 07:43:53 zoulunkai Exp $ */
 
 #ifndef __KEY_H__
 #define __KEY_H__
@@ -39,10 +39,6 @@
 
 namespace gnash {
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-class KeyListener; //forward declaration
-#endif
-
 /************************************************************************
  *
  * This has been moved from action.cpp, when things are clean
@@ -57,22 +53,16 @@
        /// bit-array for recording the unreleased keys
        uint8_t m_unreleased_keys[key::KEYCOUNT / 8 + 1];       
 
-#ifndef NEW_KEY_LISTENER_LIST_DESIGN
-       typedef std::vector<boost::intrusive_ptr<as_object> > Listeners;
+    typedef std::list<boost::intrusive_ptr<as_object> > Listeners;
        Listeners m_listeners;
-#endif
 
        int     m_last_key_event;
 
 protected:
 
 #ifdef GNASH_USE_GC
-#ifndef NEW_KEY_LISTENER_LIST_DESIGN
        // Mark all key listeners as reachable
-       // (this class has no direct pointer to listeners when
-       //  NEW_KEY_LISTENER_LIST_DESIGN is defined)
        void markReachableResources() const;
-#endif // ndef NEW_KEY_LISTENER_LIST_DESIGN
 #endif // def GNASH_USE_GC
 
 public:
@@ -92,24 +82,18 @@
        // pressed (m_unreleased_keys)
        void set_key_up(int code);
        
-#ifndef NEW_KEY_LISTENER_LIST_DESIGN
-       /// responsible for user defined key events handlers only;
+    int get_last_key() const;
+
+    /// 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);
-#endif // ndef NEW_KEY_LISTENER_LIST_DESIGN
 
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-       void add_listener(const KeyListener& listener);
+    /// Remove unloaded character listeners from the list.
+    void cleanup_unloaded_listeners();
 
-       void remove_listener(boost::intrusive_ptr<as_object> listener);
-#else  
        void add_listener(boost::intrusive_ptr<as_object> listener);
 
        void remove_listener(boost::intrusive_ptr<as_object> listener);
-#endif
-
-       int get_last_key() const;
-
 };
 
 void key_class_init(as_object& global);

Index: testsuite/misc-ming.all/key_event_test.c
===================================================================
RCS file: /sources/gnash/gnash/testsuite/misc-ming.all/key_event_test.c,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- testsuite/misc-ming.all/key_event_test.c    15 Nov 2007 08:39:27 -0000      
1.6
+++ testsuite/misc-ming.all/key_event_test.c    16 Nov 2007 07:43:53 -0000      
1.7
@@ -291,7 +291,7 @@
   SWFDisplayItem_remove(it3);
   SWFMovie_nextFrame(mo);  // _root frame22
  
-  xcheck_equals(mo, "test5", 
"'0+ls3+ls2+ls1+obj1+ls1+obj2+ls2+obj3+obj1+obj2+obj3'");
+  check_equals(mo, "test5", 
"'0+ls3+ls2+ls1+obj1+ls1+obj2+ls2+obj3+obj1+obj2+obj3'");
   add_actions(mo, "totals(); stop();");
   SWFMovie_nextFrame(mo);  // _root frame23
   //Output movie

Index: testsuite/misc-ming.all/key_event_testrunner.cpp
===================================================================
RCS file: 
/sources/gnash/gnash/testsuite/misc-ming.all/key_event_testrunner.cpp,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -b -r1.14 -r1.15
--- testsuite/misc-ming.all/key_event_testrunner.cpp    15 Nov 2007 08:51:57 
-0000      1.14
+++ testsuite/misc-ming.all/key_event_testrunner.cpp    16 Nov 2007 07:43:53 
-0000      1.15
@@ -125,8 +125,7 @@
   tester.releaseKey(key::F);
   
   // we have jumped backward to frame11
-  // Gnash failed on notifying an unloaded character listener
-  xcheck_equals(root->get_current_frame(), 10);
+  check_equals(root->get_current_frame(), 10);
   
   tester.advance();
   // and we are in frame12 again




reply via email to

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