[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash ChangeLog server/asobj/Key.cpp server/aso...,
Zou Lunkai <=