[Swfdec-commits] swfdec/swfdec_text_field_movie.c swfdec/swfdec_text_field_movie.h

Pekka Lampila medar at kemper.freedesktop.org
Sat Aug 16 08:19:21 PDT 2008


 swfdec/swfdec_text_field_movie.c |  135 ++++++++++++++++++++++++++-------------
 swfdec/swfdec_text_field_movie.h |    2 
 2 files changed, 95 insertions(+), 42 deletions(-)

New commits:
commit bff97ca6943329fc42fef894009c9304c0b8d22e
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Sat Aug 16 18:18:36 2008 +0300

    Support asfunction: links in TextField

diff --git a/swfdec/swfdec_text_field_movie.c b/swfdec/swfdec_text_field_movie.c
index 93dab9e..4b702b7 100644
--- a/swfdec/swfdec_text_field_movie.c
+++ b/swfdec/swfdec_text_field_movie.c
@@ -395,6 +395,8 @@ swfdec_text_field_movie_init_movie (SwfdecMovie *movie)
 
   cx = swfdec_gc_object_get_context (movie);
 
+  text->sandbox = SWFDEC_SANDBOX (cx->global);
+
   swfdec_text_field_movie_init_properties (cx);
 
   swfdec_as_object_get_variable (cx->global, SWFDEC_AS_STR_TextField, &val);
@@ -530,6 +532,90 @@ swfdec_text_field_movie_contains (SwfdecMovie *movie, double x, double y,
 }
 
 static void
+swfdec_text_field_movie_parse_listen_variable (SwfdecTextFieldMovie *text,
+    const char *variable, SwfdecAsObject **object, const char **name)
+{
+  SwfdecAsContext *cx;
+  SwfdecAsObject *parent;
+  const char *p1, *p2;
+
+  g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
+  g_return_if_fail (variable != NULL);
+  g_return_if_fail (object != NULL);
+  g_return_if_fail (name != NULL);
+
+  *object = NULL;
+  *name = NULL;
+
+  if (SWFDEC_MOVIE (text)->parent == NULL)
+    return;
+
+  g_assert (SWFDEC_IS_AS_OBJECT (SWFDEC_MOVIE (text)->parent));
+  cx = swfdec_gc_object_get_context (text);
+  parent = SWFDEC_AS_OBJECT (SWFDEC_MOVIE (text)->parent);
+
+  p1 = strrchr (variable, '.');
+  p2 = strrchr (variable, ':');
+  if (p1 == NULL && p2 == NULL) {
+    *object = parent;
+    *name = variable;
+  } else {
+    if (p1 == NULL || (p2 != NULL && p2 > p1))
+      p1 = p2;
+    if (strlen (p1) == 1)
+      return;
+    *object = swfdec_action_lookup_object (cx, parent, variable, p1);
+    if (*object == NULL)
+      return;
+    *name = swfdec_as_context_get_string (cx, p1 + 1);
+  }
+}
+
+static void
+swfdec_text_field_movie_asfunction (SwfdecTextFieldMovie *text,
+    const char *url)
+{
+  char **parts;
+  SwfdecAsObject *object;
+  const char *name;
+  SwfdecAsContext *cx;
+
+  g_return_if_fail (g_ascii_strncasecmp (url, "asfunction:",
+	strlen ("asfunction:")) == 0);
+
+  cx = swfdec_gc_object_get_context (text);
+
+  parts = g_strsplit (url + strlen ("asfunction:"), ",", 2);
+  if (parts[0] == NULL) {
+    SWFDEC_ERROR ("asfunction link without function name clicked");
+    g_strfreev (parts);
+    return;
+  }
+
+  swfdec_text_field_movie_parse_listen_variable (text,
+      swfdec_as_context_get_string (cx, parts[0]), &object, &name);
+
+  if (object == NULL || name == NULL) {
+    SWFDEC_ERROR ("Function in asfunction link not found: %s", parts[0]);
+    g_strfreev (parts);
+    return;
+  }
+
+  swfdec_sandbox_use (text->sandbox);
+  if (parts[1] != NULL) {
+    SwfdecAsValue val;
+    SWFDEC_AS_VALUE_SET_STRING (&val,
+	swfdec_as_context_get_string (cx, parts[1]));
+    swfdec_as_object_call (object, name, 1, &val, NULL);
+  } else {
+    swfdec_as_object_call (object, name, 0, NULL, NULL);
+  }
+  swfdec_sandbox_unuse (text->sandbox);
+
+  g_strfreev (parts);
+}
+
+static void
 swfdec_text_field_movie_letter_clicked (SwfdecTextFieldMovie *text,
     guint index_)
 {
@@ -541,8 +627,13 @@ swfdec_text_field_movie_letter_clicked (SwfdecTextFieldMovie *text,
   attr = swfdec_text_buffer_get_attributes (text->text, index_);
 
   if (attr->url != SWFDEC_AS_STR_EMPTY) {
-    swfdec_player_launch (SWFDEC_PLAYER (swfdec_gc_object_get_context (text)),
-	attr->url, attr->target, NULL);
+    if (g_ascii_strncasecmp (attr->url, "asfunction:",
+	  strlen ("asfunction:")) == 0) {
+      swfdec_text_field_movie_asfunction (text, attr->url);
+    } else {
+      swfdec_player_launch (SWFDEC_PLAYER (swfdec_gc_object_get_context (text)),
+	  attr->url, attr->target, NULL);
+    }
   }
 }
 
@@ -923,46 +1014,6 @@ swfdec_text_field_movie_init (SwfdecTextFieldMovie *text)
   text->character_pressed = -1;
 }
 
