Pekka Lampila
2008-Aug-16 15:19 UTC
[Swfdec-commits] swfdec/swfdec_text_field_movie.c swfdec/swfdec_text_field_movie.h
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 */
Benjamin Otte
2008-Aug-20 10:55 UTC
[Swfdec] [Swfdec-commits] swfdec/swfdec_text_field_movie.c swfdec/swfdec_text_field_movie.h
Just looking at this, shouldn't the sandbox be available from SWFDEC_MOVIE (text)->resource->sandbox ? And if so, I think we do want a swfdec_movie_get_sandbox() function so noone gets it wrong again. :) Benjamin On Sat, Aug 16, 2008 at 4:19 PM, Pekka Lampila <medar at kemper.freedesktop.org> wrote:> 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 */ > _______________________________________________ > Swfdec-commits mailing list > Swfdec-commits at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/swfdec-commits >