[Swfdec] Branch 'vivi' - 11 commits - libswfdec-gtk/swfdec_gtk_widget.c libswfdec/Makefile.am libswfdec/swfdec.h libswfdec/swfdec_player.c libswfdec/swfdec_player_internal.h vivified/core
Benjamin Otte
company at kemper.freedesktop.org
Tue Aug 14 11:29:33 PDT 2007
libswfdec-gtk/swfdec_gtk_widget.c | 2
libswfdec/Makefile.am | 4 -
libswfdec/swfdec.h | 2
libswfdec/swfdec_player.c | 26 ++++++-
libswfdec/swfdec_player_internal.h | 2
vivified/core/Makefile.am | 5 +
vivified/core/vivi_application.c | 39 +++++++++-
vivified/core/vivi_application.h | 5 +
vivified/core/vivi_application_as.c | 20 +++++
vivified/core/vivi_breakpoint.c | 130 ++++++++++++++++++++++++++++++++++++
vivified/core/vivi_breakpoint.h | 55 +++++++++++++++
vivified/core/vivi_debugger.c | 103 ++++++++++++++++++++++++++++
vivified/core/vivi_debugger.h | 55 +++++++++++++++
vivified/core/vivi_function.c | 9 ++
vivified/core/vivi_initialize.as | 5 +
15 files changed, 452 insertions(+), 10 deletions(-)
New commits:
diff-tree adc7c2987283fe1ec7df8aa442d6d11b6d8d762a (from c1e028a0e58fb2821ce1d10898aca11fbc3c19a0)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 20:29:22 2007 +0200
remove debugging g_print's
diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index d822642..585d295 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -140,7 +140,6 @@ vivi_application_init_player (ViviApplic
g_return_if_fail (VIVI_IS_APPLICATION (app));
- g_print ("init\n");
if (app->player_inited)
return;
@@ -149,7 +148,6 @@ vivi_application_init_player (ViviApplic
return;
}
- g_print ("really init\n");
loader = swfdec_file_loader_new (app->filename);
swfdec_player_set_loader (app->player, loader);
app->player_inited = TRUE;
diff-tree c1e028a0e58fb2821ce1d10898aca11fbc3c19a0 (from 507c1f215ba04bee30f9b82d13040b51780275e9)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 20:29:01 2007 +0200
add a quit command/function
diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index fadfcde..d822642 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -31,6 +31,7 @@ typedef enum {
VIVI_APPLICATION_STOPPED,
VIVI_APPLICATION_PLAYING,
VIVI_APPLICATION_STEPPING,
+ VIVI_APPLICATION_EXITING,
} ViviApplicationPlayback;
enum {
@@ -215,6 +216,12 @@ vivi_application_check (ViviApplication
swfdec_as_context_maybe_gc (SWFDEC_AS_CONTEXT (app));
switch (app->playback_state) {
+ case VIVI_APPLICATION_EXITING:
+ if (is_playing)
+ swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (app->player), FALSE);
+ if (is_breakpoint)
+ g_main_loop_quit (app->loop);
+ break;
case VIVI_APPLICATION_STOPPED:
if (is_playing)
swfdec_gtk_player_set_playing (SWFDEC_GTK_PLAYER (app->player), FALSE);
@@ -314,3 +321,13 @@ vivi_application_step (ViviApplication *
app->playback_count = n_times;
}
+void
+vivi_application_quit (ViviApplication *app)
+{
+ g_return_if_fail (VIVI_IS_APPLICATION (app));
+
+ app->playback_state = VIVI_APPLICATION_EXITING;
+ app->playback_count = 1;
+ gtk_main_quit ();
+}
+
diff --git a/vivified/core/vivi_application.h b/vivified/core/vivi_application.h
index 2f4fd33..d1f0da7 100644
--- a/vivified/core/vivi_application.h
+++ b/vivified/core/vivi_application.h
@@ -87,6 +87,7 @@ void vivi_application_play (ViviAppli
void vivi_application_stop (ViviApplication * app);
void vivi_application_step (ViviApplication * app,
guint n_times);
+void vivi_application_quit (ViviApplication * app);
void vivi_applciation_execute (ViviApplication * app,
const char * command);
diff --git a/vivified/core/vivi_application_as.c b/vivified/core/vivi_application_as.c
index 2e72f23..a637428 100644
--- a/vivified/core/vivi_application_as.c
+++ b/vivified/core/vivi_application_as.c
@@ -89,3 +89,13 @@ vivi_application_as_print (SwfdecAsConte
vivi_application_output (app, "%s", s);
}
+VIVI_FUNCTION ("quit", vivi_application_as_quit)
+void
+vivi_application_as_quit (SwfdecAsContext *cx, SwfdecAsObject *this,
+ guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
+{
+ ViviApplication *app = VIVI_APPLICATION (cx);
+
+ vivi_application_quit (app);
+}
+
diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index e5809b0..376e594 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -30,5 +30,6 @@ Commands.restart = function () {
Commands.reset ();
Commands.run ();
};
+Commands.quit = Native.quit;
Breakpoint = Native.Breakpoint;
diff-tree 507c1f215ba04bee30f9b82d13040b51780275e9 (from c26fe8330d6c77a5a0bc34f4ca3ce63a74f8bf28)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 15:16:31 2007 +0200
add breakpoints
diff --git a/vivified/core/Makefile.am b/vivified/core/Makefile.am
index 7d2fd48..694ddad 100644
--- a/vivified/core/Makefile.am
+++ b/vivified/core/Makefile.am
@@ -6,6 +6,8 @@ libvivified_core_la_LDFLAGS = $(SWFDEC_G
libvivified_core_la_SOURCES = \
vivi_application.c \
vivi_application_as.c \
+ vivi_application.c \
+ vivi_breakpoint.c \
vivi_debugger.c \
vivi_function.c \
vivi_initialize.as \
@@ -17,6 +19,7 @@ vivi_initialize.lo: vivi_initialize.s vi
noinst_HEADERS = \
vivi_application.h \
+ vivi_breakpoint.h \
vivi_debugger.h \
vivi_function.h \
vivi_function_list.h \
diff --git a/vivified/core/vivi_breakpoint.c b/vivified/core/vivi_breakpoint.c
new file mode 100644
index 0000000..7931e28
--- /dev/null
+++ b/vivified/core/vivi_breakpoint.c
@@ -0,0 +1,130 @@
+/* Vivified
+ * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "vivi_breakpoint.h"
+#include "vivi_application.h"
+#include "vivi_function.h"
+
+G_DEFINE_TYPE (ViviBreakpoint, vivi_breakpoint, SWFDEC_TYPE_AS_OBJECT)
+
+static gboolean
+vivi_breakpoint_step (ViviDebugger *debugger, ViviBreakpoint *breakpoint)
+{
+ SwfdecAsObject *obj = SWFDEC_AS_OBJECT (breakpoint);
+ SwfdecAsValue val;
+
+ swfdec_as_object_call (obj, swfdec_as_context_get_string (obj->context, "onStep"), 0, NULL, &val);
+ return swfdec_as_value_to_boolean (obj->context, &val);
+}
+
+static const struct {
+ const char * event;
+ const char * signal;
+ GCallback handler;
+} events[] = {
+ { NULL, NULL, NULL }, /* invalid */
+ { "onStep", "step", G_CALLBACK (vivi_breakpoint_step) }
+};
+
+static guint
+vivi_breakpoint_find_event (const char *name)
+{
+ guint i;
+
+ for (i = 1; i < G_N_ELEMENTS (events); i++) {
+ if (g_str_equal (events[i].event, name))
+ return i;
+ }
+ return 0;
+}
+
+static void
+vivi_breakpoint_set (SwfdecAsObject *object, const char *variable, const SwfdecAsValue *val)
+{
+ guint i;
+
+ i = vivi_breakpoint_find_event (variable);
+ if (i) {
+ ViviBreakpoint *breakpoint = VIVI_BREAKPOINT (object);
+ ViviDebugger *debugger = VIVI_APPLICATION (object->context)->debugger;
+ if (SWFDEC_AS_VALUE_IS_OBJECT (val) &&
+ SWFDEC_IS_AS_FUNCTION (SWFDEC_AS_VALUE_GET_OBJECT (val))) {
+ if (!breakpoint->handlers[i])
+ breakpoint->handlers[i] = g_signal_connect (debugger, events[i].signal,
+ events[i].handler, object);
+ } else {
+ if (breakpoint->handlers[i])
+ g_signal_handler_disconnect (debugger, breakpoint->handlers[i]);
+ }
+ }
+ SWFDEC_AS_OBJECT_CLASS (vivi_breakpoint_parent_class)->set (object, variable, val);
+}
+
+static gboolean
+vivi_breakpoint_delete (SwfdecAsObject *object, const char *variable)
+{
+ ViviBreakpoint *breakpoint = VIVI_BREAKPOINT (object);
+ guint i;
+
+ i = vivi_breakpoint_find_event (variable);
+ if (i && breakpoint->handlers[i]) {
+ ViviDebugger *debugger = VIVI_APPLICATION (object->context)->debugger;
+ g_signal_handler_disconnect (debugger, breakpoint->handlers[i]);
+ }
+
+ return SWFDEC_AS_OBJECT_CLASS (vivi_breakpoint_parent_class)->del (object, variable);
+}
+
+static void
+vivi_breakpoint_dispose (GObject *object)
+{
+ ViviBreakpoint *breakpoint = VIVI_BREAKPOINT (object);
+ ViviDebugger *debugger = VIVI_APPLICATION (SWFDEC_AS_OBJECT (breakpoint)->context)->debugger;
+ guint i;
+
+ for (i = 0; i < G_N_ELEMENTS (events); i++) {
+ if (breakpoint->handlers[i])
+ g_signal_handler_disconnect (debugger, breakpoint->handlers[i]);
+ }
+ G_OBJECT_CLASS (vivi_breakpoint_parent_class)->dispose (object);
+}
+
+static void
+vivi_breakpoint_class_init (ViviBreakpointClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ SwfdecAsObjectClass *as_object_class = SWFDEC_AS_OBJECT_CLASS (klass);
+
+ object_class->dispose = vivi_breakpoint_dispose;
+
+ as_object_class->set = vivi_breakpoint_set;
+ as_object_class->del = vivi_breakpoint_delete;
+}
+
+static void
+vivi_breakpoint_init (ViviBreakpoint *breakpoint)
+{
+}
+
+/*** AS CODE ***/
+
diff --git a/vivified/core/vivi_breakpoint.h b/vivified/core/vivi_breakpoint.h
new file mode 100644
index 0000000..084cc8f
--- /dev/null
+++ b/vivified/core/vivi_breakpoint.h
@@ -0,0 +1,55 @@
+/* Vivified
+ * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#ifndef _VIVI_BREAKPOINT_H_
+#define _VIVI_BREAKPOINT_H_
+
+#include <libswfdec/swfdec.h>
+#include <vivified/core/vivi_application.h>
+
+G_BEGIN_DECLS
+
+
+typedef struct _ViviBreakpoint ViviBreakpoint;
+typedef struct _ViviBreakpointClass ViviBreakpointClass;
+
+#define VIVI_TYPE_BREAKPOINT (vivi_breakpoint_get_type())
+#define VIVI_IS_BREAKPOINT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIVI_TYPE_BREAKPOINT))
+#define VIVI_IS_BREAKPOINT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIVI_TYPE_BREAKPOINT))
+#define VIVI_BREAKPOINT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIVI_TYPE_BREAKPOINT, ViviBreakpoint))
+#define VIVI_BREAKPOINT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIVI_TYPE_BREAKPOINT, ViviBreakpointClass))
+#define VIVI_BREAKPOINT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIVI_TYPE_BREAKPOINT, ViviBreakpointClass))
+
+struct _ViviBreakpoint
+{
+ SwfdecAsObject object;
+
+ gulong handlers[2]; /* handlers for every signal of the debugger or 0 */
+};
+
+struct _ViviBreakpointClass
+{
+ SwfdecAsObjectClass object_class;
+};
+
+GType vivi_breakpoint_get_type (void);
+
+
+G_END_DECLS
+#endif
diff --git a/vivified/core/vivi_function.c b/vivified/core/vivi_function.c
index 6fb5197..cfcb382 100644
--- a/vivified/core/vivi_function.c
+++ b/vivified/core/vivi_function.c
@@ -22,6 +22,7 @@
#endif
#include "vivi_function.h"
+#include "vivi_breakpoint.h"
#include "vivi_function_list.h"
/* include vivi_function_list with special macro definition, so we get a nice
@@ -52,6 +53,7 @@ void
vivi_function_init_context (ViviApplication *app)
{
SwfdecAsContext *cx = SWFDEC_AS_CONTEXT (app);
+ SwfdecAsFunction *fun;
SwfdecAsObject *obj;
SwfdecAsValue val;
guint i;
@@ -68,6 +70,13 @@ vivi_function_init_context (ViviApplicat
swfdec_as_context_get_string (cx, functions[i].name),
0, functions[i].fun, 0);
}
+ /* FIXME: find a better solution than this */
+ fun = swfdec_as_object_add_function (obj,
+ swfdec_as_context_get_string (cx, "Breakpoint"),
+ 0, functions[i].fun, 0);
+ swfdec_as_native_function_set_construct_type (SWFDEC_AS_NATIVE_FUNCTION (fun),
+ VIVI_TYPE_BREAKPOINT);
+
g_signal_connect (app, "message", G_CALLBACK (vivi_function_not_reached), NULL);
vivi_applciation_execute (app, vivi_initialize);
g_signal_handlers_disconnect_by_func (app, G_CALLBACK (vivi_function_not_reached), NULL);
diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index d8eadc5..e5809b0 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -30,3 +30,5 @@ Commands.restart = function () {
Commands.reset ();
Commands.run ();
};
+
+Breakpoint = Native.Breakpoint;
diff-tree c26fe8330d6c77a5a0bc34f4ca3ce63a74f8bf28 (from 7cc61118ddf98319b1641013587b505affc01300)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 14:49:56 2007 +0200
apparently the function headers weren't installed either.
They are documented though (nice!)
diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am
index fc9d47f..b9a63b3 100644
--- a/libswfdec/Makefile.am
+++ b/libswfdec/Makefile.am
@@ -128,6 +128,8 @@ public_headers = \
swfdec_as_context.h \
swfdec_as_debugger.h \
swfdec_as_frame.h \
+ swfdec_as_function.h \
+ swfdec_as_native_function.h \
swfdec_as_object.h \
swfdec_as_types.h \
swfdec_audio.h \
@@ -147,11 +149,9 @@ noinst_HEADERS = \
swfdec_as_array.h \
swfdec_as_boolean.h \
swfdec_as_frame_internal.h \
- swfdec_as_function.h \
swfdec_as_internal.h \
swfdec_as_interpret.h \
swfdec_as_math.h \
- swfdec_as_native_function.h \
swfdec_as_number.h \
swfdec_as_scope.h \
swfdec_as_script_function.h \
diff-tree 7cc61118ddf98319b1641013587b505affc01300 (from b8865e69f74f00f1c2b373003900b24592df341b)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 14:48:38 2007 +0200
These two files were missing in the headers
diff --git a/libswfdec/swfdec.h b/libswfdec/swfdec.h
index ec4d136..8a4cd65 100644
--- a/libswfdec/swfdec.h
+++ b/libswfdec/swfdec.h
@@ -25,6 +25,8 @@
#include <libswfdec/swfdec_as_context.h>
#include <libswfdec/swfdec_as_debugger.h>
#include <libswfdec/swfdec_as_frame.h>
+#include <libswfdec/swfdec_as_function.h>
+#include <libswfdec/swfdec_as_native_function.h>
#include <libswfdec/swfdec_as_object.h>
#include <libswfdec/swfdec_as_types.h>
#include <libswfdec/swfdec_script.h>
diff-tree b8865e69f74f00f1c2b373003900b24592df341b (from 2421ba7779043c938533566a0a23a8ab5c3a84ff)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 12:47:48 2007 +0200
g_object_notify() about a new player
diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index dd3b46f..fadfcde 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -163,6 +163,7 @@ vivi_application_reset (ViviApplication
g_object_unref (app->player);
app->player = swfdec_gtk_player_new (SWFDEC_AS_DEBUGGER (app->debugger));
app->player_inited = FALSE;
+ g_object_notify (G_OBJECT (app), "player");
}
void
diff-tree 2421ba7779043c938533566a0a23a8ab5c3a84ff (from c5c3edfb757eb8ff0bad4301fc877cc38a648815)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 12:45:24 2007 +0200
implement the debugger and use it
diff --git a/vivified/core/Makefile.am b/vivified/core/Makefile.am
index 6b0e473..7d2fd48 100644
--- a/vivified/core/Makefile.am
+++ b/vivified/core/Makefile.am
@@ -6,6 +6,7 @@ libvivified_core_la_LDFLAGS = $(SWFDEC_G
libvivified_core_la_SOURCES = \
vivi_application.c \
vivi_application_as.c \
+ vivi_debugger.c \
vivi_function.c \
vivi_initialize.as \
vivi_initialize.s \
@@ -16,6 +17,7 @@ vivi_initialize.lo: vivi_initialize.s vi
noinst_HEADERS = \
vivi_application.h \
+ vivi_debugger.h \
vivi_function.h \
vivi_function_list.h \
vivi_ming.h \
diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index 958b459..dd3b46f 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -23,6 +23,7 @@
#include <libswfdec-gtk/swfdec-gtk.h>
#include "vivi_application.h"
+#include "vivi_debugger.h"
#include "vivi_function.h"
#include "vivi_ming.h"
@@ -115,7 +116,9 @@ vivi_application_class_init (ViviApplica
static void
vivi_application_init (ViviApplication *app)
{
- app->player = swfdec_gtk_player_new (NULL);
+ app->debugger = g_object_new (VIVI_TYPE_DEBUGGER, NULL);
+ app->debugger->app = app;
+ app->player = swfdec_gtk_player_new (SWFDEC_AS_DEBUGGER (app->debugger));
}
ViviApplication *
@@ -156,8 +159,9 @@ vivi_application_reset (ViviApplication
{
g_return_if_fail (VIVI_IS_APPLICATION (app));
+ g_assert (app->loop == NULL); /* FIXME: what do we do if we're inside a breakpoint? */
g_object_unref (app->player);
- app->player = swfdec_gtk_player_new (NULL);
+ app->player = swfdec_gtk_player_new (SWFDEC_AS_DEBUGGER (app->debugger));
app->player_inited = FALSE;
}
diff --git a/vivified/core/vivi_application.h b/vivified/core/vivi_application.h
index fab0262..2f4fd33 100644
--- a/vivified/core/vivi_application.h
+++ b/vivified/core/vivi_application.h
@@ -27,6 +27,8 @@ G_BEGIN_DECLS
typedef struct _ViviApplication ViviApplication;
typedef struct _ViviApplicationClass ViviApplicationClass;
+/* forward declarations */
+typedef struct _ViviDebugger ViviDebugger;
typedef enum {
VIVI_MESSAGE_INPUT,
@@ -47,6 +49,7 @@ struct _ViviApplication
char * filename; /* name of the file we play back or NULL if none set yet */
SwfdecPlayer * player; /* the current player */
+ ViviDebugger * debugger; /* the debugger used in player */
gboolean player_inited; /* if the player is inited already */
guint playback_state; /* (running, stepping or stopped) */
guint playback_count; /* how often to just restart this on breakpoints */
diff --git a/vivified/core/vivi_debugger.c b/vivified/core/vivi_debugger.c
new file mode 100644
index 0000000..fcad454
--- /dev/null
+++ b/vivified/core/vivi_debugger.c
@@ -0,0 +1,103 @@
+/* Vivified
+ * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "vivi_debugger.h"
+#include "vivi_application.h"
+/* FIXME: oops */
+#include "libswfdec/swfdec_player_internal.h"
+
+enum {
+ STEP,
+ LAST_SIGNAL
+};
+
+G_DEFINE_TYPE (ViviDebugger, vivi_debugger, SWFDEC_TYPE_AS_DEBUGGER)
+static guint signals[LAST_SIGNAL] = { 0, };
+
+static gboolean
+vivi_accumulate_or (GSignalInvocationHint *ihint, GValue *return_accu,
+ const GValue *handler_return, gpointer data)
+{
+ if (g_value_get_boolean (handler_return))
+ g_value_set_boolean (return_accu, TRUE);
+ return TRUE;
+}
+
+static void
+vivi_debugger_dispose (GObject *object)
+{
+ //ViviDebugger *debugger = VIVI_DEBUGGER (object);
+
+ G_OBJECT_CLASS (vivi_debugger_parent_class)->dispose (object);
+}
+
+static void
+vivi_debugger_break (ViviDebugger *debugger)
+{
+ ViviApplication *app = debugger->app;
+
+ g_assert (app);
+ swfdec_player_unlock_soft (app->player);
+
+ app->playback_state = 0;
+ app->playback_count = 0;
+ app->loop = g_main_loop_new (NULL, FALSE);
+
+ g_main_loop_run (app->loop);
+
+ g_main_loop_unref (app->loop);
+ app->loop = NULL;
+ swfdec_player_lock_soft (app->player);
+}
+
+static void
+vivi_debugger_step (SwfdecAsDebugger *debugger, SwfdecAsContext *context)
+{
+ gboolean retval = FALSE;
+
+ g_signal_emit (debugger, signals[STEP], 0, &retval);
+
+ if (retval)
+ vivi_debugger_break (VIVI_DEBUGGER (debugger));
+}
+
+static void
+vivi_debugger_class_init (ViviDebuggerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ SwfdecAsDebuggerClass *debugger_class = SWFDEC_AS_DEBUGGER_CLASS (klass);
+
+ object_class->dispose = vivi_debugger_dispose;
+
+ signals[STEP] = g_signal_new ("step", G_TYPE_FROM_CLASS (klass),
+ G_SIGNAL_RUN_LAST, 0, vivi_accumulate_or, NULL, g_cclosure_marshal_VOID__VOID,
+ G_TYPE_BOOLEAN, 0);
+
+ debugger_class->step = vivi_debugger_step;
+}
+
+static void
+vivi_debugger_init (ViviDebugger *debugger)
+{
+}
+
diff --git a/vivified/core/vivi_debugger.h b/vivified/core/vivi_debugger.h
new file mode 100644
index 0000000..76873ab
--- /dev/null
+++ b/vivified/core/vivi_debugger.h
@@ -0,0 +1,55 @@
+/* Vivified
+ * Copyright (C) 2007 Benjamin Otte <otte at gnome.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ */
+
+#ifndef _VIVI_DEBUGGER_H_
+#define _VIVI_DEBUGGER_H_
+
+#include <libswfdec/swfdec.h>
+#include <vivified/core/vivi_application.h>
+
+G_BEGIN_DECLS
+
+
+//typedef struct _ViviDebugger ViviDebugger;
+typedef struct _ViviDebuggerClass ViviDebuggerClass;
+
+#define VIVI_TYPE_DEBUGGER (vivi_debugger_get_type())
+#define VIVI_IS_DEBUGGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIVI_TYPE_DEBUGGER))
+#define VIVI_IS_DEBUGGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIVI_TYPE_DEBUGGER))
+#define VIVI_DEBUGGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIVI_TYPE_DEBUGGER, ViviDebugger))
+#define VIVI_DEBUGGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIVI_TYPE_DEBUGGER, ViviDebuggerClass))
+#define VIVI_DEBUGGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIVI_TYPE_DEBUGGER, ViviDebuggerClass))
+
+struct _ViviDebugger
+{
+ SwfdecAsDebugger debugger;
+
+ ViviApplication * app; /* the appliction we're playing for */
+};
+
+struct _ViviDebuggerClass
+{
+ SwfdecAsDebuggerClass debugger_class;
+};
+
+GType vivi_debugger_get_type (void);
+
+
+G_END_DECLS
+#endif
diff-tree c5c3edfb757eb8ff0bad4301fc877cc38a648815 (from df83f6880be9203515164615fae3da464d36027b)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 12:26:37 2007 +0200
add swfdec_player_(un)lock_soft () functions
diff --git a/libswfdec/swfdec_player.c b/libswfdec/swfdec_player.c
index e1c7748..2bb0264 100644
--- a/libswfdec/swfdec_player.c
+++ b/libswfdec/swfdec_player.c
@@ -1043,11 +1043,11 @@ swfdec_player_perform_actions (SwfdecPla
player->invalid = old_inval;
}
+/* used for breakpoints */
void
-swfdec_player_lock (SwfdecPlayer *player)
+swfdec_player_lock_soft (SwfdecPlayer *player)
{
g_return_if_fail (SWFDEC_IS_PLAYER (player));
- g_assert (swfdec_ring_buffer_get_n_elements (player->actions) == 0);
g_assert (swfdec_rect_is_empty (&player->invalid));
g_object_freeze_notify (G_OBJECT (player));
@@ -1055,18 +1055,36 @@ swfdec_player_lock (SwfdecPlayer *player
}
void
-swfdec_player_unlock (SwfdecPlayer *player)
+swfdec_player_lock (SwfdecPlayer *player)
{
g_return_if_fail (SWFDEC_IS_PLAYER (player));
g_assert (swfdec_ring_buffer_get_n_elements (player->actions) == 0);
+ swfdec_player_lock_soft (player);
+}
+
+/* used for breakpoints */
+void
+swfdec_player_unlock_soft (SwfdecPlayer *player)
+{
+ g_return_if_fail (SWFDEC_IS_PLAYER (player));
+
SWFDEC_DEBUG ("UNLOCK");
- swfdec_as_context_maybe_gc (SWFDEC_AS_CONTEXT (player));
swfdec_player_update_mouse_cursor (player);
g_object_thaw_notify (G_OBJECT (player));
swfdec_player_emit_signals (player);
}
+void
+swfdec_player_unlock (SwfdecPlayer *player)
+{
+ g_return_if_fail (SWFDEC_IS_PLAYER (player));
+ g_assert (swfdec_ring_buffer_get_n_elements (player->actions) == 0);
+
+ swfdec_as_context_maybe_gc (SWFDEC_AS_CONTEXT (player));
+ swfdec_player_unlock_soft (player);
+}
+
static gboolean
swfdec_accumulate_or (GSignalInvocationHint *ihint, GValue *return_accu,
const GValue *handler_return, gpointer data)
diff --git a/libswfdec/swfdec_player_internal.h b/libswfdec/swfdec_player_internal.h
index 0d27ec8..0c7ed68 100644
--- a/libswfdec/swfdec_player_internal.h
+++ b/libswfdec/swfdec_player_internal.h
@@ -148,7 +148,9 @@ void swfdec_player_remove_movie (Swfdec
SwfdecMovie * movie);
void swfdec_player_lock (SwfdecPlayer * player);
+void swfdec_player_lock_soft (SwfdecPlayer * player);
void swfdec_player_unlock (SwfdecPlayer * player);
+void swfdec_player_unlock_soft (SwfdecPlayer * player);
void swfdec_player_perform_actions (SwfdecPlayer * player);
SwfdecAsObject *swfdec_player_get_export_class (SwfdecPlayer * player,
diff-tree df83f6880be9203515164615fae3da464d36027b (from 1ffa1414f746e1ae2c7cce75518419a501428c83)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 11:12:43 2007 +0200
maybe GC after function calls
diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index 0b13eaa..958b459 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -207,6 +207,8 @@ vivi_application_check (ViviApplication
gboolean is_playing = swfdec_gtk_player_get_playing (SWFDEC_GTK_PLAYER (app->player));
gboolean is_breakpoint = app->loop != NULL;
+ swfdec_as_context_maybe_gc (SWFDEC_AS_CONTEXT (app));
+
switch (app->playback_state) {
case VIVI_APPLICATION_STOPPED:
if (is_playing)
diff-tree 1ffa1414f746e1ae2c7cce75518419a501428c83 (from f78c7cf7699db1844c0215bd637105b367d86912)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 10:40:23 2007 +0200
return TRUE for consumed key press/reelease events
This gets around those events changing focus, so the widget is still focused
after pressing tab
diff --git a/libswfdec-gtk/swfdec_gtk_widget.c b/libswfdec-gtk/swfdec_gtk_widget.c
index 61cffca..94b7f31 100644
--- a/libswfdec-gtk/swfdec_gtk_widget.c
+++ b/libswfdec-gtk/swfdec_gtk_widget.c
@@ -166,6 +166,7 @@ swfdec_gtk_widget_key_press (GtkWidget *
swfdec_player_key_press (priv->player, keycode,
gdk_keyval_to_unicode (event->keyval));
}
+ return TRUE;
}
return FALSE;
@@ -183,6 +184,7 @@ swfdec_gtk_widget_key_release (GtkWidget
swfdec_player_key_release (priv->player, keycode,
gdk_keyval_to_unicode (event->keyval));
}
+ return TRUE;
}
return FALSE;
diff-tree f78c7cf7699db1844c0215bd637105b367d86912 (from e6ae2a00a9b1aadbbc45cea54cefe6bfa60f023b)
Author: Benjamin Otte <otte at gnome.org>
Date: Tue Aug 14 10:27:07 2007 +0200
add a method to stop a running player
diff --git a/vivified/core/vivi_application.c b/vivified/core/vivi_application.c
index a87aa55..0b13eaa 100644
--- a/vivified/core/vivi_application.c
+++ b/vivified/core/vivi_application.c
@@ -290,6 +290,15 @@ vivi_application_play (ViviApplication *
}
void
+vivi_application_stop (ViviApplication *app)
+{
+ g_return_if_fail (VIVI_IS_APPLICATION (app));
+
+ app->playback_state = VIVI_APPLICATION_STOPPED;
+ app->playback_count = 0;
+}
+
+void
vivi_application_step (ViviApplication *app, guint n_times)
{
g_return_if_fail (VIVI_IS_APPLICATION (app));
diff --git a/vivified/core/vivi_application.h b/vivified/core/vivi_application.h
index d250989..fab0262 100644
--- a/vivified/core/vivi_application.h
+++ b/vivified/core/vivi_application.h
@@ -81,6 +81,7 @@ SwfdecPlayer * vivi_application_g
void vivi_application_init_player (ViviApplication * app);
void vivi_application_reset (ViviApplication * app);
void vivi_application_play (ViviApplication * app);
+void vivi_application_stop (ViviApplication * app);
void vivi_application_step (ViviApplication * app,
guint n_times);
diff --git a/vivified/core/vivi_application_as.c b/vivified/core/vivi_application_as.c
index 24814a7..2e72f23 100644
--- a/vivified/core/vivi_application_as.c
+++ b/vivified/core/vivi_application_as.c
@@ -45,6 +45,16 @@ vivi_application_as_run (SwfdecAsContext
vivi_application_play (app);
}
+VIVI_FUNCTION ("stop", vivi_application_as_stop)
+void
+vivi_application_as_stop (SwfdecAsContext *cx, SwfdecAsObject *this,
+ guint argc, SwfdecAsValue *argv, SwfdecAsValue *retval)
+{
+ ViviApplication *app = VIVI_APPLICATION (cx);
+
+ vivi_application_stop (app);
+}
+
VIVI_FUNCTION ("step", vivi_application_as_step)
void
vivi_application_as_step (SwfdecAsContext *cx, SwfdecAsObject *this,
diff --git a/vivified/core/vivi_initialize.as b/vivified/core/vivi_initialize.as
index dfae8f3..d8eadc5 100644
--- a/vivified/core/vivi_initialize.as
+++ b/vivified/core/vivi_initialize.as
@@ -21,6 +21,8 @@ Commands = new Object ();
Commands.print = Native.print;
Commands.r = Native.run;
Commands.run = Native.run;
+Commands.halt = Native.stop;
+Commands.stop = Native.stop;
Commands.s = Native.step;
Commands.step = Native.step;
Commands.reset = Native.reset;
More information about the Swfdec
mailing list