gnash-commit
[Top][All Lists]
Advanced

[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());
 }
 




reply via email to

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