[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