gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash ChangeLog server/asobj/Key.cpp server/aso...


From: Zou Lunkai
Subject: [Gnash-commit] gnash ChangeLog server/asobj/Key.cpp server/aso...
Date: Tue, 17 Jul 2007 06:04:22 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Zou Lunkai <zoulunkai>  07/07/17 06:04:22

Modified files:
        .              : ChangeLog 
        server/asobj   : Key.cpp Key.h 
        server         : button_character_instance.cpp 
                         edit_text_character.cpp movie_root.cpp 
                         movie_root.h sprite_instance.cpp 

Log message:
        * server/asobj/Key.h, server/asobj/Key.cpp, 
          server/button_character_instance.cpp
          server/edit_text_character.cpp, server/movie_root.h, 
          sever/movie_root.cpp, server/sprite_instance.cpp: key listener
          handling cleanups, for better management of key listeners. change
          key listeners container from std::vector to std::set. Correct indent.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.3741&r2=1.3742
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Key.cpp?cvsroot=gnash&r1=1.28&r2=1.29
http://cvs.savannah.gnu.org/viewcvs/gnash/server/asobj/Key.h?cvsroot=gnash&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button_character_instance.cpp?cvsroot=gnash&r1=1.52&r2=1.53
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.cpp?cvsroot=gnash&r1=1.74&r2=1.75
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.77&r2=1.78
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.h?cvsroot=gnash&r1=1.67&r2=1.68
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.298&r2=1.299

Patches:
Index: ChangeLog
===================================================================
RCS file: /sources/gnash/gnash/ChangeLog,v
retrieving revision 1.3741
retrieving revision 1.3742
diff -u -b -r1.3741 -r1.3742
--- ChangeLog   14 Jul 2007 19:32:27 -0000      1.3741
+++ ChangeLog   17 Jul 2007 06:04:21 -0000      1.3742
@@ -1,3 +1,12 @@
+2007-07-17 Zou Lunkai <address@hidden>
+
+       * server/asobj/Key.h, server/asobj/Key.cpp, 
+         server/button_character_instance.cpp
+         server/edit_text_character.cpp, server/movie_root.h, 
+         sever/movie_root.cpp, server/sprite_instance.cpp: key listener
+         handling cleanups, for better management of key listeners. change
+         key listeners container from std::vector to std::set. Correct indent.
+       
 2007-07-14  Rob Savoye  <address@hidden>
 
        * configure.ac: Add new Cygnal directories.

Index: server/asobj/Key.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Key.cpp,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -b -r1.28 -r1.29
--- server/asobj/Key.cpp        10 Jul 2007 12:22:34 -0000      1.28
+++ server/asobj/Key.cpp        17 Jul 2007 06:04:22 -0000      1.29
@@ -187,26 +187,26 @@
 }
 
 void
-key_as_object::remove_listener(const KeyListener&      listener)
+key_as_object::remove_listener(boost::intrusive_ptr<as_object> listener)
 {
-       std::vector<KeyListener> & listeners = _vm.getRoot().getKeyListeners();
+    // 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();
 
-       std::vector<KeyListener>::iterator end = listeners.end();
-       for     (std::vector<KeyListener>::iterator     iter = 
listeners.begin();
-                                iter   != end; ++iter) 
+    if(target != it_end)
        {
-                       if ((*iter)     == listener) {
-                               // Found it
-                               iter->unregisterUserHandler();
-                               return;
-                       }
+        target->unregisterUserHandler();
        }
 }
 #else
 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();
@@ -261,7 +261,7 @@
 
     boost::intrusive_ptr<key_as_object> ko = 
ensureType<key_as_object>(fn.this_ptr);
 
-    ko->add_listener(KeyListener(toadd, true));
+    ko->add_listener(KeyListener(toadd, KeyListener::USER_DEF));
     return as_value();
 }
 #else
@@ -307,7 +307,7 @@
 }
 
 as_value       key_get_code(const fn_call& fn)
-    // Returns the keycode of the last key pressed.
+// Returns the keycode of the last key pressed.
 {
     boost::intrusive_ptr<key_as_object> ko = 
ensureType<key_as_object>(fn.this_ptr);
 
@@ -315,7 +315,7 @@
 }
 
 as_value       key_is_down(const fn_call& fn)
