libswfdec/swfdec_player.c | 3 +++ 1 file changed, 3 insertions(+) New commits: commit f82b818ab4cf2148fafbb9eec5a27622ccd680d7 Author: Benjamin Otte <otte at gnome.org> Date: Sun Oct 14 17:04:21 2007 +0200 lock the player when handling keys ooooops diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 32254ab..4980b21 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1023,6 +1023,7 @@ swfdec_player_do_handle_key (SwfdecPlayer *player, guint keycode, guint characte { g_assert (keycode < 256); + swfdec_player_lock (player); /* set the correct variables */ player->last_keycode = keycode; player->last_character = character; @@ -1032,6 +1033,8 @@ swfdec_player_do_handle_key (SwfdecPlayer *player, guint keycode, guint characte player->key_pressed[keycode / 8] &= ~(1 << keycode % 8); } swfdec_player_broadcast (player, SWFDEC_AS_STR_Key, down ? SWFDEC_AS_STR_onKeyDown : SWFDEC_AS_STR_onKeyUp); + swfdec_player_perform_actions (player); + swfdec_player_unlock (player); return TRUE; }
libswfdec/swfdec_player.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) New commits: commit 85af9a8352602ba805261a89c7d988ed76014e1d Author: Benjamin Otte <otte at gnome.org> Date: Thu Oct 18 23:48:03 2007 +0200 cast to an int, so 64bit machines don't get confused diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 6355c42..cb149f4 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -1747,7 +1747,7 @@ swfdec_player_launch (SwfdecPlayer *player, SwfdecLoaderRequest request, const c g_signal_emit (player, signals[FSCOMMAND], 0, command, target); return; } - g_signal_emit (player, signals[LAUNCH], 0, request, url, target, data); + g_signal_emit (player, signals[LAUNCH], 0, (int) request, url, target, data); } /**
libswfdec/swfdec_player.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) New commits: commit b38e21f76203467410023fd469ccdb916c34bc19 Author: Benjamin Otte <otte at gnome.org> Date: Fri Oct 19 18:26:34 2007 +0200 free the resource before checking stuff it references is gone diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index f6e7317..a726b3b 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -767,6 +767,10 @@ swfdec_player_dispose (GObject *object) while (player->roots) swfdec_movie_destroy (player->roots->data); + if (player->resource) { + g_object_unref (player->resource); + player->resource = NULL; + } /* we do this here so references to GC'd objects get freed */ G_OBJECT_CLASS (swfdec_player_parent_class)->dispose (object); @@ -801,10 +805,6 @@ swfdec_player_dispose (GObject *object) g_queue_free (player->init_queue); g_queue_free (player->construct_queue); swfdec_cache_unref (player->cache); - if (player->resource) { - g_object_unref (player->resource); - player->resource = NULL; - } if (player->system) { g_object_unref (player->system); player->system = NULL;
libswfdec/swfdec_player.c | 42 +++++++++++++++++++++++++++++++++--------- 1 file changed, 33 insertions(+), 9 deletions(-) New commits: commit b60ddbaabc0b624c2039c829bbe9836031b2f244 Author: Benjamin Otte <otte at gnome.org> Date: Mon Oct 29 17:47:40 2007 +0100 remove empty entries from action queues before aborting diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c index 284b7f7..439ceda 100644 --- a/libswfdec/swfdec_player.c +++ b/libswfdec/swfdec_player.c @@ -337,6 +337,25 @@ typedef struct { gpointer data; } SwfdecPlayerExternalAction; +static void +swfdec_player_compress_actions (SwfdecRingBuffer *buffer) +{ + SwfdecPlayerAction *action, tmp; + guint i = 0; + + for (i = swfdec_ring_buffer_get_n_elements (buffer) + 1; i > 0; i--) { + action = swfdec_ring_buffer_pop (buffer); + g_assert (action); + if (action->movie == NULL) + continue; + tmp = *action; + action = swfdec_ring_buffer_push (buffer); + *action = tmp; + } + SWFDEC_INFO ("compresed action queue to %u elements", + swfdec_ring_buffer_get_n_elements (buffer)); +} + /** * swfdec_player_add_event: * @player: a #SwfdecPlayer @@ -362,17 +381,22 @@ swfdec_player_add_action (SwfdecPlayer *player, SwfdecMovie *movie, SwfdecEventT SWFDEC_LOG ("adding action %s %u", movie->name, type); action = swfdec_ring_buffer_push (player->actions[importance]); if (action == NULL) { - /* FIXME: limit number of actions to not get inf loops due to scripts? */ + /* try to get rid of freed actions */ if (swfdec_ring_buffer_get_size (player->actions[importance]) >= 256) { - /* FIXME: try to remove empty entries first? */ - swfdec_as_context_abort (SWFDEC_AS_CONTEXT (player), - "256 levels of recursion were exceeded in one action list."); - return; + swfdec_player_compress_actions (player->actions[importance]); + action = swfdec_ring_buffer_push (player->actions[importance]); + /* if it doesn't get smaller, bail */ + if (action == NULL) { + swfdec_as_context_abort (SWFDEC_AS_CONTEXT (player), + "256 levels of recursion were exceeded in one action list."); + return; + } + } else { + swfdec_ring_buffer_set_size (player->actions[importance], + swfdec_ring_buffer_get_size (player->actions[importance]) + 16); + action = swfdec_ring_buffer_push (player->actions[importance]); + g_assert (action); } - swfdec_ring_buffer_set_size (player->actions[importance], - swfdec_ring_buffer_get_size (player->actions[importance]) + 16); - action = swfdec_ring_buffer_push (player->actions[importance]); - g_assert (action); } action->movie = movie; action->script = NULL;
Maybe Matching Threads
- libswfdec/swfdec_player.c
- small bug in swfdec_mouse_as.c
- libswfdec/swfdec_as_strings.c libswfdec/swfdec_player.c
- Branch 'as' - libswfdec/swfdec_graphic_movie.c libswfdec/swfdec_movie.c libswfdec/swfdec_movie.h libswfdec/swfdec_sprite_movie.c
- libswfdec-gtk/swfdec_gtk_player.c libswfdec/swfdec_as_date.c libswfdec/swfdec_audio.c libswfdec/swfdec_audio_event.c libswfdec/swfdec_button_movie.c libswfdec/swfdec_interval.c libswfdec/swfdec_key_as.c libswfdec/swfdec_mouse_as.c libswfdec/swfdec_movie.c