gnash-commit
[Top][All Lists]
Advanced

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

Re: [Gnash-commit] gnash ChangeLog server/movie_root.cpp server/mo...


From: zou lunkai
Subject: Re: [Gnash-commit] gnash ChangeLog server/movie_root.cpp server/mo...
Date: Thu, 22 Nov 2007 09:14:49 +0800

>+        if ( ch->isUnloaded() ) iter = ll.erase(iter++);

Was this intended?  " iter = ll.erase(iter++);"

--zou

On Nov 22, 2007 1:11 AM, Sandro Santilli <address@hidden> wrote:
> CVSROOT:        /sources/gnash
> Module name:    gnash
> Changes by:     Sandro Santilli <strk>  07/11/21 17:11:53
>
> Modified files:
>         .              : ChangeLog
>         server         : movie_root.cpp movie_root.h sprite_instance.cpp
>
> Log message:
>         Generalize key and mouse character listeners management.
>
> CVSWeb URLs:
> http://cvs.savannah.gnu.org/viewcvs/gnash/ChangeLog?cvsroot=gnash&r1=1.4907&r2=1.4908
> http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.125&r2=1.126
> http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.h?cvsroot=gnash&r1=1.89&r2=1.90
> http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.389&r2=1.390
>
> Patches:
> Index: ChangeLog
> ===================================================================
> RCS file: /sources/gnash/gnash/ChangeLog,v
> retrieving revision 1.4907
> retrieving revision 1.4908
> diff -u -b -r1.4907 -r1.4908
> --- ChangeLog   21 Nov 2007 09:21:48 -0000      1.4907
> +++ ChangeLog   21 Nov 2007 17:11:52 -0000      1.4908
> @@ -1,3 +1,10 @@
> +2007-11-21 Sandro Santilli <address@hidden>
> +
> +       * server/movie_root.{cpp,h}: generalize key and mouse
> +         listeners management.
> +       * server/sprite_instance.cpp (add_display_object): don't
> +         attempt to remove a NULL pointer from the listeners set.
> +
>  2007-11-21 Chad Musick <address@hidden>
>
>         * server/as_environment.h,.cpp: Initialize _original_target, as this
>
> Index: server/movie_root.cpp
> ===================================================================
> RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
> retrieving revision 1.125
> retrieving revision 1.126
> diff -u -b -r1.125 -r1.126
> --- server/movie_root.cpp       16 Nov 2007 17:35:34 -0000      1.125
> +++ server/movie_root.cpp       21 Nov 2007 17:11:52 -0000      1.126
> @@ -783,7 +783,7 @@
>         // NOTE: can throw ActionLimitException
>         advanceLiveChars(delta_time);
>
> -       cleanup_key_listeners();
> +       cleanupUnloadedListeners();
>
>         // Process queued actions
>         // NOTE: can throw ActionLimitException
> @@ -878,35 +878,30 @@
>         return getLevel(0)->call_method_args(method_name, method_arg_fmt, 
> args);
>  }
>
> -void movie_root::cleanup_key_listeners()
> +void movie_root::cleanupUnloadedListeners(CharacterList& ll)
>  {
>      // remove unloaded character listeners from movie_root
> -    for (KeyListeners::iterator iter = m_key_listeners.begin(); iter != 
> m_key_listeners.end(); )
> +    for (CharacterList::iterator iter = ll.begin(); iter != ll.end(); )
>      {
> -        character* ch = dynamic_cast<character*>(iter->get());
> -        if ( ch && ch->isUnloaded() )
> -        {
> -            m_key_listeners.erase(iter++);
> -        }
> -        else
> -        {
> -            ++iter;
> -        }
> +        character* ch = iter->get();
> +        if ( ch->isUnloaded() ) iter = ll.erase(iter++);
> +        else ++iter;
>      }
>
>  }
>
>  void movie_root::notify_key_listeners(key::code k, bool down)
>  {
> -    // log_msg("Notifying " SIZET_FMT " character listeners",
> +       // log_msg("Notifying " SIZET_FMT " character Key listeners",
>      //  m_key_listeners.size());
>
> -    for (KeyListeners::iterator iter = m_key_listeners.begin();
> -             iter != m_key_listeners.end(); ++iter)
> +       KeyListeners copy = m_key_listeners;
> +       for (CharacterList::iterator iter = copy.begin(), itEnd=copy.end();
> +                       iter != itEnd; ++iter)
>      {
>          // sprite, button & input_edit_text characters
> -        character* ch = dynamic_cast<character*>(iter->get());
> -        if ( ch && ! ch->isUnloaded() )
> +               character* ch = iter->get();
> +               if ( ! ch->isUnloaded() )
>          {
>              if(down)
>              {
> @@ -915,67 +910,52 @@
>                  ch->on_event(event_id(event_id::KEY_PRESS, 
> key::codeMap[k][0]));
>              }
>              else
> +                       {
>                  ch->on_event(event_id(event_id::KEY_UP, key::INVALID));
>          }
>      }
> +       }
>
>      assert(testInvariant());
>  }
>
> -void movie_root::add_key_listener(as_object* listener)
> +/* static private */
> +void movie_root::add_listener(CharacterList& ll, character* listener)
>  {
> -    for(KeyListeners::iterator i = m_key_listeners.begin(), e = 
> m_key_listeners.end();
> -            i != e; ++i)
> +       assert(listener);
> +       for(CharacterList::iterator i = ll.begin(), e = ll.end(); i != e; ++i)
>      {
>          // Conceptually, we don't need to add the same character twice.
>          // but see edit_text_character::setFocus()...
>          if(*i == listener)  return;
>      }
>
> -    //for character listeners, first added last called
> -    m_key_listeners.push_front(listener);
> +       ll.push_front(listener);
>  }
>
> -void movie_root::remove_key_listener(as_object* listener)
> +/* static private */
> +void movie_root::remove_listener(CharacterList& ll, character* listener)
>  {
> -    for(KeyListeners::iterator iter = m_key_listeners.begin();
> -            iter != m_key_listeners.end(); )
> -    {
> -        if(*iter == listener)
> +       assert(listener);
> +       for(CharacterList::iterator iter = ll.begin(); iter != ll.end(); )
>          {
> -            m_key_listeners.erase(iter++);
> +               if(*iter == listener) iter = ll.erase(iter);
> +               else ++iter;
>          }
> -        else
> -        {
> -            iter++;
> -        }
> -    }
> -}
> -
> -void movie_root::add_mouse_listener(as_object* listener)
> -{
> -       m_mouse_listeners.insert(listener);
> -       assert(testInvariant());
> -}
> -
> -void movie_root::remove_mouse_listener(as_object* listener)
> -{
> -       m_mouse_listeners.erase(listener);
> -       assert(testInvariant());
>  }
>
> -void movie_root::notify_mouse_listeners(const event_id& event)
> +void
> +movie_root::notify_mouse_listeners(const event_id& event)
>  {
>         //log_msg("Notifying " SIZET_FMT " listeners about %s",
>         //              m_mouse_listeners.size(), 
> event.get_function_name().c_str());
>
> -       for (ListenerSet::iterator iter = m_mouse_listeners.begin();
> -                       iter != m_mouse_listeners.end(); ++iter)
> +       CharacterList copy = m_mouse_listeners;
> +       for (CharacterList::iterator iter = copy.begin(), itEnd=copy.end();
> +                       iter != itEnd; ++iter)
>         {
> -               // sprite, button & input_edit_text characters
> -               // TODO: invoke functions on non-characters !
> -               character* ch = dynamic_cast<character*>(iter->get());
> -               if ( ch )
> +               character* ch = iter->get();
> +               if ( ! ch->isUnloaded() )
>                 {
>                         ch->on_event(event);
>                 }
> @@ -1274,11 +1254,10 @@
>      }
>
>      // Mark character key listeners
> -    for (KeyListeners::const_iterator i=m_key_listeners.begin(), 
> e=m_key_listeners.end();
> -            i != e; ++i)
> -    {
> -        (*i)->setReachable();
> -    }
> +    std::for_each(m_key_listeners.begin(), m_key_listeners.end(), 
> boost::bind(&character::setReachable, _1));
> +
> +    // Mark character mouse listeners
> +    std::for_each(m_mouse_listeners.begin(), m_mouse_listeners.end(), 
> boost::bind(&character::setReachable, _1));
>
>      // 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.89
> retrieving revision 1.90
> diff -u -b -r1.89 -r1.90
> --- server/movie_root.h 16 Nov 2007 13:24:30 -0000      1.89
> +++ server/movie_root.h 21 Nov 2007 17:11:52 -0000      1.90
> @@ -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.89 2007/11/16 13:24:30 strk Exp $ */
> +/* $Id: movie_root.h,v 1.90 2007/11/21 17:11:52 strk Exp $ */
>
>  /// \page events_handling Handling of user events
>  ///
> @@ -412,20 +412,35 @@
>      void * get_userdata() { return m_userdata; }
>      void set_userdata(void * ud ) { m_userdata = ud;  }
>
> -       /// Notify both the character listeners and general object listeners
> +       /// Notify still loaded character listeners for key events
>         DSOEXPORT void notify_key_listeners(key::code k, bool down);
>
> -       /// Push a new character listener to the container after constructing 
> the character
> -    void add_key_listener(as_object* listener);
> +       /// Push a new character listener for key events
> +       void add_key_listener(character* listener)
> +    {
> +        add_listener(m_key_listeners, listener);
> +    }
>
> -       /// Remove a character from the container only when the character is 
> unloaded
> -    void remove_key_listener(as_object* listener);
> +       /// Remove a character listener for key events
> +       void remove_key_listener(character* listener)
> +    {
> +        remove_listener(m_key_listeners, listener);
> +    }
>
> +       /// Notify still loaded character listeners for mouse events
>      DSOEXPORT void notify_mouse_listeners(const event_id& event);
>
> -    void add_mouse_listener(as_object* listener);
> +       /// Push a new character listener for mouse events
> +       void add_mouse_listener(character* listener)
> +    {
> +        add_listener(m_mouse_listeners, listener);
> +    }
>
> -    void remove_mouse_listener(as_object* listener);
> +       /// Remove a character listener for mouse events
> +       void remove_mouse_listener(character* listener)
> +    {
> +        remove_listener(m_mouse_listeners, listener);
> +    }
>
>      /// Get the character having focus
>      //
> @@ -499,7 +514,8 @@
>      /// - Mouse entities (m_mouse_button_state)
>      /// - Timer targets (_intervalTimers)
>      /// - Resources reachable by ActionQueue code (_actionQueue)
> -    /// - Key listeners (_keyListeners || m_key_listeners)
> +    /// - Key listeners (m_key_listeners)
> +    /// - Mouse listeners (m_mouse_listeners)
>      /// - global Key object (_keyobject)
>      ///
>      void markReachableResources() const;
> @@ -559,6 +575,14 @@
>
>  private:
>
> +    /// Listeners container
> +    typedef std::list< boost::intrusive_ptr<character> > CharacterList;
> +
> +    /// key and mouse listeners container
> +    typedef CharacterList KeyListeners;
> +    typedef CharacterList MouseListeners;
> +
> +
>      /// Take care of dragging, if needed
>      void doMouseDrag();
>
> @@ -592,12 +616,21 @@
>      /// Notify the global Key ActionScript object about a key status change
>      key_as_object * notify_global_key(key::code k, bool down);
>
> -    /// Remove all listeners with a ref-count of 1
> -    /// (only referenced as key listeners)
> -    // in new design:
> -    // remove unloaded characters and unregistered as_objects
> -    // from the key listeners container.
> -    void cleanup_key_listeners();
> +    /// Remove unloaded key and mouselisteners.
> +    void cleanupUnloadedListeners()
> +    {
> +        cleanupUnloadedListeners(m_key_listeners);
> +        cleanupUnloadedListeners(m_mouse_listeners);
> +    }
> +
> +    /// Erase unloaded characters from the given listeners list
> +    static void cleanupUnloadedListeners(CharacterList& ll);
> +
> +    /// Push a character listener to the front of given container, if not 
> already present
> +    static void add_listener(CharacterList& ll, character* elem);
> +
> +    /// Remove a listener from the list
> +    static void remove_listener(CharacterList& ll, character* elem);
>
>      /// Return the current Stage object
>      //
> @@ -638,20 +671,13 @@
>      TimerMap _intervalTimers;
>      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;
> -
> -    /// 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;
>
>      /// Objects listening for mouse events (down,up,move)
> -    ListenerSet m_mouse_listeners;
> +    MouseListeners m_mouse_listeners;
>
>      character*              m_active_input_text;
>      float                   m_time_remainder;
>
> Index: server/sprite_instance.cpp
> ===================================================================
> RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
> retrieving revision 1.389
> retrieving revision 1.390
> diff -u -b -r1.389 -r1.390
> --- server/sprite_instance.cpp  20 Nov 2007 00:44:03 -0000      1.389
> +++ server/sprite_instance.cpp  21 Nov 2007 17:11:52 -0000      1.390
> @@ -2889,7 +2889,7 @@
>          // it might be there(eg. button_character).
>                 // TODO: optimize this.  This is not necessary if we don't 
> create
>                 // instances blindly above.
> -        _vm.getRoot().remove_key_listener(ch.get());
> +        if ( ch ) _vm.getRoot().remove_key_listener(ch.get());
>
>          move_display_object(depth, &color_transform, &mat, ratio, 
> clip_depth);
>      }
>
>
> _______________________________________________
> Gnash-commit mailing list
> address@hidden
> http://lists.gnu.org/mailman/listinfo/gnash-commit
>




reply via email to

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