-static void
-swfdec_text_field_movie_parse_listen_variable (SwfdecTextFieldMovie *text,
-    const char *variable, SwfdecAsObject **object, const char **name)
-{
-  SwfdecAsContext *cx;
-  SwfdecAsObject *parent;
-  const char *p1, *p2;
-
-  g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
-  g_return_if_fail (variable != NULL);
-  g_return_if_fail (object != NULL);
-  g_return_if_fail (name != NULL);
-
-  *object = NULL;
-  *name = NULL;
-
-  if (SWFDEC_MOVIE (text)->parent == NULL)
-    return;
-
-  g_assert (SWFDEC_IS_AS_OBJECT (SWFDEC_MOVIE (text)->parent));
-  cx = swfdec_gc_object_get_context (text);
-  parent = SWFDEC_AS_OBJECT (SWFDEC_MOVIE (text)->parent);
-
-  p1 = strrchr (variable, '.');
-  p2 = strrchr (variable, ':');
-  if (p1 == NULL && p2 == NULL) {
-    *object = parent;
-    *name = variable;
-  } else {
-    if (p1 == NULL || (p2 != NULL && p2 > p1))
-      p1 = p2;
-    if (strlen (p1) == 1)
-      return;
-    *object = swfdec_action_lookup_object (cx, parent, variable, p1);
-    if (*object == NULL)
-      return;
-    *name = swfdec_as_context_get_string (cx, p1 + 1);
-  }
-}
-
 void
 swfdec_text_field_movie_set_listen_variable_text (SwfdecTextFieldMovie *text,
     const char *value)
diff --git a/swfdec/swfdec_text_field_movie.h b/swfdec/swfdec_text_field_movie.h
index fabab63..720892b 100644
--- a/swfdec/swfdec_text_field_movie.h
+++ b/swfdec/swfdec_text_field_movie.h
@@ -43,6 +43,8 @@ typedef struct _SwfdecTextFieldMovieClass SwfdecTextFieldMovieClass;
 struct _SwfdecTextFieldMovie {
   SwfdecActor		actor;
 
+  SwfdecSandbox		*sandbox;
+
   SwfdecRect		extents;		/* original extents (copied from graphic) - queue extents update when modifying */
   /* these are updated with the movie's extents - so call swfdec_movie_update() */
   cairo_matrix_t	to_layout;		/* matrix to go from movie => layout */


More information about the Swfdec-commits mailing list