gnash-commit
[Top][All Lists]
Advanced

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

[Gnash-commit] gnash/server Key.cpp Key.h action.cpp action.h ...


From: Vitaly Alexeev
Subject: [Gnash-commit] gnash/server Key.cpp Key.h action.cpp action.h ...
Date: Mon, 10 Jul 2006 13:47:13 +0000

CVSROOT:        /sources/gnash
Module name:    gnash
Changes by:     Vitaly Alexeev <alexeev>        06/07/10 13:47:13

Modified files:
        server         : Key.cpp Key.h action.cpp action.h array.h 
                         as_function.h as_object.cpp button.cpp 
                         edit_text_character.cpp edit_text_character.h 
                         edit_text_character_def.h movie_root.cpp 
                         movie_root.h sprite_instance.cpp 

Log message:
        added input edit text stuff, setfocus & killfocus events handler, 
keypress_listener moved to movie_root

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/gnash/server/Key.cpp?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/server/Key.h?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/server/action.cpp?cvsroot=gnash&r1=1.95&r2=1.96
http://cvs.savannah.gnu.org/viewcvs/gnash/server/action.h?cvsroot=gnash&r1=1.37&r2=1.38
http://cvs.savannah.gnu.org/viewcvs/gnash/server/array.h?cvsroot=gnash&r1=1.12&r2=1.13
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_function.h?cvsroot=gnash&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/gnash/server/as_object.cpp?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/server/button.cpp?cvsroot=gnash&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.cpp?cvsroot=gnash&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character.h?cvsroot=gnash&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/gnash/server/edit_text_character_def.h?cvsroot=gnash&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.cpp?cvsroot=gnash&r1=1.6&r2=1.7
http://cvs.savannah.gnu.org/viewcvs/gnash/server/movie_root.h?cvsroot=gnash&r1=1.5&r2=1.6
http://cvs.savannah.gnu.org/viewcvs/gnash/server/sprite_instance.cpp?cvsroot=gnash&r1=1.20&r2=1.21

Patches:
Index: Key.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/Key.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- Key.cpp     5 Jul 2006 12:43:49 -0000       1.7
+++ Key.cpp     10 Jul 2006 13:47:12 -0000      1.8
@@ -43,7 +43,7 @@
 #include "Key.h"
 #include "action.h" // for action_init
 #include "fn_call.h"
-#include "sprite_instance.h"
+#include "movie_root.h"
 
 namespace gnash {
 
@@ -384,39 +384,6 @@
     ko->remove_listener(listener);
 }
 
-static std::vector<weak_ptr<as_object> >       s_keypress_listeners;
-
-void add_keypress_listener(as_object* listener)
-{
-       std::vector<weak_ptr<as_object> >::const_iterator end = 
s_keypress_listeners.end();
-       for (std::vector<weak_ptr<as_object> >::iterator iter = 
s_keypress_listeners.begin();
-                       iter != end; ++iter) 
-       {
-               if (*iter == NULL)
-               {
-                       // Already in the list.
-                       return;
-               }
-       }
-       listener->add_ref();
-       s_keypress_listeners.push_back(listener);
-}
-
-void remove_keypress_listener(as_object* listener)
-{
-       for (std::vector<weak_ptr<as_object> >::iterator iter = 
s_keypress_listeners.begin();
-                       iter != s_keypress_listeners.end(); )
-       {
-               if (*iter == listener)
-               {
-                       iter = s_keypress_listeners.erase(iter);
-                       listener->drop_ref();
-                       continue;
-               }
-               iter++;
-       }
-}
-
 void   notify_key_event(key::code k, bool down)
     // External interface for the host to report key events.
 {
@@ -427,19 +394,8 @@
        // Notify keypress listeners.
        if (down) 
        {
-               for (std::vector<weak_ptr<as_object> >::iterator iter = 
s_keypress_listeners.begin();
-                                iter != s_keypress_listeners.end(); ++iter)
-               {
-                       if (*iter == NULL)
-                       {
-                                       continue;
-                       }
-
-                       smart_ptr<as_object>  listener = *iter; // Hold an 
owning reference.
-
-                       sprite_instance* sprite = (sprite_instance*) 
listener.get_ptr();
-                       sprite->on_event(event_id(event_id::KEY_PRESS, 
(key::code) k));
-               }
+               movie_root* mroot = (movie_root*) get_current_root();
+               mroot->notify_keypress_listeners(k);
        }
 
     static tu_string   key_obj_name("Key");

Index: Key.h
===================================================================
RCS file: /sources/gnash/gnash/server/Key.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- Key.h       19 Jun 2006 14:39:48 -0000      1.7
+++ Key.h       10 Jul 2006 13:47:12 -0000      1.8
@@ -134,9 +134,6 @@
 
 void key_init(as_object* global);
 
-void add_keypress_listener(as_object* listener);
-void remove_keypress_listener(as_object* listener);
-
 } // end of gnash namespace
 
 // __KEY_H__

