[Swfdec-commits] 11 commits - swfdec/swfdec_text_field_movie.c swfdec/swfdec_text_field_movie.h test/trace

Benjamin Otte company at kemper.freedesktop.org
Thu Apr 3 02:44:10 PDT 2008


 swfdec/swfdec_text_field_movie.c               |  161 ++++++++++++++++++-------
 swfdec/swfdec_text_field_movie.h               |    4 
 test/trace/Makefile.am                         |    9 +
 test/trace/crash-0.6.2-replaceText-5.swf       |binary
 test/trace/crash-0.6.2-replaceText-5.swf.trace |    2 
 test/trace/crash-0.6.2-replaceText-6.swf       |binary
 test/trace/crash-0.6.2-replaceText-6.swf.trace |    2 
 test/trace/crash-0.6.2-replaceText-7.swf       |binary
 test/trace/crash-0.6.2-replaceText-7.swf.trace |    2 
 test/trace/crash-0.6.2-replaceText-8.swf       |binary
 test/trace/crash-0.6.2-replaceText-8.swf.trace |    2 
 test/trace/crash-0.6.2-replaceText.as          |   11 +
 12 files changed, 149 insertions(+), 44 deletions(-)

New commits:
commit 221052b87249a66261fc8588743ee8dc1aad868e
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Apr 3 11:40:31 2008 +0200

    split cursor stuff
    
    It also makes keyboard input work as expected

diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index 9788502..c8fb985 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -42,6 +42,43 @@ G_DEFINE_TYPE (SwfdecTextFieldMovie, swfdec_text_field_movie, SWFDEC_TYPE_ACTOR)
 #define EXTRA_MARGIN 2
 #define BULLET_MARGIN 36
 
+/*** CURSOR API ***/
+
+static gsize
+swfdec_text_field_movie_get_cursor (SwfdecTextFieldMovie *text)
+{
+  return text->cursor_start;
+}
+
+static gboolean
+swfdec_text_field_movie_has_cursor (SwfdecTextFieldMovie *text)
+{
+  return text->cursor_start == text->cursor_end;
+}
+#define swfdec_text_field_movie_has_selection(text) (!swfdec_text_field_movie_has_cursor (text))
+
+static void
+swfdec_text_field_movie_get_selection (SwfdecTextFieldMovie *text, gsize *start, gsize *end)
+{
+  if (start)
+    *start = MIN (text->cursor_start, text->cursor_end);
+  if (end)
+    *end = MAX (text->cursor_start, text->cursor_end);
+}
+
+static void
+swfdec_text_field_movie_set_cursor (SwfdecTextFieldMovie *text, gsize start, gsize end)
+{
+  g_return_if_fail (start <= text->input->len);
+  g_return_if_fail (end <= text->input->len);
+
+  text->cursor_start = start;
+  text->cursor_end = end;
+  /* FIXME: should we invalidate here? */
+}
+
+/*** VFUNCS ***/
+
 static void
 swfdec_text_field_movie_update_extents (SwfdecMovie *movie,
     SwfdecRect *extents)
