[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Gnash-commit] gnash/server movie_root.h movie_root.cpp
From: |
Zou Lunkai |
Subject: |
[Gnash-commit] gnash/server movie_root.h movie_root.cpp |
Date: |
Thu, 26 Apr 2007 11:04:56 +0000 |
CVSROOT: /sources/gnash
Module name: gnash
Changes by: Zou Lunkai <zoulunkai> 07/04/26 11:04:56
Modified files:
server : movie_root.h movie_root.cpp
Log message:
attempt to fix the key events, actions order is not considered
CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.h?cvsroot=gnash&r1=1.49&r2=1.50
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.58&r2=1.59
Patches:
Index: movie_root.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.h,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -b -r1.49 -r1.50
--- movie_root.h 21 Apr 2007 21:07:40 -0000 1.49
+++ movie_root.h 26 Apr 2007 11:04:56 -0000 1.50
@@ -14,7 +14,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.49 2007/04/21 21:07:40 strk Exp $ */
+/* $Id: movie_root.h,v 1.50 2007/04/26 11:04:56 zoulunkai Exp $ */
/// \page events_handling Handling of user events
///
@@ -75,6 +75,7 @@
#include "drag_state.h" // for composition
#include "sprite_instance.h" // for inlines
#include "timers.h" // for composition
+#include "asobj/Key.h"
#include <vector>
#include <list>
@@ -376,9 +377,9 @@
callback, user_ptr);
}
- DSOEXPORT void notify_keypress_listeners(key::code k);
- void add_keypress_listener(as_object* listener);
- void remove_keypress_listener(as_object* listener);
+ DSOEXPORT void notify_key_listeners(key::code k, bool down);
+ void add_key_listener(as_object* listener);
+ void remove_key_listener(as_object* listener);
DSOEXPORT void notify_mouse_listeners(const event_id& event);
void add_mouse_listener(as_object* listener);
@@ -426,11 +427,11 @@
movie_root& operator=(const movie_root& ) { assert(0); return *this; }
/// Notify the global Key ActionScript object about a key status change
- void notify_global_key(key::code k, bool down);
+ 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)
- void cleanup_keypress_listeners();
+ void cleanup_key_listeners();
/// Return the current Stage object
//
@@ -475,8 +476,8 @@
/// A set of as_objects kept by intrusive_ptr
typedef std::set< boost::intrusive_ptr<as_object> > ListenerSet;
- /// Objects listening for keypress events
- ListenerSet m_keypress_listeners;
+ /// Objects listening for key events
+ ListenerSet m_key_listeners;
/// Objects listening for mouse events (down,up,move)
ListenerSet m_mouse_listeners;
Index: movie_root.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -b -r1.58 -r1.59
--- movie_root.cpp 21 Apr 2007 21:07:40 -0000 1.58
+++ movie_root.cpp 26 Apr 2007 11:04:56 -0000 1.59
@@ -29,7 +29,6 @@
#include "tu_random.h"
#include "ExecutableCode.h"
#include "Stage.h"
-#include "Key.h"
#include <iostream>
#include <string>
@@ -161,14 +160,16 @@
}
-void
+
+
+key_as_object *
movie_root::notify_global_key(key::code k, bool down)
{
VM& vm = VM::get();
if ( vm.getSWFVersion() < 6 )
{
// _global.Key was added in SWF6
- return;
+ return NULL;
}
static boost::intrusive_ptr<key_as_object> keyobject = NULL;
@@ -203,21 +204,33 @@
{
log_error("gnash::notify_key_event(): _global.Key doesn't
exist, or isn't the expected built-in\n");
}
+
+ return keyobject.get();
}
bool
movie_root::notify_key_event(key::code k, bool down)
{
-// GNASH_REPORT_FUNCTION;
-
- // Notify keypress listeners.
- if (down) notify_keypress_listeners(k);
+//GNASH_REPORT_FUNCTION;
//
- // Notify the _global.Key object about key event
+ // First of all, notify the _global.Key object about key event
//
+ key_as_object * global_key = notify_global_key(k, down);
- notify_global_key(k, down);
+ // Notify key listeners.
+ notify_key_listeners(k, down);
+
+ if(global_key)
+ {
+ if(down)
+ {
+ global_key->notify_listeners(event_id::KEY_DOWN);
+ global_key->notify_listeners(event_id::KEY_PRESS);
+ }
+ else
+ global_key->notify_listeners(event_id::KEY_UP);
+ }
processActionQueue();
@@ -558,8 +571,8 @@
}
}
- // Cleanup keypress listeners (remove unloaded characters)
- cleanup_keypress_listeners();
+ // Cleanup key listeners (remove unloaded characters)
+ cleanup_key_listeners();
// random should go continuously that:
// 1. after restart of the player the situation has not repeated
@@ -658,15 +671,15 @@
return _movie->call_method_args(method_name, method_arg_fmt, args);
}
-void movie_root::cleanup_keypress_listeners()
+void movie_root::cleanup_key_listeners()
{
-#ifdef KEYPRESS_LISTENERS_DEBUG
- size_t prevsize = m_keypress_listeners.size();
- log_msg("Cleaning up %u keypress listeners",
m_keypress_listeners.size());
+#ifdef KEY_LISTENERS_DEBUG
+ size_t prevsize = m_key_listeners.size();
+ log_msg("Cleaning up %u key listeners", m_key_listeners.size());
#endif
- for (ListenerSet::iterator iter = m_keypress_listeners.begin();
- iter != m_keypress_listeners.end(); )
+ for (ListenerSet::iterator iter = m_key_listeners.begin();
+ iter != m_key_listeners.end(); )
{
// TODO: handle non-character objects too !
character* ch = dynamic_cast<character*>(iter->get());
@@ -674,8 +687,8 @@
{
ListenerSet::iterator toremove = iter;
++iter;
- //log_msg("cleanup_keypress_listeners: Removing
unloaded keypress listener %p", iter->get());
- m_keypress_listeners.erase(toremove);
+ //log_msg("cleanup_key_listeners: Removing unloaded key
listener %p", iter->get());
+ m_key_listeners.erase(toremove);
}
else
{
@@ -683,49 +696,57 @@
}
}
-#ifdef KEYPRESS_LISTENERS_DEBUG
- size_t currsize = m_keypress_listeners.size();
+#ifdef key_LISTENERS_DEBUG
+ size_t currsize = m_key_listeners.size();
log_msg("Cleaned up %u listeners (from %u to %u)", prevsize-currsize,
prevsize, currsize);
#endif
}
-void movie_root::notify_keypress_listeners(key::code k)
+void movie_root::notify_key_listeners(key::code k, bool down)
{
log_msg("Notifying " SIZET_FMT " keypress listeners",
- m_keypress_listeners.size());
- for (ListenerSet::iterator iter = m_keypress_listeners.begin();
- iter != m_keypress_listeners.end(); ++iter)
+ m_key_listeners.size());
+
+ for (ListenerSet::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() )
{
+ if(down)
+ {
+ // key code for KEY_DOWN and KEY_UP should be
invalid
+ ch->on_event(event_id(event_id::KEY_DOWN,
key::INVALID));
ch->on_event(event_id(event_id::KEY_PRESS, k));
}
+ else
+ ch->on_event(event_id(event_id::KEY_UP,
key::INVALID));
+ }
}
assert(testInvariant());
}
-void movie_root::add_keypress_listener(as_object* listener)
+void movie_root::add_key_listener(as_object* listener)
{
- if ( m_keypress_listeners.insert(listener).second )
+ if ( m_key_listeners.insert(listener).second )
{
- //log_msg("Added keypress listener %p", (void*)listener);
+ //log_msg("Added key listener %p", (void*)listener);
}
else
{
- //log_msg("Keypress listener %p was already in the known set",
(void*)listener);
+ //log_msg("key listener %p was already in the known set",
(void*)listener);
}
assert(testInvariant());
}
-void movie_root::remove_keypress_listener(as_object* listener)
+void movie_root::remove_key_listener(as_object* listener)
{
- //log_msg("Removing keypress listener %p - %u listeners currently ",
(void*)listener, m_keypress_listeners.size());
- m_keypress_listeners.erase(listener);
- //log_msg("After removing keypress listener %p, %u listeners are left",
(void*)listener, m_keypress_listeners.size());
+ //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());
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Gnash-commit] gnash/server movie_root.h movie_root.cpp,
Zou Lunkai <=