Index: action.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/action.cpp,v
retrieving revision 1.95
retrieving revision 1.96
diff -u -b -r1.95 -r1.96
--- action.cpp  8 Jul 2006 00:15:09 -0000       1.95
+++ action.cpp  10 Jul 2006 13:47:12 -0000      1.96
@@ -580,7 +580,9 @@
            "onXMLData",                 // XML_DATA
            "onTimer",           // setInterval Timer expired
 
-           "onConstruct"
+           "onConstruct",
+                       "onSetFocus",
+                       "onKillFocus"
        };
 
     assert(m_id > INVALID && m_id < EVENT_COUNT);

Index: action.h
===================================================================
RCS file: /sources/gnash/gnash/server/action.h,v
retrieving revision 1.37
retrieving revision 1.38
diff -u -b -r1.37 -r1.38
--- action.h    8 Jul 2006 00:15:09 -0000       1.37
+++ action.h    10 Jul 2006 13:47:12 -0000      1.38
@@ -123,6 +123,8 @@
                        TIMER,
 
                        CONSTRUCT,
+                       SETFOCUS,
+                       KILLFOCUS,
 
                        EVENT_COUNT
                };

Index: array.h
===================================================================
RCS file: /sources/gnash/gnash/server/array.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- array.h     6 Jul 2006 11:38:20 -0000       1.12
+++ array.h     10 Jul 2006 13:47:12 -0000      1.13
@@ -48,8 +48,8 @@
 
 // Forward declarations
 namespace gnash {
-       class fn_call;
-       class as_value;
+       struct fn_call;
+       struct as_value;
 }
 
 namespace gnash {

Index: as_function.h
===================================================================
RCS file: /sources/gnash/gnash/server/as_function.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- as_function.h       7 Jul 2006 13:49:40 -0000       1.1
+++ as_function.h       10 Jul 2006 13:47:12 -0000      1.2
@@ -47,7 +47,7 @@
 
 // Forward declarations
 namespace gnash {
-       class fn_call;
+       struct fn_call;
 }
 
 namespace gnash {

Index: as_object.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/as_object.cpp,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- as_object.cpp       7 Jul 2006 23:29:51 -0000       1.7
+++ as_object.cpp       10 Jul 2006 13:47:12 -0000      1.8
@@ -189,8 +189,9 @@
 {
        typedef stringi_hash<as_member>::const_iterator members_iterator;
 
-       log_msg("%d Members of object %p follow",
-               m_members.size(), (void*)this);
+       //Vitaly: temporarily commented because of problems with the VC++ 
compiler
+//     log_msg("%d Members of object %p follow",
+//             m_members..size(), (void*)this);
        for ( members_iterator it=m_members.begin(), itEnd=m_members.end();
                it != itEnd; ++it )
        {

Index: button.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/button.cpp,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- button.cpp  5 Jul 2006 12:43:49 -0000       1.19
+++ button.cpp  10 Jul 2006 13:47:12 -0000      1.20
@@ -14,8 +14,7 @@
 #include "stream.h"
 #include "movie_definition.h"
 #include "sprite_instance.h"
-#include "Key.h"
-
+#include "movie_root.h"
 
 
 /** \page buttons Buttons and mouse behaviour
@@ -252,6 +251,31 @@
                if (ms->m_mouse_button_state_current == 1)
                {
                        // onPress
+
+                       // set/kill focus for current root
+                       movie_root* mroot = (movie_root*) get_current_root();
+                       movie* current_active_entity = 
mroot->get_active_entity();
+
+                       // It's another entity ?
+                       if (current_active_entity != active_entity.get_ptr())
+                       {
+                               // First to clean focus
+                               if (current_active_entity != NULL)
+                               {
+                                       
current_active_entity->on_event(event_id::KILLFOCUS);
+                                       mroot->set_active_entity(NULL);
+                               }
+
+                               // Then to set focus
+                               if (active_entity != NULL)
+                               {
+                                       if 
(active_entity->on_event(event_id::SETFOCUS))
+                                       {
+                                               
mroot->set_active_entity(active_entity.get_ptr());
+                                       }
+                               }
+                       }
+
                        if (active_entity != NULL)
                        {
                                active_entity->on_button_event(event_id::PRESS);
@@ -335,7 +359,7 @@
                {
                        if (m_def->m_button_actions[i].m_conditions & 0xFE00)   
// check up on CondKeyPress: UB[7]
                        {
-                               add_keypress_listener(this);
+                               get_root()->add_keypress_listener(this);
                                break;
                        }
                }
@@ -344,6 +368,7 @@
 
        ~button_character_instance()
        {
+               get_root()->remove_keypress_listener(this);
        }
 
        // called from keypress listener only

Index: edit_text_character.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- edit_text_character.cpp     1 Jul 2006 20:44:10 -0000       1.5
+++ edit_text_character.cpp     10 Jul 2006 13:47:12 -0000      1.6
@@ -8,8 +8,9 @@
 #include "render.h"
 #include "movie_definition.h" // to extract version info
 #include "sprite_instance.h"
-
 #include "edit_text_character.h"
+#include "Key.h"
+#include "movie_root.h"        
 
 #include <algorithm>
 
@@ -20,7 +21,11 @@
        :
        character(parent, id),
        m_def(def),
-       _font(0)
+       _font(0),
+       m_has_focus(false),
+       m_cursor(0),
+       m_xcursor(0.0f),
+       m_ycursor(0.0f)
 {
        assert(parent);
        assert(m_def);
@@ -35,6 +40,212 @@
        reset_bounding_box(0, 0);
 }
 
+edit_text_character::~edit_text_character()
+{
+       on_event(event_id::KILLFOCUS);
+}
+
+movie_root*    edit_text_character::get_root() { return 
get_parent()->get_root(); }
+
+void edit_text_character::show_cursor()
+{
+       uint16_t x = (int) m_xcursor;
+       uint16_t y = (int) m_ycursor;
+       uint16_t h = m_def->get_font_height();
+
+       int16_t box[4];
+       box[0] = x;
+       box[1] = y;
+       box[2] = x;
+       box[3] = y + h;
+
+       matrix mat = get_world_matrix();
+       render::set_matrix(mat);
+       render::line_style_color(rgba(0, 0, 0, 255));   // black cursor
+       render::draw_line_strip(box, 2);        // draw line
+}
+
+void
+edit_text_character::display()
+{
+//             GNASH_REPORT_FUNCTION;
+
+       if (m_def->has_border())
+       {
+               matrix  mat = get_world_matrix();
+               
+               // @@ hm, should we apply the color xform?  It seems logical; 
need to test.
+               // cxform       cx = get_world_cxform();
+
+               // Show white background + black bounding box.
+               render::set_matrix(mat);
+
+               point   coords[4];
+               const rect def_bounds = m_def->get_bounds();
+               coords[0] = def_bounds.get_corner(0);
+               coords[1] = def_bounds.get_corner(1);
+               coords[2] = def_bounds.get_corner(3);
+               coords[3] = def_bounds.get_corner(2);
+
+               int16_t icoords[18] = 
+               {
+                       // strip (fill in)
+                       (int16_t) coords[0].m_x, (int16_t) coords[0].m_y,
+                       (int16_t) coords[1].m_x, (int16_t) coords[1].m_y,
+                       (int16_t) coords[2].m_x, (int16_t) coords[2].m_y,
+                       (int16_t) coords[3].m_x, (int16_t) coords[3].m_y,
+
+                       // outline
+                       (int16_t) coords[0].m_x, (int16_t) coords[0].m_y,
+                       (int16_t) coords[1].m_x, (int16_t) coords[1].m_y,
+                       (int16_t) coords[3].m_x, (int16_t) coords[3].m_y,
+                       (int16_t) coords[2].m_x, (int16_t) coords[2].m_y,
+                       (int16_t) coords[0].m_x, (int16_t) coords[0].m_y,
+               };
+               
+               render::fill_style_color(0, rgba(255, 255, 255, 255));
+               render::draw_mesh_strip(&icoords[0], 4);
+
+               render::line_style_color(rgba(0,0,0,255));
+               render::draw_line_strip(&icoords[8], 5);
+       }
+
+       // Draw our actual text.
+       display_glyph_records(matrix::identity, this, m_text_glyph_records,
+               m_def->get_root_def());
+
+       if (m_has_focus)
+       {
+               show_cursor();
+       }
+
+       do_display_callback();
+}
+
+bool edit_text_character::on_event(event_id id)
+{
+       if (m_def->get_readonly() == true)
+       {
+               return false;
+       }
+
+       switch (id.m_id)
+       {
+               case event_id::SETFOCUS:
+               {
+                       if (m_has_focus == false)
+                       {
+                               get_root()->add_keypress_listener(this);
+                               m_has_focus = true;
+                               m_cursor = m_text.size();
+                               format_text();
+                       }
+                       break;
+               }
+
+               case event_id::KILLFOCUS:
+               {
+                       if (m_has_focus == true)
+                       {
+                               get_root()->set_active_entity(NULL);
+                               get_root()->remove_keypress_listener(this);
+                               m_has_focus = false;
+                               format_text();
+                       }
+                       break;
+               }
+
+               case event_id::KEY_PRESS:
+               {
+                       std::string s = m_text;
+                       std::string c;
+                       c = (char) id.m_key_code;
+
+                       // may be m_text is changed in ActionScript
+                       m_cursor = imin(m_cursor, m_text.size());
+
+                       switch (c[0])
+                       {
+                               case key::BACKSPACE:
+                                       if (m_cursor > 0)
+                                       {
+                                               s.erase(m_cursor - 1, 1);
+                                               m_cursor--;
+                                               set_text_value(s.c_str());
+                                       }
+                                       break;
+
+                               case key::DELETEKEY:
+                                       if (s.size() > m_cursor)
+                                       {
+                                               s.erase(m_cursor, 1);
+                                               set_text_value(s.c_str());
+                                       }
+                                       break;
+
+                               case key::INSERT:               // TODO
+                                       break;
+
+                               case key::HOME:
+                               case key::PGUP:
+                               case key::UP:
+                                       m_cursor = 0;
+                                       format_text();
+                                       break;
+
+                               case key::END:
+                               case key::PGDN:
+                               case key::DOWN:
+                                       m_cursor = m_text.size();
+                                       format_text();
+                                       break;
+
+                               case key::LEFT:
+                                       m_cursor = m_cursor > 0 ? m_cursor - 1 
: 0;
+                                       format_text();
+                                       break;
+
+                               case key::RIGHT:
+                                       m_cursor = m_cursor < m_text.size() ? 
m_cursor + 1 : m_text.size();
+                                       format_text();
+                                       break;
+
+                               default:
+                               {
+                                       s.insert(m_cursor, c);
+                                       m_cursor++;
+                                       set_text_value(s.c_str());
+                                       break;
+                               }
+                       }
+               }
+
+               default:
+                       return false;
+       }
+       return true;
+}
+
+movie* edit_text_character::get_topmost_mouse_entity(float x, float y)
+{
+       if (get_visible() == false)
+       {
+               return NULL;
+       }
+
+       matrix  m = get_matrix();
+               
+       point   p;
+       m.transform_by_inverse(&p, point(x, y));
+
+       const rect def_bounds = m_def->get_bounds();
+       if (def_bounds.point_test(p.m_x, p.m_y))
+       {
+               return this;
+       }
+       return NULL;
+}
+
 void
 edit_text_character::set_text_value(const char* new_text)
 {
@@ -356,6 +567,9 @@
        int     last_space_glyph = -1;
        int     last_line_start_record = 0;
 
+       int character_idx = 0;
+       m_xcursor = x;
+       m_ycursor = y;
 
        const char*     text = &m_text[0];
        while (uint32_t code = utf8::decode_next_unicode_character(&text))
@@ -537,9 +751,19 @@
                        last_line_start_record = m_text_glyph_records.size();
                }
 
+               if (m_cursor > character_idx)
+               {
+                       m_xcursor = x;
+                       m_ycursor = y;
+               }
+               character_idx++;
+
                // TODO: HTML markup
        }
 
+       m_xcursor += _font->get_leading() * scale;
+       m_ycursor -= m_def->get_font_height() + (_font->get_leading() - 
_font->get_descent()) * scale;
+
        // Add this line to our output.
        m_text_glyph_records.push_back(rec);
 
@@ -547,59 +771,6 @@
 
 }
 
-void
-edit_text_character::display()
-{
-//             GNASH_REPORT_FUNCTION;
-
-       if (m_def->has_border())
-       {
-               matrix  mat = get_world_matrix();
-               
-               // @@ hm, should we apply the color xform?  It seems logical; 
need to test.
-               // cxform       cx = get_world_cxform();
-
-               // Show white background + black bounding box.
-               render::set_matrix(mat);
-
-               point   coords[4];
-               const rect def_bounds = m_def->get_bounds();
-               coords[0] = def_bounds.get_corner(0);
-               coords[1] = def_bounds.get_corner(1);
-               coords[2] = def_bounds.get_corner(3);
-               coords[3] = def_bounds.get_corner(2);
-
-               int16_t icoords[18] = 
-               {
-                       // strip (fill in)
-                       (int16_t) coords[0].m_x, (int16_t) coords[0].m_y,
-                       (int16_t) coords[1].m_x, (int16_t) coords[1].m_y,
-                       (int16_t) coords[2].m_x, (int16_t) coords[2].m_y,
-                       (int16_t) coords[3].m_x, (int16_t) coords[3].m_y,
-
-                       // outline
-                       (int16_t) coords[0].m_x, (int16_t) coords[0].m_y,
-                       (int16_t) coords[1].m_x, (int16_t) coords[1].m_y,
-                       (int16_t) coords[3].m_x, (int16_t) coords[3].m_y,
-                       (int16_t) coords[2].m_x, (int16_t) coords[2].m_y,
-                       (int16_t) coords[0].m_x, (int16_t) coords[0].m_y,
-               };
-               
-               render::fill_style_color(0, rgba(255, 255, 255, 255));
-               render::draw_mesh_strip(&icoords[0], 4);
-
-               render::line_style_color(rgba(0,0,0,255));
-               render::draw_line_strip(&icoords[8], 5);
-       }
-
-       // Draw our actual text.
-       display_glyph_records(matrix::identity, this, m_text_glyph_records,
-               m_def->get_root_def());
-
-       do_display_callback();
-}
-
-
 } // namespace gnash
 
 

Index: edit_text_character.h
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- edit_text_character.h       1 Jul 2006 20:44:10 -0000       1.5
+++ edit_text_character.h       10 Jul 2006 13:47:12 -0000      1.6
@@ -66,9 +66,11 @@
                        edit_text_character_def* def,
                        int id);
 
-       ~edit_text_character()
-       {
-       }
+       ~edit_text_character();
+
+       virtual movie*  get_topmost_mouse_entity(float x, float y);     
+       virtual bool on_event(event_id id);     
+       virtual movie_root *get_root();
 
        virtual const char* get_text_name() const
        {
@@ -138,6 +140,12 @@
 
        const font* _font;
 
+       bool m_has_focus;
+       int m_cursor;
+       void show_cursor();
+       float m_xcursor;
+       float m_ycursor;
+
 };
 
 } // namespace gnash

Index: edit_text_character_def.h
===================================================================
RCS file: /sources/gnash/gnash/server/edit_text_character_def.h,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- edit_text_character_def.h   1 Jul 2006 20:44:10 -0000       1.7
+++ edit_text_character_def.h   10 Jul 2006 13:47:12 -0000      1.8
@@ -208,6 +208,11 @@
                return m_root_def;
        }
 
+       bool get_readonly() const
+       {
+               return m_readonly;
+       }
+
 private:
 
        /// Root movie_definition

Index: movie_root.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -b -r1.6 -r1.7
--- movie_root.cpp      28 Jun 2006 23:27:44 -0000      1.6
+++ movie_root.cpp      10 Jul 2006 13:47:12 -0000      1.7
@@ -74,8 +74,9 @@
 //    m_on_event_load_called(false),
     m_on_event_xmlsocket_ondata_called(false),
     m_on_event_xmlsocket_onxml_called(false),
-    m_on_event_load_progress_called(false)
-{
+    m_on_event_load_progress_called(false),
+               m_active_input_text(NULL)
+       {
        assert(m_def != NULL);
 
        set_display_viewport(0, 0,
@@ -301,7 +302,62 @@
        return m_movie->call_method_args(method_name, method_arg_fmt, args);
 }
 
+void movie_root::notify_keypress_listeners(key::code k)
+{
+       for (std::vector< as_object* >::iterator iter = 
m_keypress_listeners.begin();
+                        iter != m_keypress_listeners.end(); ++iter)
+       {
+               if (*iter == NULL)
+               {
+                               continue;
+               }
+
+               smart_ptr<as_object>  listener = *iter; // Hold an owning 
reference.
+
+               // sprite, button & input_edit_text characters
+               character* ch = (character*) listener.get_ptr();
+               ch->on_event(event_id(event_id::KEY_PRESS, (key::code) k));
+       }
+}
+
+void movie_root::add_keypress_listener(as_object* listener)
+{
+       std::vector< as_object* >::const_iterator end = 
m_keypress_listeners.end();
+       for (std::vector< as_object* >::iterator iter = 
m_keypress_listeners.begin();
+                       iter != end; ++iter) 
+       {
+               if (*iter == NULL)
+               {
+                       // Already in the list.
+                       return;
+               }
+       }
+       m_keypress_listeners.push_back(listener);
+}
+
+void movie_root::remove_keypress_listener(as_object* listener)
+{
+       for (std::vector< as_object* >::iterator iter = 
m_keypress_listeners.begin();
+                       iter != m_keypress_listeners.end(); )
+       {
+               if (*iter == listener)
+               {
+                       iter = m_keypress_listeners.erase(iter);
+                       continue;
+               }
+               iter++;
+       }
+}
 
+movie* movie_root::get_active_entity()
+{
+       return m_active_input_text;
+}
+
+void movie_root::set_active_entity(movie* ch)
+{
+       m_active_input_text = ch;
+}
 
 } // namespace gnash
 

Index: movie_root.h
===================================================================
RCS file: /sources/gnash/gnash/server/movie_root.h,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -b -r1.5 -r1.6
--- movie_root.h        28 Jun 2006 23:27:44 -0000      1.5
+++ movie_root.h        10 Jul 2006 13:47:12 -0000      1.6
@@ -79,6 +79,8 @@
        bool                    m_on_event_xmlsocket_onxml_called;
        bool                    m_on_event_load_progress_called;
        std::vector<Timer *>    m_interval_timers;
+       std::vector< as_object* >       m_keypress_listeners;
+       movie*  m_active_input_text;
 
 public:
        // XXXbastiaan: make these two variables private
@@ -241,6 +243,14 @@
                m_movie->attach_display_callback(path_to_object,
                        callback, user_ptr);
        }
+
+       void notify_keypress_listeners(key::code k);
+       void add_keypress_listener(as_object* listener);
+       void remove_keypress_listener(as_object* listener);
+
+       movie* get_active_entity();
+       void set_active_entity(movie* ch);
+
 };
 
 

Index: sprite_instance.cpp
===================================================================
RCS file: /sources/gnash/gnash/server/sprite_instance.cpp,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -b -r1.20 -r1.21
--- sprite_instance.cpp 7 Jul 2006 13:49:40 -0000       1.20
+++ sprite_instance.cpp 10 Jul 2006 13:47:12 -0000      1.21
@@ -406,7 +406,7 @@
 
        if (m_has_keypress_event)
        {
-               remove_keypress_listener(this);
+               m_root->remove_keypress_listener(this);
        }
 
        m_display_list.clear();
@@ -1241,7 +1241,7 @@
                //
                if (m_has_keypress_event)
                {
-                       add_keypress_listener(this);
+                       m_root->add_keypress_listener(this);
                }
        }
        




reply via email to

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