@@ -507,6 +544,7 @@ swfdec_text_field_movie_get_layouts (SwfdecTextFieldMovie *text, int *num,
   GArray *layouts;
   guint i;
   SwfdecParagraph *paragraphs_free;
+  gsize cursor_start, cursor_end;
 
   g_assert (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
 
@@ -521,6 +559,7 @@ swfdec_text_field_movie_get_layouts (SwfdecTextFieldMovie *text, int *num,
   }
 
   layouts = g_array_new (TRUE, TRUE, sizeof (SwfdecLayout));
+  swfdec_text_field_movie_get_selection (text, &cursor_start, &cursor_end);
 
   for (i = 0; paragraphs[i].blocks != NULL; i++)
   {
@@ -603,8 +642,8 @@ swfdec_text_field_movie_get_layouts (SwfdecTextFieldMovie *text, int *num,
       // add background for selection
       layout.index_ = paragraphs[i].index_ + block->index_ + skip;
       layout.index_end = layout.index_ + length;
-      if (text->selectable && text->cursor != text->selection_end &&
-	  layout.index_ < MAX (text->cursor, text->selection_end)) {
+      if (swfdec_text_field_movie_has_selection (text) &&
+	  layout.index_ < cursor_end) {
 	SwfdecColor color;
 	PangoAttribute *attr_fg, *attr_bg;
 
@@ -620,14 +659,12 @@ swfdec_text_field_movie_get_layouts (SwfdecTextFieldMovie *text, int *num,
 	attr_bg = pango_attr_background_new (SWFDEC_COLOR_R (color) << 8,
 	    SWFDEC_COLOR_G (color) << 8, SWFDEC_COLOR_B (color) << 8);
 
-	if (MIN (text->cursor, text->selection_end) > layout.index_) {
-	  attr_fg->start_index = attr_bg->start_index =
-	    MIN (text->cursor, text->selection_end) - layout.index_;
+	if (cursor_start > layout.index_) {
+	  attr_fg->start_index = attr_bg->start_index = cursor_start - layout.index_;
 	} else {
 	  attr_fg->start_index = attr_bg->start_index = 0;
 	}
-	attr_bg->end_index = attr_fg->end_index =
-	  MAX (text->cursor, text->selection_end) - layout.index_;
+	attr_bg->end_index = attr_fg->end_index = cursor_end - layout.index_;
 
 	pango_attr_list_insert (attr_list, attr_fg);
 	pango_attr_list_insert (attr_list, attr_bg);
@@ -1439,7 +1476,7 @@ swfdec_text_field_movie_mouse_press (SwfdecActor *actor, guint button)
 {
   SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (actor);
   double x, y;
-  guint index_;
+  gsize index_;
   gboolean direct, before;
 
   if (button != 0) {
@@ -1455,16 +1492,13 @@ swfdec_text_field_movie_mouse_press (SwfdecActor *actor, guint button)
   direct = swfdec_text_field_movie_xy_to_index (text, x, y, &index_, &before);
 
   text->mouse_pressed = TRUE;
-  text->cursor = index_;
-  if (!before && text->cursor < text->input->len)
-    text->cursor++;
-  text->selection_end = text->cursor;
+  if (!before && index_ < text->input->len)
+    index_++;
+  swfdec_text_field_movie_set_cursor (text, index_, index_);
   swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
 
   if (direct) {
-    text->character_pressed = index_ + 1;
-    if (before)
-      text->character_pressed--;
+    text->character_pressed = index_;
   } else {
     text->character_pressed = 0;
   }
@@ -1487,10 +1521,10 @@ swfdec_text_field_movie_mouse_move (SwfdecActor *actor, double x, double y)
 
   direct = swfdec_text_field_movie_xy_to_index (text, x, y, &index_, &before);
 
-  text->selection_end = index_;
+  if (!before && index_ < text->input->len)
+    index_++;
 
-  if (!before && text->selection_end < text->input->len)
-    text->selection_end++;
+  swfdec_text_field_movie_set_cursor (text, swfdec_text_field_movie_get_cursor (text), index_);
 
   swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
 }
@@ -1540,7 +1574,9 @@ static void
 swfdec_text_field_movie_key_press (SwfdecActor *actor, guint keycode, guint character)
 {
   SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (actor);
-  char insert[6];
+  char insert[7];
+  guint len;
+  gsize start, end;
 
   switch (keycode) {
     default:
@@ -1549,8 +1585,12 @@ swfdec_text_field_movie_key_press (SwfdecActor *actor, guint keycode, guint char
 
   if (character == 0)
     return;
-  g_unichar_to_utf8 (character, insert);
-  swfdec_text_field_movie_replace_text (text, text->cursor, text->cursor, insert);
+  len = g_unichar_to_utf8 (character, insert);
+  insert[len] = 0;
+  swfdec_sandbox_use (SWFDEC_MOVIE (text)->resource->sandbox);
+  swfdec_text_field_movie_get_selection (text, &start, &end);
+  swfdec_text_field_movie_replace_text (text, start, end, insert);
+  swfdec_sandbox_unuse (SWFDEC_MOVIE (text)->resource->sandbox);
 }
 
 static void
@@ -1919,6 +1959,19 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
       end_index - start_index);
   text->input = g_string_insert (text->input, start_index, str);
 
+  if (text->cursor_start >= start_index) {
+    if (text->cursor_start <= end_index)
+      text->cursor_start = start_index + len;
+    else
+      text->cursor_start += end_index - start_index + len;
+  }
+  if (text->cursor_end >= start_index) {
+    if (text->cursor_end <= end_index)
+      text->cursor_end = start_index + len;
+    else
+      text->cursor_end += end_index - start_index + len;
+  }
+
   swfdec_movie_invalidate_last (SWFDEC_MOVIE (text));
   swfdec_text_field_movie_auto_size (text);
   swfdec_text_field_movie_update_scroll (text, TRUE);
diff --git a/swfdec/swfdec_text_field_movie.h b/swfdec/swfdec_text_field_movie.h
index b5f507f..ea8ddd9 100644
--- a/swfdec/swfdec_text_field_movie.h
+++ b/swfdec/swfdec_text_field_movie.h
@@ -131,8 +131,8 @@ struct _SwfdecTextFieldMovie {
   SwfdecColor		background_color;
 
   gboolean		mouse_pressed;
-  guint			cursor;
-  guint			selection_end;
+  gsize			cursor_start;		/* index of cursor (aka insertion point) in ->input */
+  gsize			cursor_end;		/* end of cursor, either equal to cursor_start or if text selected smaller or bigger */
   guint			character_pressed;
 
   // FIXME: Temporary using image surface, until there is a way to get cairo_t
commit 6f9ead7524e12e117183f7221756ca1e5c78cdbf
Merge: 2136652... 0d0cd11...
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Apr 3 11:25:02 2008 +0200

    Merge branch '0.6'

commit 0d0cd1155a90ac01be0941410512391f258f2924
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Apr 3 11:16:54 2008 +0200

    update for last commit

diff --git a/test/trace/crash-0.6.2-replaceText-5.swf b/test/trace/crash-0.6.2-replaceText-5.swf
index c0ea515..f97ddc8 100644
Binary files a/test/trace/crash-0.6.2-replaceText-5.swf and b/test/trace/crash-0.6.2-replaceText-5.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-6.swf b/test/trace/crash-0.6.2-replaceText-6.swf
index 23ce768..d5ad741 100644
Binary files a/test/trace/crash-0.6.2-replaceText-6.swf and b/test/trace/crash-0.6.2-replaceText-6.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-7.swf b/test/trace/crash-0.6.2-replaceText-7.swf
index 3460f19..9032823 100644
Binary files a/test/trace/crash-0.6.2-replaceText-7.swf and b/test/trace/crash-0.6.2-replaceText-7.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-8.swf b/test/trace/crash-0.6.2-replaceText-8.swf
index 37c8d79..a7d4815 100644
Binary files a/test/trace/crash-0.6.2-replaceText-8.swf and b/test/trace/crash-0.6.2-replaceText-8.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText.as b/test/trace/crash-0.6.2-replaceText.as
index 2f87239..6e2beaf 100644
--- a/test/trace/crash-0.6.2-replaceText.as
+++ b/test/trace/crash-0.6.2-replaceText.as
@@ -2,7 +2,8 @@
 
 createTextField ("t", 0, 0, 0, 200, 150);
 
-t.replaceText (0, 0, "Hello World");
+t.replaceText (0, 0, "Hell");
+t.replaceText (4, 4, "o World");
 trace (t.text);
 t.replaceText (0, 5, "Hi");
 trace (t.text);
commit 1e5517832019e0452fc2d1b2955c2384a9fa94c4
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Apr 3 11:16:20 2008 +0200

    fix another SEGV where we delated the wrong text format

diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index 5036846..87f01a7 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -1533,8 +1533,8 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
 	 (iter != NULL &&
 	  ((SwfdecFormatIndex *) iter->data)->index_ <= end_index)) &&
 	text->formats->next != NULL) {
+      text->formats = g_slist_remove (text->formats, findex);
       g_free (findex);
-      text->formats = g_slist_remove (text->formats, iter->data);
       continue;
     }
     /* adapt indexes: remove deleted part, add to-be inserted text */
commit 2136652aaf035a20e20ae1c9273c4daeb618be86
Merge: 4ea56cc... ab29508...
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Apr 3 10:47:13 2008 +0200

    Merge branch '0.6'

commit ab295088dad5ed90c3dbeb73bc310f10d21605ae
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Apr 3 10:45:09 2008 +0200

    update test to catch that latest issue, too

diff --git a/test/trace/crash-0.6.2-replaceText-5.swf b/test/trace/crash-0.6.2-replaceText-5.swf
index 0688039..c0ea515 100644
Binary files a/test/trace/crash-0.6.2-replaceText-5.swf and b/test/trace/crash-0.6.2-replaceText-5.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-5.swf.trace b/test/trace/crash-0.6.2-replaceText-5.swf.trace
index 417b7b5..d4f80bf 100644
--- a/test/trace/crash-0.6.2-replaceText-5.swf.trace
+++ b/test/trace/crash-0.6.2-replaceText-5.swf.trace
@@ -1 +1,2 @@
 undefined
+undefined
diff --git a/test/trace/crash-0.6.2-replaceText-6.swf b/test/trace/crash-0.6.2-replaceText-6.swf
index 6134f1a..23ce768 100644
Binary files a/test/trace/crash-0.6.2-replaceText-6.swf and b/test/trace/crash-0.6.2-replaceText-6.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-6.swf.trace b/test/trace/crash-0.6.2-replaceText-6.swf.trace
index 8b13789..139597f 100644
--- a/test/trace/crash-0.6.2-replaceText-6.swf.trace
+++ b/test/trace/crash-0.6.2-replaceText-6.swf.trace
@@ -1 +1,2 @@
 
+
diff --git a/test/trace/crash-0.6.2-replaceText-7.swf b/test/trace/crash-0.6.2-replaceText-7.swf
index e0ca1f2..3460f19 100644
Binary files a/test/trace/crash-0.6.2-replaceText-7.swf and b/test/trace/crash-0.6.2-replaceText-7.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-7.swf.trace b/test/trace/crash-0.6.2-replaceText-7.swf.trace
index 557db03..50a8b97 100644
--- a/test/trace/crash-0.6.2-replaceText-7.swf.trace
+++ b/test/trace/crash-0.6.2-replaceText-7.swf.trace
@@ -1 +1,2 @@
 Hello World
+Hi World
diff --git a/test/trace/crash-0.6.2-replaceText-8.swf b/test/trace/crash-0.6.2-replaceText-8.swf
index 972b61f..37c8d79 100644
Binary files a/test/trace/crash-0.6.2-replaceText-8.swf and b/test/trace/crash-0.6.2-replaceText-8.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-8.swf.trace b/test/trace/crash-0.6.2-replaceText-8.swf.trace
index 557db03..50a8b97 100644
--- a/test/trace/crash-0.6.2-replaceText-8.swf.trace
+++ b/test/trace/crash-0.6.2-replaceText-8.swf.trace
@@ -1 +1,2 @@
 Hello World
+Hi World
diff --git a/test/trace/crash-0.6.2-replaceText.as b/test/trace/crash-0.6.2-replaceText.as
index 1a7f85b..2f87239 100644
--- a/test/trace/crash-0.6.2-replaceText.as
+++ b/test/trace/crash-0.6.2-replaceText.as
@@ -4,5 +4,7 @@ createTextField ("t", 0, 0, 0, 200, 150);
 
 t.replaceText (0, 0, "Hello World");
 trace (t.text);
+t.replaceText (0, 5, "Hi");
+trace (t.text);
 
 getURL ("fscommand:quit", "");
commit 404db459f5cd25ed583cfb5111a66708a515eaa3
Author: Benjamin Otte <otte at gnome.org>
Date:   Thu Apr 3 10:42:01 2008 +0200

    Fix SEGV when looking for the next item
    
    ETOOMUCHREFACTORING

diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index e500011..5036846 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -1530,8 +1530,8 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     /* remove formats of deleted text */
     if (findex->index_ >= start_index &&
 	(end_index == text->input->len ||
-	 (iter->next != NULL &&
-	  ((SwfdecFormatIndex *) iter->next->data)->index_ <= end_index)) &&
+	 (iter != NULL &&
+	  ((SwfdecFormatIndex *) iter->data)->index_ <= end_index)) &&
 	text->formats->next != NULL) {
       g_free (findex);
       text->formats = g_slist_remove (text->formats, iter->data);
commit 4ea56cc5b7f212ba3ae0341ddc44427b7d4c6101
Merge: e5a8f4c... 97c5ded...
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 2 23:46:28 2008 +0200

    Merge branch '0.6'

commit 97c5ded1c9ae0f9ae82c22421f22e20384f465f9
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 2 23:44:29 2008 +0200

    add test for the just fixed crasher

diff --git a/test/trace/Makefile.am b/test/trace/Makefile.am
index f6d1fdf..86add78 100644
--- a/test/trace/Makefile.am
+++ b/test/trace/Makefile.am
@@ -718,6 +718,15 @@ EXTRA_DIST = \
 	crash-0.6.0-moviecliploader-7.swf.trace \
 	crash-0.6.0-moviecliploader-8.swf \
 	crash-0.6.0-moviecliploader-8.swf.trace \
+	crash-0.6.2-replaceText-5.swf \
+	crash-0.6.2-replaceText-5.swf.trace \
+	crash-0.6.2-replaceText-6.swf \
+	crash-0.6.2-replaceText-6.swf.trace \
+	crash-0.6.2-replaceText-7.swf \
+	crash-0.6.2-replaceText-7.swf.trace \
+	crash-0.6.2-replaceText-8.swf \
+	crash-0.6.2-replaceText-8.swf.trace \
+	crash-0.6.2-replaceText.as \
 	currentframe.swf \
 	currentframe.swf.trace \
 	dangling-compare.as \
diff --git a/test/trace/crash-0.6.2-replaceText-5.swf b/test/trace/crash-0.6.2-replaceText-5.swf
new file mode 100644
index 0000000..0688039
Binary files /dev/null and b/test/trace/crash-0.6.2-replaceText-5.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-5.swf.trace b/test/trace/crash-0.6.2-replaceText-5.swf.trace
new file mode 100644
index 0000000..417b7b5
--- /dev/null
+++ b/test/trace/crash-0.6.2-replaceText-5.swf.trace
@@ -0,0 +1 @@
+undefined
diff --git a/test/trace/crash-0.6.2-replaceText-6.swf b/test/trace/crash-0.6.2-replaceText-6.swf
new file mode 100644
index 0000000..6134f1a
Binary files /dev/null and b/test/trace/crash-0.6.2-replaceText-6.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-6.swf.trace b/test/trace/crash-0.6.2-replaceText-6.swf.trace
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/test/trace/crash-0.6.2-replaceText-6.swf.trace
@@ -0,0 +1 @@
+
diff --git a/test/trace/crash-0.6.2-replaceText-7.swf b/test/trace/crash-0.6.2-replaceText-7.swf
new file mode 100644
index 0000000..e0ca1f2
Binary files /dev/null and b/test/trace/crash-0.6.2-replaceText-7.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-7.swf.trace b/test/trace/crash-0.6.2-replaceText-7.swf.trace
new file mode 100644
index 0000000..557db03
--- /dev/null
+++ b/test/trace/crash-0.6.2-replaceText-7.swf.trace
@@ -0,0 +1 @@
+Hello World
diff --git a/test/trace/crash-0.6.2-replaceText-8.swf b/test/trace/crash-0.6.2-replaceText-8.swf
new file mode 100644
index 0000000..972b61f
Binary files /dev/null and b/test/trace/crash-0.6.2-replaceText-8.swf differ
diff --git a/test/trace/crash-0.6.2-replaceText-8.swf.trace b/test/trace/crash-0.6.2-replaceText-8.swf.trace
new file mode 100644
index 0000000..557db03
--- /dev/null
+++ b/test/trace/crash-0.6.2-replaceText-8.swf.trace
@@ -0,0 +1 @@
+Hello World
diff --git a/test/trace/crash-0.6.2-replaceText.as b/test/trace/crash-0.6.2-replaceText.as
new file mode 100644
index 0000000..1a7f85b
--- /dev/null
+++ b/test/trace/crash-0.6.2-replaceText.as
@@ -0,0 +1,8 @@
+// makeswf -v 7 -s 200x150 -r 1 -o crash-0.6.2-replaceText.swf crash-0.6.2-replaceText.as
+
+createTextField ("t", 0, 0, 0, 200, 150);
+
+t.replaceText (0, 0, "Hello World");
+trace (t.text);
+
+getURL ("fscommand:quit", "");
commit 673c70f1a0f96cf05c4aab99667825df3cc31d5f
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 2 23:42:58 2008 +0200

    fix crash when TextField.replaceText was called on empty TextField

diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index 84a4001..e500011 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -1506,8 +1506,9 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     guint start_index, guint end_index, const char *str)
 {
   SwfdecFormatIndex *findex;
-  GSList *iter, *prev;
+  GSList *iter;
   gboolean first;
+  gsize len;
 
   g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
   g_return_if_fail (end_index <= text->input->len);
@@ -1519,33 +1520,30 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
   if (text->style_sheet_input)
     return;
 
+  len = strlen (str);
   first = TRUE;
-  prev = NULL;
-  for (iter = text->formats; iter != NULL; iter = iter->next)
-  {
+  iter = text->formats; 
+  while (iter) {
     findex = iter->data;
-
-    if (findex->index_ >= start_index) {
-      if (end_index == text->input->len ||(iter->next != NULL &&
-	   ((SwfdecFormatIndex *)iter->next->data)->index_ <= end_index))
-      {
-	g_free (iter->data);
-	text->formats = g_slist_remove (text->formats, iter->data);
-	iter = (prev != NULL ? prev : text->formats);
-      }
-      else
-      {
-	findex->index_ += strlen (str) - (end_index - start_index);
-	if (first) {
-	  findex->index_ -= strlen (str);
-	  first = FALSE;
-	}
-      }
+    iter = iter->next;
+
+    /* remove formats of deleted text */
+    if (findex->index_ >= start_index &&
+	(end_index == text->input->len ||
+	 (iter->next != NULL &&
+	  ((SwfdecFormatIndex *) iter->next->data)->index_ <= end_index)) &&
+	text->formats->next != NULL) {
+      g_free (findex);
+      text->formats = g_slist_remove (text->formats, iter->data);
+      continue;
+    }
+    /* adapt indexes: remove deleted part, add to-be inserted text */
+    if (findex->index_ > start_index) {
+      findex->index_ = findex->index_ + start_index - end_index + len;
     }
-    prev = iter;
   }
 
-  if (end_index == text->input->len) {
+  if (end_index == text->input->len && text->input->len > 0) {
     if (SWFDEC_AS_OBJECT (text)->context->version < 8) {
       SWFDEC_FIXME ("replaceText to the end of the TextField might use wrong text format on version 7");
     }
commit e5a8f4cdb829e5c14a2d72d8b22dc05dfdb3256b
Author: Benjamin Otte <otte at gnome.org>
Date:   Wed Apr 2 23:16:06 2008 +0200

    add code to insert text

diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index 0df3f47..28dbafb 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -1450,7 +1450,6 @@ swfdec_text_field_movie_mouse_press (SwfdecActor *actor, guint button)
   if (!text->selectable)
     return;
 
-
   swfdec_movie_get_mouse (SWFDEC_MOVIE (actor), &x, &y);
 
   direct = swfdec_text_field_movie_xy_to_index (text, x, y, &index_, &before);
@@ -1469,6 +1468,8 @@ swfdec_text_field_movie_mouse_press (SwfdecActor *actor, guint button)
   } else {
     text->character_pressed = 0;
   }
+
+  swfdec_player_grab_focus (SWFDEC_PLAYER (SWFDEC_AS_OBJECT (text)->context), actor);
 }
 
 static void
@@ -1536,6 +1537,29 @@ swfdec_text_field_movie_focus_out (SwfdecActor *actor)
 }
 
 static void
+swfdec_text_field_movie_key_press (SwfdecActor *actor, guint keycode, guint character)
+{
+  SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (actor);
+  char insert[6];
+
+  switch (keycode) {
+    default:
+      break;
+  }
+
+  if (character == 0)
+    return;
+  g_unichar_to_utf8 (character, insert);
+  swfdec_text_field_movie_replace_text (text, text->cursor, text->cursor, insert);
+}
+
+static void
+swfdec_text_field_movie_key_release (SwfdecActor *actor, guint keycode, guint character)
+{
+  //SwfdecTextFieldMovie *text = SWFDEC_TEXT_FIELD_MOVIE (actor);
+}
+
+static void
 swfdec_text_field_movie_class_init (SwfdecTextFieldMovieClass * g_class)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (g_class);
@@ -1561,6 +1585,8 @@ swfdec_text_field_movie_class_init (SwfdecTextFieldMovieClass * g_class)
   actor_class->mouse_move = swfdec_text_field_movie_mouse_move;
   actor_class->focus_in = swfdec_text_field_movie_focus_in;
   actor_class->focus_out = swfdec_text_field_movie_focus_out;
+  actor_class->key_press = swfdec_text_field_movie_key_press;
+  actor_class->key_release = swfdec_text_field_movie_key_release;
 
   actor_class->iterate_start = swfdec_text_field_movie_iterate;
 }


More information about the Swfdec-commits mailing list