[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash ChangeLog server/movie_root.cpp server/mo...
From: |
Sandro Santilli |
Subject: |
[Gnash-commit] gnash ChangeLog server/movie_root.cpp server/mo... |
Date: |
Wed, 21 Nov 2007 17:11:53 +0000 |
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);
}