-    // Return true if the specified (first arg keycode) key is pressed.
+// Return true if the specified (first arg keycode) key is pressed.
 {
     if (fn.nargs < 1)
        {
@@ -331,8 +331,8 @@
 }
 
 as_value       key_is_toggled(const fn_call& /* fn */)
-    // Given the keycode of NUM_LOCK or CAPSLOCK, returns true if
-    // the associated state is on.
+// Given the keycode of NUM_LOCK or CAPSLOCK, returns true if
+// the associated state is on.
 {
     // @@ TODO
     return as_value(false);
@@ -357,12 +357,12 @@
 
     boost::intrusive_ptr<key_as_object> ko = 
ensureType<key_as_object>(fn.this_ptr); 
 
-    ko->remove_listener(KeyListener(toremove));
+    ko->remove_listener(toremove);
     return as_value();
 }
 #else
 as_value       key_remove_listener(const fn_call& fn)
-    // Remove a previously-added listener.
+// Remove a previously-added listener.
 {
     if (fn.nargs < 1)
        {

Index: server/asobj/Key.h
===================================================================
RCS file: /sources/gnash/gnash/server/asobj/Key.h,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- server/asobj/Key.h  10 Jul 2007 04:59:24 -0000      1.22
+++ server/asobj/Key.h  17 Jul 2007 06:04:22 -0000      1.23
@@ -16,7 +16,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 // 
 
-/* $Id: Key.h,v 1.22 2007/07/10 04:59:24 strk Exp $ */
+/* $Id: Key.h,v 1.23 2007/07/17 06:04:22 zoulunkai Exp $ */
 
 #ifndef __KEY_H__
 #define __KEY_H__
@@ -141,7 +141,7 @@
 #ifdef NEW_KEY_LISTENER_LIST_DESIGN
        void add_listener(const KeyListener& listener);
 
-       void remove_listener(const KeyListener& listener);
+       void remove_listener(boost::intrusive_ptr<as_object> listener);
 #else  
        void add_listener(boost::intrusive_ptr<as_object> listener);
 

Index: server/button_character_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/button_character_instance.cpp,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -b -r1.52 -r1.53
--- server/button_character_instance.cpp        10 Jul 2007 16:18:38 -0000      
1.52
+++ server/button_character_instance.cpp        17 Jul 2007 06:04:22 -0000      
1.53
@@ -269,7 +269,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));
+                       _vm.getRoot().add_key_listener(KeyListener(this, 
KeyListener::ON_CLIP_DEF));
 #else
                        _vm.getRoot().add_key_listener(this);
 #endif
@@ -281,11 +281,7 @@
 
 button_character_instance::~button_character_instance()
 {
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-       _vm.getRoot().remove_key_listener(KeyListener(this));
-#else
        _vm.getRoot().remove_key_listener(this);
-#endif
 }
 
 

Index: server/edit_text_character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character.cpp,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -b -r1.74 -r1.75
--- server/edit_text_character.cpp      11 Jul 2007 16:52:47 -0000      1.74
+++ server/edit_text_character.cpp      17 Jul 2007 06:04:22 -0000      1.75
@@ -17,7 +17,7 @@
 // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 //
 
-/* $Id: edit_text_character.cpp,v 1.74 2007/07/11 16:52:47 strk Exp $ */
+/* $Id: edit_text_character.cpp,v 1.75 2007/07/17 06:04:22 zoulunkai Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -511,7 +511,7 @@
                        if (m_has_focus == false)
                        {
 #ifdef NEW_KEY_LISTENER_LIST_DESIGN
-                               
_vm.getRoot().add_key_listener(KeyListener(this));
+                               
_vm.getRoot().add_key_listener(KeyListener(this, KeyListener::ON_CLIP_DEF));
 #else
                                _vm.getRoot().add_key_listener(this);
 #endif
@@ -528,11 +528,7 @@
                        {
                                movie_root& root = _vm.getRoot();
                                root.set_active_entity(NULL);
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-                               root.remove_key_listener(KeyListener(this));
-#else
                                root.remove_key_listener(this);
-#endif
                                m_has_focus = false;
                                format_text();
                        }

Index: server/movie_root.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -b -r1.77 -r1.78
--- server/movie_root.cpp       11 Jul 2007 00:41:07 -0000      1.77
+++ server/movie_root.cpp       17 Jul 2007 06:04:22 -0000      1.78
@@ -743,25 +743,28 @@
        log_msg("Cleaning up %u key listeners", _keyListeners.size());
 #endif
 
-       for (std::vector<KeyListener>::iterator iter = _keyListeners.begin();
+    for (KeyListeners::iterator iter = _keyListeners.begin();
                 iter != _keyListeners.end(); )
        {
-               
-               character* ch = dynamic_cast<character*>(iter->get());
-               // remove character listener
-               if ( ch && ch->isUnloaded() ) 
+        // The listener object has no registered key event handlers, remove it.
+        if( !iter->hasUserRegistered() && !iter->hasOnClipRegistered() )
                {
-                       iter = _keyListeners.erase(iter);
+            _keyListeners.erase(iter++);
                }
-               // remove non-character listener
-               else if(!ch && !iter->isRegistered())
+        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() ) 
                {
-                       iter = _keyListeners.erase(iter);
+                _keyListeners.erase(iter++);
                }
                else
                        ++iter;
        }
-
+    }
 
 #ifdef KEY_LISTENERS_DEBUG
        size_t currsize = _keyListeners.size();
@@ -775,10 +778,11 @@
 
        as_environment env;
 
-       for (std::vector<KeyListener>::iterator iter = _keyListeners.begin();
+    for (KeyListeners::iterator iter = _keyListeners.begin();
                iter != _keyListeners.end(); ++iter)
        {
-               character* ch = dynamic_cast<character*>(iter->get());
+               boost::intrusive_ptr<as_object> obj = iter->get();
+        character* ch = dynamic_cast<character*>(obj.get());
                // notify character listeners
                if ( ch && ! ch->isUnloaded() ) 
                {
@@ -787,7 +791,7 @@
                                // invoke onClipKeyDown handler
                                ch->on_event(event_id(event_id::KEY_DOWN, 
key::INVALID));
                                
-                               if(iter->isRegistered())
+                if(iter->hasUserRegistered())
                                // invoke onKeyDown handler
                                {
                                        boost::intrusive_ptr<as_function> 
@@ -805,7 +809,7 @@
                                //invoke onClipKeyUp handler
                                ch->on_event(event_id(event_id::KEY_UP, 
key::INVALID));   
 
-                               if(iter->isRegistered())
+                if(iter->hasUserRegistered())
                                // invoke onKeyUp handler
                                {
                                        boost::intrusive_ptr<as_function> 
@@ -830,40 +834,37 @@
                        }
                }
        }
-
        assert(testInvariant());
 }
 
 void movie_root::add_key_listener(const KeyListener & listener)
 {
-       std::vector<KeyListener>::iterator end = _keyListeners.end();
-    for (std::vector<KeyListener>::iterator iter = _keyListeners.begin();
-         iter != end; ++iter) 
+    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())
        {
-      if ((*iter) == listener) {
-        // Already in the list.
-               iter->registerUserHandler();
-        return;
+            target->registerUserHandler();
+        }
+        if(listener.hasOnClipRegistered())
+        {
+            target->registerOnClipHandler();
       }
     }
-
-    _keyListeners.push_back(listener);
 
        assert(testInvariant());
 }
 
-void movie_root::remove_key_listener(const KeyListener&        listener)
+void movie_root::remove_key_listener(as_object* listener)
 {
-       std::vector<KeyListener>::iterator end = _keyListeners.end();
-               for     (std::vector<KeyListener>::iterator     iter = 
_keyListeners.begin();
-                                iter   != end; ++iter) 
-       {
-                       if ((*iter)     == listener) {
-                               // If found, then remove it from the container
-                               _keyListeners.erase(iter);
-                               return;
-                       }
-               }
+    _keyListeners.erase(KeyListener(listener));
+
        assert(testInvariant());
 }
 

Index: server/movie_root.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.h,v
retrieving revision 1.67
retrieving revision 1.68
diff -u -b -r1.67 -r1.68
--- server/movie_root.h 10 Jul 2007 23:48:42 -0000      1.67
+++ server/movie_root.h 17 Jul 2007 06:04:22 -0000      1.68
@@ -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.67 2007/07/10 23:48:42 strk Exp $ */
+/* $Id: movie_root.h,v 1.68 2007/07/17 06:04:22 zoulunkai Exp $ */
 
 /// \page events_handling Handling of user events
 ///
@@ -106,27 +106,45 @@
 #ifdef NEW_KEY_LISTENER_LIST_DESIGN
 class KeyListener{
        public:
-               /// all constructed key listeners are not registered to the 
global Key object by default.
-               KeyListener(boost::intrusive_ptr<as_object> obj, bool 
flag=false)
-               : _listener(obj), _user_defined_handler_added(flag)
+        
+        KeyListener(boost::intrusive_ptr<as_object> obj, int flag=0)
+        : _listener(obj), _registered_type(flag)
                {}
 
-               as_object * get() const { return _listener.get(); }
+        boost::intrusive_ptr<as_object> get() const { return _listener; }
 
-               bool operator == (const KeyListener & rhs ) const { return 
_listener.get() == rhs.get(); }
-               bool operator != (const KeyListener & rhs ) const { return 
_listener.get() != rhs.get(); }
+        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
-               /// Return true if the _listener has been registered by 
Key.addListener(),
-               /// false if the _listener has not been registered or 
unregistered by Key.removeListener().
-               /// The return value is used to decide if we should invoke the 
user defined handler.
-               bool isRegistered() const { return _user_defined_handler_added; 
}
+        /// 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; }
                
-               /// unregister the key listener
-               void unregisterUserHandler() { _user_defined_handler_added = 
false; }
+        /// \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 the key listener
-               void registerUserHandler() { _user_defined_handler_added = 
true; }
+        /// 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
@@ -141,8 +159,17 @@
                /// the listener object, could be a character or a general 
as_object
                boost::intrusive_ptr<as_object> _listener;
 
-               /// mark if the object has been registered by Key.addListener()
-               bool _user_defined_handler_added;
+        /// 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 
 
@@ -505,9 +532,10 @@
        void add_key_listener(const KeyListener& listener);
        
        // remove the specified listener from the container if found
-       void remove_key_listener(const KeyListener& listener);
+    void remove_key_listener(as_object* listener);
        
-       std::vector<KeyListener> & getKeyListeners() { return _keyListeners; }
+    typedef std::set<KeyListener> KeyListeners;
+    KeyListeners & getKeyListeners() { return _keyListeners; }
 #else
        void add_key_listener(as_object* listener);
        void remove_key_listener(as_object* listener);
@@ -628,7 +656,6 @@
 
        /// Objects listening for key events
 #ifdef NEW_KEY_LISTENER_LIST_DESIGN
-       typedef std::vector<KeyListener> KeyListeners;
        KeyListeners _keyListeners;
 #else
        ListenerSet m_key_listeners;

Index: server/sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.298
retrieving revision 1.299
diff -u -b -r1.298 -r1.299
--- server/sprite_instance.cpp  13 Jul 2007 20:40:32 -0000      1.298
+++ server/sprite_instance.cpp  17 Jul 2007 06:04:22 -0000      1.299
@@ -1782,11 +1782,7 @@
 
        if (m_has_key_event)
        {
-#ifdef NEW_KEY_LISTENER_LIST_DESIGN
-               _vm.getRoot().remove_key_listener(KeyListener(this));
-#else
                _vm.getRoot().remove_key_listener(this);
-#endif
        }
 
        if (m_has_mouse_event)
@@ -2452,7 +2448,7 @@
                if (m_has_key_event)
                {
 #ifdef NEW_KEY_LISTENER_LIST_DESIGN
-                       _vm.getRoot().add_key_listener(KeyListener(this));
+                       _vm.getRoot().add_key_listener(KeyListener(this, 
KeyListener::ON_CLIP_DEF));
 #else
                        _vm.getRoot().add_key_listener(this);
 #endif




reply via email to

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