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;
Apparently Analagous 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