Benjamin Otte
2007-Aug-21 10:49 UTC
[Swfdec] Branch 'vivi' - 15 commits - configure.ac libswfdec/Makefile.am libswfdec/swfdec_as_context.c libswfdec/swfdec_as_debugger.h libswfdec/swfdec_as_object.c libswfdec/swfdec_movie.c libswfdec/swfdec_script.c libswfdec/swfdec_types.h vivified/core vivified/ui
configure.ac | 5 - libswfdec/Makefile.am | 2 libswfdec/swfdec_as_context.c | 9 +- libswfdec/swfdec_as_debugger.h | 8 ++ libswfdec/swfdec_as_object.c | 5 + libswfdec/swfdec_movie.c | 15 --- libswfdec/swfdec_script.c | 1 libswfdec/swfdec_types.h | 1 vivified/core/vivi_debugger.c | 34 ++++++++ vivified/ui/Makefile.am | 10 +- vivified/ui/main.c | 18 +++- vivified/ui/vivi_command_line.c | 118 +++++++++++++++++++++++++++++ vivified/ui/vivi_command_line.xml | 38 +++++++++ vivified/ui/vivi_commandline.c | 150 -------------------------------------- vivified/ui/vivi_commandline.h | 57 -------------- vivified/ui/vivi_movie_list.c | 43 ++++++---- vivified/ui/vivi_movie_list.h | 6 - vivified/ui/vivi_player.c | 61 ++++----------- vivified/ui/vivi_player.h | 57 -------------- vivified/ui/vivi_player.xml | 17 ++++ vivified/ui/vivi_vivi_docklet.c | 150 ++++++++++++++++++++++++++++++++++++++ vivified/ui/vivi_vivi_docklet.h | 62 +++++++++++++++ 22 files changed, 511 insertions(+), 356 deletions(-) New commits: diff-tree 9ee0631673a83e6a59448873ab93b90311d8d88b (from c950a3ae200518bea4d98b8f0a993d3bbaafe212) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 12:48:34 2007 +0200 consistent naming please diff --git a/vivified/ui/Makefile.am b/vivified/ui/Makefile.am index 386d6cb..2d492c7 100644 --- a/vivified/ui/Makefile.am +++ b/vivified/ui/Makefile.am @@ -7,7 +7,7 @@ vivified_LDADD = \ $(top_builddir)/vivified/dock/libvivified-dock.la vivified_SOURCES = \ - vivi_commandline.c \ + vivi_command_line.c \ vivi_movie_list.c \ vivi_player.c \ vivi_vivi_docklet.c \ diff --git a/vivified/ui/vivi_command_line.c b/vivified/ui/vivi_command_line.c new file mode 100644 index 0000000..4377830 --- /dev/null +++ b/vivified/ui/vivi_command_line.c @@ -0,0 +1,118 @@ +/* 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 <string.h> +#include "vivi_vivi_docklet.h" + +static void +vivi_command_line_execute (ViviApplication *app, const char *command) +{ + char *run; + + if (!strpbrk (command, ";\"',()[]{}")) { + /* special mode: interpret as space-delimited list: + * first argument is function name, following arguemnts are function arguments + */ + char **args = g_strsplit (command, " ", -1); + GString *str = g_string_new (args[0]); + guint i; + + g_string_append (str, " ("); + for (i = 1; args[i] != NULL; i++) { + if (i > 1) + g_string_append (str, ", "); + g_string_append_c (str, '"'); + g_string_append (str, args[i]); + g_string_append_c (str, '"'); + } + g_string_append (str, ");"); + run = g_string_free (str, FALSE); + } else { + run = (char *) command; + } + + + vivi_application_execute (app, run); + if (command != run) + g_free (run); +} + +void +vivi_command_line_activate (GtkEntry *entry, ViviApplication *app); +void +vivi_command_line_activate (GtkEntry *entry, ViviApplication *app) +{ + const char *text = gtk_entry_get_text (entry); + + if (text[0] == '\0') + return; + + vivi_command_line_execute (app, text); + gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1); +} + +static void +vivi_command_line_append_message (ViviApplication *app, guint type, const char *message, GtkTextView *view) +{ + GtkTextBuffer *buffer = gtk_text_view_get_buffer (view); + GtkTextIter iter; + GtkTextMark *mark; + const char *tag_names[] = { "input", "output", "error" }; + + gtk_text_buffer_get_end_iter (buffer, &iter); + mark = gtk_text_buffer_get_mark (buffer, "end"); + if (mark == NULL) + mark = gtk_text_buffer_create_mark (buffer, "end", &iter, FALSE); + if (gtk_text_buffer_get_char_count (buffer) > 0) + gtk_text_buffer_insert (buffer, &iter, "\n", 1); + gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, message, -1, tag_names[type], NULL); + gtk_text_view_scroll_to_mark (view, mark, 0.0, TRUE, 0.0, 0.0); +} + +void +vivi_command_line_application_unset (ViviViviDocklet *docklet, ViviApplication *app); +void +vivi_command_line_application_unset (ViviViviDocklet *docklet, ViviApplication *app) +{ + GtkWidget *view = vivi_vivi_docklet_find_widget_by_type (docklet, GTK_TYPE_TEXT_VIEW); + + g_signal_handlers_disconnect_by_func (app, vivi_command_line_append_message, view); +} + +void +vivi_command_line_application_set (ViviViviDocklet *docklet, ViviApplication *app); +void +vivi_command_line_application_set (ViviViviDocklet *docklet, ViviApplication *app) +{ + GtkWidget *view = vivi_vivi_docklet_find_widget_by_type (docklet, GTK_TYPE_TEXT_VIEW); + + gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), + "error", "foreground", "red", "left-margin", 15, NULL); + gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), + "input", "foreground", "dark grey", NULL); + gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), + "output", "left-margin", 15, NULL); + + g_signal_connect (app, "message", G_CALLBACK (vivi_command_line_append_message), view); +} + diff --git a/vivified/ui/vivi_commandline.c b/vivified/ui/vivi_commandline.c deleted file mode 100644 index 4377830..0000000 --- a/vivified/ui/vivi_commandline.c +++ /dev/null @@ -1,118 +0,0 @@ -/* 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 <string.h> -#include "vivi_vivi_docklet.h" - -static void -vivi_command_line_execute (ViviApplication *app, const char *command) -{ - char *run; - - if (!strpbrk (command, ";\"',()[]{}")) { - /* special mode: interpret as space-delimited list: - * first argument is function name, following arguemnts are function arguments - */ - char **args = g_strsplit (command, " ", -1); - GString *str = g_string_new (args[0]); - guint i; - - g_string_append (str, " ("); - for (i = 1; args[i] != NULL; i++) { - if (i > 1) - g_string_append (str, ", "); - g_string_append_c (str, '"'); - g_string_append (str, args[i]); - g_string_append_c (str, '"'); - } - g_string_append (str, ");"); - run = g_string_free (str, FALSE); - } else { - run = (char *) command; - } - - - vivi_application_execute (app, run); - if (command != run) - g_free (run); -} - -void -vivi_command_line_activate (GtkEntry *entry, ViviApplication *app); -void -vivi_command_line_activate (GtkEntry *entry, ViviApplication *app) -{ - const char *text = gtk_entry_get_text (entry); - - if (text[0] == '\0') - return; - - vivi_command_line_execute (app, text); - gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1); -} - -static void -vivi_command_line_append_message (ViviApplication *app, guint type, const char *message, GtkTextView *view) -{ - GtkTextBuffer *buffer = gtk_text_view_get_buffer (view); - GtkTextIter iter; - GtkTextMark *mark; - const char *tag_names[] = { "input", "output", "error" }; - - gtk_text_buffer_get_end_iter (buffer, &iter); - mark = gtk_text_buffer_get_mark (buffer, "end"); - if (mark == NULL) - mark = gtk_text_buffer_create_mark (buffer, "end", &iter, FALSE); - if (gtk_text_buffer_get_char_count (buffer) > 0) - gtk_text_buffer_insert (buffer, &iter, "\n", 1); - gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, message, -1, tag_names[type], NULL); - gtk_text_view_scroll_to_mark (view, mark, 0.0, TRUE, 0.0, 0.0); -} - -void -vivi_command_line_application_unset (ViviViviDocklet *docklet, ViviApplication *app); -void -vivi_command_line_application_unset (ViviViviDocklet *docklet, ViviApplication *app) -{ - GtkWidget *view = vivi_vivi_docklet_find_widget_by_type (docklet, GTK_TYPE_TEXT_VIEW); - - g_signal_handlers_disconnect_by_func (app, vivi_command_line_append_message, view); -} - -void -vivi_command_line_application_set (ViviViviDocklet *docklet, ViviApplication *app); -void -vivi_command_line_application_set (ViviViviDocklet *docklet, ViviApplication *app) -{ - GtkWidget *view = vivi_vivi_docklet_find_widget_by_type (docklet, GTK_TYPE_TEXT_VIEW); - - gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), - "error", "foreground", "red", "left-margin", 15, NULL); - gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), - "input", "foreground", "dark grey", NULL); - gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), - "output", "left-margin", 15, NULL); - - g_signal_connect (app, "message", G_CALLBACK (vivi_command_line_append_message), view); -} - diff-tree c950a3ae200518bea4d98b8f0a993d3bbaafe212 (from 688a8514a7bb646b3417b71c37f99472793090d4) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 12:48:03 2007 +0200 missed the title diff --git a/vivified/ui/vivi_command_line.xml b/vivified/ui/vivi_command_line.xml index e1829da..5a4b2fb 100644 --- a/vivified/ui/vivi_command_line.xml +++ b/vivified/ui/vivi_command_line.xml @@ -1,5 +1,6 @@ <interface> <object class="ViviViviDocklet" id="command-line"> + <property name="title">Command Line</property> <signal name="application-set" handler="vivi_command_line_application_set" /> <signal name="application-unset" handler="vivi_command_line_application_unset" /> <child> diff-tree 688a8514a7bb646b3417b71c37f99472793090d4 (from 1bb42f2089e1c0530e34c060b8e90310f682a849) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 12:47:17 2007 +0200 xml-ify the command line widget diff --git a/vivified/ui/Makefile.am b/vivified/ui/Makefile.am index 147c0cb..386d6cb 100644 --- a/vivified/ui/Makefile.am +++ b/vivified/ui/Makefile.am @@ -14,7 +14,6 @@ vivified_SOURCES = \ main.c noinst_HEADERS = \ - vivi_commandline.h \ vivi_movie_list.h \ vivi_vivi_docklet.h diff --git a/vivified/ui/main.c b/vivified/ui/main.c index e6fb346..8ca2e4b 100644 --- a/vivified/ui/main.c +++ b/vivified/ui/main.c @@ -25,7 +25,6 @@ #include <libswfdec-gtk/swfdec-gtk.h> #include "vivified/core/vivified-core.h" #include "vivified/dock/vivified-dock.h" -#include "vivi_commandline.h" static void try_grab_focus (GtkWidget *widget, gpointer unused) @@ -69,7 +68,8 @@ setup (const char *filename, const char vivi_application_set_variables (app, variables); builder = gtk_builder_new (); - if (!gtk_builder_add_from_file (builder, "vivi_player.xml", &error)) + if (!gtk_builder_add_from_file (builder, "vivi_player.xml", &error) || + !gtk_builder_add_from_file (builder, "vivi_command_line.xml", &error)) g_error ("%s", error->message); gtk_builder_connect_signals (builder, app); @@ -83,7 +83,8 @@ setup (const char *filename, const char widget = GTK_WIDGET (gtk_builder_get_object (builder, "player")); g_object_set (widget, "application", app, NULL); vivi_vdock_add (VIVI_VDOCK (box), widget); - widget = vivi_command_line_new (app); + widget = GTK_WIDGET (gtk_builder_get_object (builder, "command-line")); + g_object_set (widget, "application", app, NULL); vivi_vdock_add (VIVI_VDOCK (box), widget); gtk_container_foreach (GTK_CONTAINER (widget), try_grab_focus, NULL); diff --git a/vivified/ui/vivi_command_line.xml b/vivified/ui/vivi_command_line.xml new file mode 100644 index 0000000..e1829da --- /dev/null +++ b/vivified/ui/vivi_command_line.xml @@ -0,0 +1,37 @@ +<interface> + <object class="ViviViviDocklet" id="command-line"> + <signal name="application-set" handler="vivi_command_line_application_set" /> + <signal name="application-unset" handler="vivi_command_line_application_unset" /> + <child> + <object class="GtkVBox" id="box"> + <child> + <object class="GtkScrolledWindow" id="scroll"> + <property name="hscrollbar-policy">automatic</property> + <property name="vscrollbar-policy">automatic</property> + <child> + <object class="GtkTextView" id="text"> + <property name="editable">false</property> + <property name="wrap-mode">word-char</property> + </object> + </child> + </object> + <packing> + <property name="pack-type">start</property> + <property name="expand">true</property> + <property name="fill">true</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="entry"> + <signal name="activate" handler="vivi_command_line_activate" /> + </object> + <packing> + <property name="pack-type">end</property> + <property name="expand">false</property> + <property name="fill">true</property> + </packing> + </child> + </object> + </child> + </object> +</interface> diff --git a/vivified/ui/vivi_commandline.c b/vivified/ui/vivi_commandline.c index 555e922..4377830 100644 --- a/vivified/ui/vivi_commandline.c +++ b/vivified/ui/vivi_commandline.c @@ -22,48 +22,10 @@ #endif #include <string.h> -#include "vivi_commandline.h" - -G_DEFINE_TYPE (ViviCommandLine, vivi_command_line, VIVI_TYPE_DOCKLET) - -static void -vivi_command_line_append_message (ViviApplication *app, guint type, const char *message, GtkTextView *view) -{ - GtkTextBuffer *buffer = gtk_text_view_get_buffer (view); - GtkTextIter iter; - GtkTextMark *mark; - const char *tag_names[] = { "input", "output", "error" }; - - gtk_text_buffer_get_end_iter (buffer, &iter); - mark = gtk_text_buffer_get_mark (buffer, "end"); - if (mark == NULL) - mark = gtk_text_buffer_create_mark (buffer, "end", &iter, FALSE); - if (gtk_text_buffer_get_char_count (buffer) > 0) - gtk_text_buffer_insert (buffer, &iter, "\n", 1); - gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, message, -1, tag_names[type], NULL); - gtk_text_view_scroll_to_mark (view, mark, 0.0, TRUE, 0.0, 0.0); -} - -static void -vivi_command_line_dispose (GObject *object) -{ - ViviCommandLine *cl = VIVI_COMMAND_LINE (object); - - g_signal_handlers_disconnect_by_func (cl->app, vivi_command_line_append_message, cl->view); - - G_OBJECT_CLASS (vivi_command_line_parent_class)->dispose (object); -} - -static void -vivi_command_line_class_init (ViviCommandLineClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = vivi_command_line_dispose; -} +#include "vivi_vivi_docklet.h" static void -vivi_command_line_execute (ViviCommandLine *cl, const char *command) +vivi_command_line_execute (ViviApplication *app, const char *command) { char *run; @@ -90,61 +52,67 @@ vivi_command_line_execute (ViviCommandLi } - vivi_application_execute (cl->app, run); + vivi_application_execute (app, run); if (command != run) g_free (run); } -static void -command_line_entry_activate_cb (GtkEntry *entry, ViviCommandLine *command_line) +void +vivi_command_line_activate (GtkEntry *entry, ViviApplication *app); +void +vivi_command_line_activate (GtkEntry *entry, ViviApplication *app) { const char *text = gtk_entry_get_text (entry); if (text[0] == '\0') return; - vivi_command_line_execute (command_line, text); + vivi_command_line_execute (app, text); gtk_editable_select_region (GTK_EDITABLE (entry), 0, -1); } static void -vivi_command_line_init (ViviCommandLine *cl) +vivi_command_line_append_message (ViviApplication *app, guint type, const char *message, GtkTextView *view) { - GtkWidget *box, *widget, *scroll; + GtkTextBuffer *buffer = gtk_text_view_get_buffer (view); + GtkTextIter iter; + GtkTextMark *mark; + const char *tag_names[] = { "input", "output", "error" }; - box = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (cl), box); - /* the text entry */ - widget = gtk_entry_new (); - g_signal_connect (widget, "activate", G_CALLBACK (command_line_entry_activate_cb), cl); - gtk_box_pack_end (GTK_BOX (box), widget, FALSE, TRUE, 0); - /* the text view for outputting messages */ - scroll = gtk_scrolled_window_new (NULL, NULL); - gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_box_pack_start (GTK_BOX (box), scroll, TRUE, TRUE, 0); - cl->view = gtk_text_view_new (); - gtk_text_view_set_editable (GTK_TEXT_VIEW (cl->view), FALSE); - gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (cl->view), GTK_WRAP_WORD_CHAR); - gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (cl->view)), - "error", "foreground", "red", "left-margin", 15, NULL); - gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (cl->view)), - "input", "foreground", "dark grey", NULL); - gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (cl->view)), - "output", "left-margin", 15, NULL); - gtk_container_add (GTK_CONTAINER (scroll), cl->view); + gtk_text_buffer_get_end_iter (buffer, &iter); + mark = gtk_text_buffer_get_mark (buffer, "end"); + if (mark == NULL) + mark = gtk_text_buffer_create_mark (buffer, "end", &iter, FALSE); + if (gtk_text_buffer_get_char_count (buffer) > 0) + gtk_text_buffer_insert (buffer, &iter, "\n", 1); + gtk_text_buffer_insert_with_tags_by_name (buffer, &iter, message, -1, tag_names[type], NULL); + gtk_text_view_scroll_to_mark (view, mark, 0.0, TRUE, 0.0, 0.0); +} - gtk_widget_show_all (box); +void +vivi_command_line_application_unset (ViviViviDocklet *docklet, ViviApplication *app); +void +vivi_command_line_application_unset (ViviViviDocklet *docklet, ViviApplication *app) +{ + GtkWidget *view = vivi_vivi_docklet_find_widget_by_type (docklet, GTK_TYPE_TEXT_VIEW); + + g_signal_handlers_disconnect_by_func (app, vivi_command_line_append_message, view); } -GtkWidget * -vivi_command_line_new (ViviApplication *app) +void +vivi_command_line_application_set (ViviViviDocklet *docklet, ViviApplication *app); +void +vivi_command_line_application_set (ViviViviDocklet *docklet, ViviApplication *app) { - ViviCommandLine *cl; + GtkWidget *view = vivi_vivi_docklet_find_widget_by_type (docklet, GTK_TYPE_TEXT_VIEW); + + gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), + "error", "foreground", "red", "left-margin", 15, NULL); + gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), + "input", "foreground", "dark grey", NULL); + gtk_text_buffer_create_tag (gtk_text_view_get_buffer (GTK_TEXT_VIEW (view)), + "output", "left-margin", 15, NULL); - cl = g_object_new (VIVI_TYPE_COMMAND_LINE, "title", "Command Line", NULL); - cl->app = app; - g_signal_connect (cl->app, "message", G_CALLBACK (vivi_command_line_append_message), cl->view); - return GTK_WIDGET (cl); + g_signal_connect (app, "message", G_CALLBACK (vivi_command_line_append_message), view); } diff --git a/vivified/ui/vivi_commandline.h b/vivified/ui/vivi_commandline.h deleted file mode 100644 index 96e5924..0000000 --- a/vivified/ui/vivi_commandline.h +++ /dev/null @@ -1,57 +0,0 @@ -/* 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_COMMAND_LINE_H_ -#define _VIVI_COMMAND_LINE_H_ - -#include <vivified/core/vivified-core.h> -#include <vivified/dock/vivified-dock.h> - -G_BEGIN_DECLS - - -typedef struct _ViviCommandLine ViviCommandLine; -typedef struct _ViviCommandLineClass ViviCommandLineClass; - -#define VIVI_TYPE_COMMAND_LINE (vivi_command_line_get_type()) -#define VIVI_IS_COMMAND_LINE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIVI_TYPE_COMMAND_LINE)) -#define VIVI_IS_COMMAND_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIVI_TYPE_COMMAND_LINE)) -#define VIVI_COMMAND_LINE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIVI_TYPE_COMMAND_LINE, ViviCommandLine)) -#define VIVI_COMMAND_LINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIVI_TYPE_COMMAND_LINE, ViviCommandLineClass)) -#define VIVI_COMMAND_LINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIVI_TYPE_COMMAND_LINE, ViviCommandLineClass)) - -struct _ViviCommandLine { - ViviDocklet docklet; - - ViviApplication * app; /* the application we connect to */ - GtkWidget * view; /* text view for outputting stuff to */ -}; - -struct _ViviCommandLineClass -{ - ViviDockletClass docklet_class; -}; - -GType vivi_command_line_get_type (void); - -GtkWidget * vivi_command_line_new (ViviApplication * app); - - -G_END_DECLS -#endif diff-tree 1bb42f2089e1c0530e34c060b8e90310f682a849 (from ab10b3c5c72a4e04b5f27027f90f58023d0a3594) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 12:44:15 2007 +0200 add find_widget function to ViviViviDocklet diff --git a/vivified/ui/vivi_player.c b/vivified/ui/vivi_player.c index 876eb77..6fcfee2 100644 --- a/vivified/ui/vivi_player.c +++ b/vivified/ui/vivi_player.c @@ -25,18 +25,6 @@ #include "vivi_vivi_docklet.h" static void -find_player (GtkWidget *widget, gpointer result) -{ - if (SWFDEC_IS_GTK_WIDGET (widget)) { - *(gpointer *) result = widget; - return; - } - - if (GTK_IS_CONTAINER (widget)) - gtk_container_foreach (GTK_CONTAINER (widget), find_player, result); -} - -static void vivi_player_notify_app (ViviApplication *app, GParamSpec *pspec, SwfdecGtkWidget *player) { if (g_str_equal (pspec->name, "player")) { @@ -51,13 +39,11 @@ vivi_player_application_set (ViviViviDoc void vivi_player_application_set (ViviViviDocklet *docklet, ViviApplication *app) { - SwfdecGtkPlayer *player = NULL; + SwfdecGtkWidget *widget = SWFDEC_GTK_WIDGET (vivi_vivi_docklet_find_widget_by_type (docklet, SWFDEC_TYPE_GTK_WIDGET)); - find_player (GTK_WIDGET (docklet), &player); - - g_signal_connect (app, "notify", G_CALLBACK (vivi_player_notify_app), player); - swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (player), vivi_application_get_player (app)); - swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (player), !vivi_application_get_interrupted (app)); + g_signal_connect (app, "notify", G_CALLBACK (vivi_player_notify_app), widget); + swfdec_gtk_widget_set_player (widget, vivi_application_get_player (app)); + swfdec_gtk_widget_set_interactive (widget, !vivi_application_get_interrupted (app)); } void @@ -65,10 +51,8 @@ vivi_player_application_unset (ViviViviD void vivi_player_application_unset (ViviViviDocklet *docklet, ViviApplication *app) { - SwfdecGtkPlayer *player = NULL; - - find_player (GTK_WIDGET (docklet), &player); + SwfdecGtkWidget *widget = SWFDEC_GTK_WIDGET (vivi_vivi_docklet_find_widget_by_type (docklet, SWFDEC_TYPE_GTK_WIDGET)); - g_signal_handlers_disconnect_by_func (app, vivi_player_notify_app, player); + g_signal_handlers_disconnect_by_func (app, vivi_player_notify_app, widget); } diff --git a/vivified/ui/vivi_vivi_docklet.c b/vivified/ui/vivi_vivi_docklet.c index 9daba21..cea4f64 100644 --- a/vivified/ui/vivi_vivi_docklet.c +++ b/vivified/ui/vivi_vivi_docklet.c @@ -114,7 +114,37 @@ vivi_vivi_docklet_class_init (ViviViviDo } static void -vivi_vivi_docklet_init (ViviViviDocklet *vivi_docklet) +vivi_vivi_docklet_init (ViviViviDocklet *docklet) { } +typedef struct { + GtkWidget * result; + GType desired_type; +} FindData; + +static void +find_widget (GtkWidget *widget, gpointer datap) +{ + FindData *data = datap; + + if (G_TYPE_CHECK_INSTANCE_TYPE (widget, data->desired_type)) { + data->result = widget; + return; + } + if (GTK_IS_CONTAINER (widget)) + gtk_container_foreach (GTK_CONTAINER (widget), find_widget, data); +} + +GtkWidget * +vivi_vivi_docklet_find_widget_by_type (ViviViviDocklet *docklet, GType type) +{ + FindData data = { NULL, }; + + g_return_val_if_fail (VIVI_IS_VIVI_DOCKLET (docklet), NULL); + g_return_val_if_fail (g_type_is_a (type, GTK_TYPE_WIDGET), NULL); + + data.desired_type = type; + gtk_container_foreach (GTK_CONTAINER (docklet), find_widget, &data); + return data.result; +} diff --git a/vivified/ui/vivi_vivi_docklet.h b/vivified/ui/vivi_vivi_docklet.h index 108b531..8142ae1 100644 --- a/vivified/ui/vivi_vivi_docklet.h +++ b/vivified/ui/vivi_vivi_docklet.h @@ -54,6 +54,9 @@ struct _ViviViviDockletClass GType vivi_vivi_docklet_get_type (void); +GtkWidget * vivi_vivi_docklet_find_widget_by_type + (ViviViviDocklet * docklet, + GType type); G_END_DECLS #endif diff-tree ab10b3c5c72a4e04b5f27027f90f58023d0a3594 (from abde6f7e4fb033f3c13f204a5de24aeb22f30854) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 12:12:06 2007 +0200 use the application as default data when connecting signals diff --git a/vivified/ui/main.c b/vivified/ui/main.c index 1d57fa8..e6fb346 100644 --- a/vivified/ui/main.c +++ b/vivified/ui/main.c @@ -71,7 +71,7 @@ setup (const char *filename, const char builder = gtk_builder_new (); if (!gtk_builder_add_from_file (builder, "vivi_player.xml", &error)) g_error ("%s", error->message); - gtk_builder_connect_signals (builder, NULL); + gtk_builder_connect_signals (builder, app); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (window), 400, 450); diff-tree abde6f7e4fb033f3c13f204a5de24aeb22f30854 (from 7bbd6ebee1796e6d396d5b5dfdb99613124fe05a) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 12:03:47 2007 +0200 make vivified use GtkBuilder for its docklets contains a port of the player docklet to GtkBuilder diff --git a/configure.ac b/configure.ac index 63a0bde..b1e81b0 100644 --- a/configure.ac +++ b/configure.ac @@ -272,11 +272,12 @@ AC_ARG_ENABLE(vivified, if test "$enable_vivi" = "yes"; then AM_PROG_AS MING_REQUIRED=0.4.0.beta5 - PKG_CHECK_MODULES(VIVI, libming >= $MING_REQUIRED, HAVE_VIVI=yes, HAVE_VIVI=no) + VIVI_GTK_REQUIRED=2.11.6 + PKG_CHECK_MODULES(VIVI, libming >= $MING_REQUIRED gmodule-export-2.0 gtk+-2.0 >= $VIVI_GTK_REQUIRED, HAVE_VIVI=yes, HAVE_VIVI=no) if test "x$HAVE_VIVI" = xyes; then AC_DEFINE(HAVE_VIVI, 1, [Define if Vivified is enabled]) else - AC_MSG_ERROR([Vivified requirements not met. You need at libming >= $MING_REQUIRED.]) + AC_MSG_ERROR([Vivified requirements not met. You need libming >= $MING_REQUIRED and Gtk+ >= $VIVI_GTK_REQUIRED.]) fi else AC_MSG_WARN([*** Vivified was not enabled. ***]) diff --git a/vivified/ui/Makefile.am b/vivified/ui/Makefile.am index d6dad12..147c0cb 100644 --- a/vivified/ui/Makefile.am +++ b/vivified/ui/Makefile.am @@ -1,7 +1,7 @@ noinst_PROGRAMS = vivified -vivified_CFLAGS = $(GLOBAL_CFLAGS) $(SWFDEC_GTK_CFLAGS) -vivified_LDFLAGS = $(SWFDEC_GTK_LIBS) +vivified_CFLAGS = $(GLOBAL_CFLAGS) $(VIVI_CFLAGS) +vivified_LDFLAGS = $(VIVI_LIBS) vivified_LDADD = \ $(top_builddir)/vivified/core/libvivified-core.la \ $(top_builddir)/vivified/dock/libvivified-dock.la @@ -16,6 +16,5 @@ vivified_SOURCES = \ noinst_HEADERS = \ vivi_commandline.h \ vivi_movie_list.h \ - vivi_player.h \ vivi_vivi_docklet.h diff --git a/vivified/ui/main.c b/vivified/ui/main.c index fe4b35c..1d57fa8 100644 --- a/vivified/ui/main.c +++ b/vivified/ui/main.c @@ -26,7 +26,6 @@ #include "vivified/core/vivified-core.h" #include "vivified/dock/vivified-dock.h" #include "vivi_commandline.h" -#include "vivi_player.h" static void try_grab_focus (GtkWidget *widget, gpointer unused) @@ -62,10 +61,18 @@ setup (const char *filename, const char { GtkWidget *window, *box, *widget; ViviApplication *app; + GtkBuilder *builder; + GError *error = NULL; app = vivi_application_new (); vivi_application_set_filename (app, filename); vivi_application_set_variables (app, variables); + + builder = gtk_builder_new (); + if (!gtk_builder_add_from_file (builder, "vivi_player.xml", &error)) + g_error ("%s", error->message); + gtk_builder_connect_signals (builder, NULL); + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size (GTK_WINDOW (window), 400, 450); g_signal_connect_swapped (app, "notify::quit", G_CALLBACK (gtk_widget_destroy), window); @@ -73,7 +80,8 @@ setup (const char *filename, const char set_title (app, NULL, GTK_WINDOW (window)); box = vivi_vdock_new (); gtk_container_add (GTK_CONTAINER (window), box); - widget = vivi_player_new (app); + widget = GTK_WIDGET (gtk_builder_get_object (builder, "player")); + g_object_set (widget, "application", app, NULL); vivi_vdock_add (VIVI_VDOCK (box), widget); widget = vivi_command_line_new (app); vivi_vdock_add (VIVI_VDOCK (box), widget); @@ -82,6 +90,7 @@ setup (const char *filename, const char g_signal_connect (window, "delete-event", G_CALLBACK (delete_event), app); g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), app); gtk_widget_show_all (window); + g_object_unref (builder); } int diff --git a/vivified/ui/vivi_player.c b/vivified/ui/vivi_player.c index 4732d68..876eb77 100644 --- a/vivified/ui/vivi_player.c +++ b/vivified/ui/vivi_player.c @@ -21,10 +21,8 @@ #include "config.h" #endif -#include "vivi_player.h" #include <libswfdec-gtk/swfdec-gtk.h> - -G_DEFINE_TYPE (ViviPlayer, vivi_player, VIVI_TYPE_VIVI_DOCKLET) +#include "vivi_vivi_docklet.h" static void find_player (GtkWidget *widget, gpointer result) @@ -48,7 +46,9 @@ vivi_player_notify_app (ViviApplication } } -static void +void +vivi_player_application_set (ViviViviDocklet *docklet, ViviApplication *app); +void vivi_player_application_set (ViviViviDocklet *docklet, ViviApplication *app) { SwfdecGtkPlayer *player = NULL; @@ -60,7 +60,9 @@ vivi_player_application_set (ViviViviDoc swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (player), !vivi_application_get_interrupted (app)); } -static void +void +vivi_player_application_unset (ViviViviDocklet *docklet, ViviApplication *app); +void vivi_player_application_unset (ViviViviDocklet *docklet, ViviApplication *app) { SwfdecGtkPlayer *player = NULL; @@ -70,32 +72,3 @@ vivi_player_application_unset (ViviViviD g_signal_handlers_disconnect_by_func (app, vivi_player_notify_app, player); } -static void -vivi_player_class_init (ViviPlayerClass *klass) -{ - ViviViviDockletClass *vivi_docklet_class = VIVI_VIVI_DOCKLET_CLASS (klass); - - vivi_docklet_class->application_set = vivi_player_application_set; - vivi_docklet_class->application_unset = vivi_player_application_unset; -} - -static void -vivi_player_init (ViviPlayer *player) -{ - GtkWidget *box, *widget; - - box = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); - gtk_container_add (GTK_CONTAINER (player), box); - /* the player */ - widget = swfdec_gtk_widget_new (NULL); - gtk_container_add (GTK_CONTAINER (box), widget); - - gtk_widget_show_all (box); -} - -GtkWidget * -vivi_player_new (ViviApplication *app) -{ - return g_object_new (VIVI_TYPE_PLAYER, "title", "Player", "application", app, NULL); -} - diff --git a/vivified/ui/vivi_player.h b/vivified/ui/vivi_player.h deleted file mode 100644 index c2aa1dd..0000000 --- a/vivified/ui/vivi_player.h +++ /dev/null @@ -1,55 +0,0 @@ -/* 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_PLAYER_H_ -#define _VIVI_PLAYER_H_ - -#include <vivified/core/vivified-core.h> -#include <vivified/dock/vivified-dock.h> -#include <vivified/ui/vivi_vivi_docklet.h> - -G_BEGIN_DECLS - - -typedef struct _ViviPlayer ViviPlayer; -typedef struct _ViviPlayerClass ViviPlayerClass; - -#define VIVI_TYPE_PLAYER (vivi_player_get_type()) -#define VIVI_IS_PLAYER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIVI_TYPE_PLAYER)) -#define VIVI_IS_PLAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIVI_TYPE_PLAYER)) -#define VIVI_PLAYER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIVI_TYPE_PLAYER, ViviPlayer)) -#define VIVI_PLAYER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIVI_TYPE_PLAYER, ViviPlayerClass)) -#define VIVI_PLAYER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIVI_TYPE_PLAYER, ViviPlayerClass)) - -struct _ViviPlayer { - ViviViviDocklet docklet; -}; - -struct _ViviPlayerClass -{ - ViviViviDockletClass docklet_class; -}; - -GType vivi_player_get_type (void); - -GtkWidget * vivi_player_new (ViviApplication * app); - - -G_END_DECLS -#endif diff --git a/vivified/ui/vivi_player.xml b/vivified/ui/vivi_player.xml new file mode 100644 index 0000000..bb1c630 --- /dev/null +++ b/vivified/ui/vivi_player.xml @@ -0,0 +1,17 @@ +<interface> + <object class="ViviViviDocklet" id="player"> + <property name="title">Player</property> + <signal name="application-set" handler="vivi_player_application_set" /> + <signal name="application-unset" handler="vivi_player_application_unset" /> + <child> + <object class="GtkAlignment" id="1"> + <property name="xscale">0.0</property> + <property name="yscale">0.0</property> + <child> + <object class="SwfdecGtkWidget" id="2"> + </object> + </child> + </object> + </child> + </object> +</interface> diff --git a/vivified/ui/vivi_vivi_docklet.c b/vivified/ui/vivi_vivi_docklet.c index ddc9d23..9daba21 100644 --- a/vivified/ui/vivi_vivi_docklet.c +++ b/vivified/ui/vivi_vivi_docklet.c @@ -34,7 +34,7 @@ enum { LAST_SIGNAL }; -G_DEFINE_ABSTRACT_TYPE (ViviViviDocklet, vivi_vivi_docklet, VIVI_TYPE_DOCKLET) +G_DEFINE_TYPE (ViviViviDocklet, vivi_vivi_docklet, VIVI_TYPE_DOCKLET) guint signals[LAST_SIGNAL]; static void diff-tree 7bbd6ebee1796e6d396d5b5dfdb99613124fe05a (from 0b05aebbce303392692d38bd8b6cde457f228a6e) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 10:45:48 2007 +0200 compute player widget dynamically diff --git a/vivified/ui/vivi_player.c b/vivified/ui/vivi_player.c index ecff252..4732d68 100644 --- a/vivified/ui/vivi_player.c +++ b/vivified/ui/vivi_player.c @@ -27,29 +27,47 @@ G_DEFINE_TYPE (ViviPlayer, vivi_player, VIVI_TYPE_VIVI_DOCKLET) static void -vivi_player_notify_app (ViviApplication *app, GParamSpec *pspec, ViviPlayer *player) +find_player (GtkWidget *widget, gpointer result) +{ + if (SWFDEC_IS_GTK_WIDGET (widget)) { + *(gpointer *) result = widget; + return; + } + + if (GTK_IS_CONTAINER (widget)) + gtk_container_foreach (GTK_CONTAINER (widget), find_player, result); +} + +static void +vivi_player_notify_app (ViviApplication *app, GParamSpec *pspec, SwfdecGtkWidget *player) { if (g_str_equal (pspec->name, "player")) { - swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (player->player), vivi_application_get_player (app)); + swfdec_gtk_widget_set_player (player, vivi_application_get_player (app)); } else if (g_str_equal (pspec->name, "interrupted")) { - swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (player->player), - !vivi_application_get_interrupted (app)); + swfdec_gtk_widget_set_interactive (player, !vivi_application_get_interrupted (app)); } } static void vivi_player_application_set (ViviViviDocklet *docklet, ViviApplication *app) { - ViviPlayer *player = VIVI_PLAYER (docklet); + SwfdecGtkPlayer *player = NULL; + + find_player (GTK_WIDGET (docklet), &player); g_signal_connect (app, "notify", G_CALLBACK (vivi_player_notify_app), player); - swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (player->player), vivi_application_get_player (app)); + swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (player), vivi_application_get_player (app)); + swfdec_gtk_widget_set_interactive (SWFDEC_GTK_WIDGET (player), !vivi_application_get_interrupted (app)); } static void vivi_player_application_unset (ViviViviDocklet *docklet, ViviApplication *app) { - g_signal_handlers_disconnect_by_func (app, vivi_player_notify_app, docklet); + SwfdecGtkPlayer *player = NULL; + + find_player (GTK_WIDGET (docklet), &player); + + g_signal_handlers_disconnect_by_func (app, vivi_player_notify_app, player); } static void @@ -64,13 +82,13 @@ vivi_player_class_init (ViviPlayerClass static void vivi_player_init (ViviPlayer *player) { - GtkWidget *box; + GtkWidget *box, *widget; box = gtk_alignment_new (0.5, 0.5, 0.0, 0.0); gtk_container_add (GTK_CONTAINER (player), box); /* the player */ - player->player = swfdec_gtk_widget_new (NULL); - gtk_container_add (GTK_CONTAINER (box), player->player); + widget = swfdec_gtk_widget_new (NULL); + gtk_container_add (GTK_CONTAINER (box), widget); gtk_widget_show_all (box); } diff --git a/vivified/ui/vivi_player.h b/vivified/ui/vivi_player.h index af3d9dc..c2aa1dd 100644 --- a/vivified/ui/vivi_player.h +++ b/vivified/ui/vivi_player.h @@ -39,8 +39,6 @@ typedef struct _ViviPlayerClass ViviPlay struct _ViviPlayer { ViviViviDocklet docklet; - - GtkWidget * player; /* SwfdecGtkWidget */ }; struct _ViviPlayerClass diff-tree 0b05aebbce303392692d38bd8b6cde457f228a6e (from bc5a502e867c9a508fc2cb3795000ccb1298dea0) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 10:36:42 2007 +0200 make application_(un)set signals diff --git a/vivified/ui/vivi_player.c b/vivified/ui/vivi_player.c index 0785023..ecff252 100644 --- a/vivified/ui/vivi_player.c +++ b/vivified/ui/vivi_player.c @@ -38,7 +38,7 @@ vivi_player_notify_app (ViviApplication } static void -vivi_player_set_app (ViviViviDocklet *docklet, ViviApplication *app) +vivi_player_application_set (ViviViviDocklet *docklet, ViviApplication *app) { ViviPlayer *player = VIVI_PLAYER (docklet); @@ -47,7 +47,7 @@ vivi_player_set_app (ViviViviDocklet *do } static void -vivi_player_unset_app (ViviViviDocklet *docklet, ViviApplication *app) +vivi_player_application_unset (ViviViviDocklet *docklet, ViviApplication *app) { g_signal_handlers_disconnect_by_func (app, vivi_player_notify_app, docklet); } @@ -57,8 +57,8 @@ vivi_player_class_init (ViviPlayerClass { ViviViviDockletClass *vivi_docklet_class = VIVI_VIVI_DOCKLET_CLASS (klass); - vivi_docklet_class->set_app = vivi_player_set_app; - vivi_docklet_class->unset_app = vivi_player_unset_app; + vivi_docklet_class->application_set = vivi_player_application_set; + vivi_docklet_class->application_unset = vivi_player_application_unset; } static void diff --git a/vivified/ui/vivi_vivi_docklet.c b/vivified/ui/vivi_vivi_docklet.c index 1670ea6..ddc9d23 100644 --- a/vivified/ui/vivi_vivi_docklet.c +++ b/vivified/ui/vivi_vivi_docklet.c @@ -28,7 +28,14 @@ enum { PROP_APP }; +enum { + APPLICATION_SET, + APPLICATION_UNSET, + LAST_SIGNAL +}; + G_DEFINE_ABSTRACT_TYPE (ViviViviDocklet, vivi_vivi_docklet, VIVI_TYPE_DOCKLET) +guint signals[LAST_SIGNAL]; static void vivi_vivi_docklet_get_property (GObject *object, guint param_id, GValue *value, @@ -51,14 +58,17 @@ vivi_vivi_docklet_set_property (GObject GParamSpec *pspec) { ViviViviDocklet *docklet = VIVI_VIVI_DOCKLET (object); - ViviViviDockletClass *klass; switch (param_id) { case PROP_APP: + if (docklet->app) { + g_signal_emit (docklet, signals[APPLICATION_UNSET], 0, docklet->app); + g_object_unref (docklet->app); + } docklet->app = g_value_dup_object (value); - klass = VIVI_VIVI_DOCKLET_GET_CLASS (docklet); - if (klass->set_app) - klass->set_app (docklet, docklet->app); + if (docklet->app) { + g_signal_emit (docklet, signals[APPLICATION_SET], 0, docklet->app); + } break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); @@ -70,12 +80,12 @@ static void vivi_vivi_docklet_dispose (GObject *object) { ViviViviDocklet *docklet = VIVI_VIVI_DOCKLET (object); - ViviViviDockletClass *klass; - klass = VIVI_VIVI_DOCKLET_GET_CLASS (docklet); - if (klass->unset_app) - klass->unset_app (docklet, docklet->app); - g_object_unref (docklet->app); + if (docklet->app) { + g_signal_emit (docklet, signals[APPLICATION_UNSET], 0, docklet->app); + g_object_unref (docklet->app); + docklet->app = NULL; + } G_OBJECT_CLASS (vivi_vivi_docklet_parent_class)->dispose (object); } @@ -91,7 +101,16 @@ vivi_vivi_docklet_class_init (ViviViviDo g_object_class_install_property (object_class, PROP_APP, g_param_spec_object ("application", "application", "application used by this docklet", - VIVI_TYPE_APPLICATION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); + VIVI_TYPE_APPLICATION, G_PARAM_READWRITE)); + + signals[APPLICATION_SET] = g_signal_new ("application-set", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ViviViviDockletClass, application_set), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, VIVI_TYPE_APPLICATION); + signals[APPLICATION_UNSET] = g_signal_new ("application-unset", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET (ViviViviDockletClass, application_unset), + NULL, NULL, g_cclosure_marshal_VOID__OBJECT, + G_TYPE_NONE, 1, VIVI_TYPE_APPLICATION); } static void diff --git a/vivified/ui/vivi_vivi_docklet.h b/vivified/ui/vivi_vivi_docklet.h index 66b1b14..108b531 100644 --- a/vivified/ui/vivi_vivi_docklet.h +++ b/vivified/ui/vivi_vivi_docklet.h @@ -46,9 +46,9 @@ struct _ViviViviDockletClass { ViviDockletClass docklet_class; - void (* set_app) (ViviViviDocklet * docklet, + void (* application_set) (ViviViviDocklet * docklet, ViviApplication * app); - void (* unset_app) (ViviViviDocklet * docklet, + void (* application_unset) (ViviViviDocklet * docklet, ViviApplication * app); }; diff-tree bc5a502e867c9a508fc2cb3795000ccb1298dea0 (from d0b370d01cd37dcaac383206aade7d886cf8f423) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 10:05:45 2007 +0200 add a ViviViviDocklet class that tracks the application and provides easy vfuncs This is used to have easy access to the Application setting and getting Also port ViviPlayer to it diff --git a/vivified/ui/Makefile.am b/vivified/ui/Makefile.am index 3413b4c..d6dad12 100644 --- a/vivified/ui/Makefile.am +++ b/vivified/ui/Makefile.am @@ -10,10 +10,12 @@ vivified_SOURCES = \ vivi_commandline.c \ vivi_movie_list.c \ vivi_player.c \ + vivi_vivi_docklet.c \ main.c noinst_HEADERS = \ vivi_commandline.h \ vivi_movie_list.h \ - vivi_player.h + vivi_player.h \ + vivi_vivi_docklet.h diff --git a/vivified/ui/vivi_player.c b/vivified/ui/vivi_player.c index f54a935..0785023 100644 --- a/vivified/ui/vivi_player.c +++ b/vivified/ui/vivi_player.c @@ -24,7 +24,7 @@ #include "vivi_player.h" #include <libswfdec-gtk/swfdec-gtk.h> -G_DEFINE_TYPE (ViviPlayer, vivi_player, VIVI_TYPE_DOCKLET) +G_DEFINE_TYPE (ViviPlayer, vivi_player, VIVI_TYPE_VIVI_DOCKLET) static void vivi_player_notify_app (ViviApplication *app, GParamSpec *pspec, ViviPlayer *player) @@ -38,21 +38,27 @@ vivi_player_notify_app (ViviApplication } static void -vivi_player_dispose (GObject *object) +vivi_player_set_app (ViviViviDocklet *docklet, ViviApplication *app) { - ViviPlayer *player = VIVI_PLAYER (object); + ViviPlayer *player = VIVI_PLAYER (docklet); - g_signal_handlers_disconnect_by_func (player->app, vivi_player_notify_app, player); + g_signal_connect (app, "notify", G_CALLBACK (vivi_player_notify_app), player); + swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (player->player), vivi_application_get_player (app)); +} - G_OBJECT_CLASS (vivi_player_parent_class)->dispose (object); +static void +vivi_player_unset_app (ViviViviDocklet *docklet, ViviApplication *app) +{ + g_signal_handlers_disconnect_by_func (app, vivi_player_notify_app, docklet); } static void vivi_player_class_init (ViviPlayerClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); + ViviViviDockletClass *vivi_docklet_class = VIVI_VIVI_DOCKLET_CLASS (klass); - object_class->dispose = vivi_player_dispose; + vivi_docklet_class->set_app = vivi_player_set_app; + vivi_docklet_class->unset_app = vivi_player_unset_app; } static void @@ -72,12 +78,6 @@ vivi_player_init (ViviPlayer *player) GtkWidget * vivi_player_new (ViviApplication *app) { - ViviPlayer *player; - - player = g_object_new (VIVI_TYPE_PLAYER, "title", "Player", NULL); - player->app = app; - g_signal_connect (player->app, "notify", G_CALLBACK (vivi_player_notify_app), player); - swfdec_gtk_widget_set_player (SWFDEC_GTK_WIDGET (player->player), vivi_application_get_player (app)); - return GTK_WIDGET (player); + return g_object_new (VIVI_TYPE_PLAYER, "title", "Player", "application", app, NULL); } diff --git a/vivified/ui/vivi_player.h b/vivified/ui/vivi_player.h index 9aa9102..af3d9dc 100644 --- a/vivified/ui/vivi_player.h +++ b/vivified/ui/vivi_player.h @@ -22,6 +22,7 @@ #include <vivified/core/vivified-core.h> #include <vivified/dock/vivified-dock.h> +#include <vivified/ui/vivi_vivi_docklet.h> G_BEGIN_DECLS @@ -37,15 +38,14 @@ typedef struct _ViviPlayerClass ViviPlay #define VIVI_PLAYER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIVI_TYPE_PLAYER, ViviPlayerClass)) struct _ViviPlayer { - ViviDocklet docklet; + ViviViviDocklet docklet; - ViviApplication * app; /* the application we connect to */ GtkWidget * player; /* SwfdecGtkWidget */ }; struct _ViviPlayerClass { - ViviDockletClass docklet_class; + ViviViviDockletClass docklet_class; }; GType vivi_player_get_type (void); diff --git a/vivified/ui/vivi_vivi_docklet.c b/vivified/ui/vivi_vivi_docklet.c new file mode 100644 index 0000000..1670ea6 --- /dev/null +++ b/vivified/ui/vivi_vivi_docklet.c @@ -0,0 +1,101 @@ +/* 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_vivi_docklet.h" + +enum { + PROP_0, + PROP_APP +}; + +G_DEFINE_ABSTRACT_TYPE (ViviViviDocklet, vivi_vivi_docklet, VIVI_TYPE_DOCKLET) + +static void +vivi_vivi_docklet_get_property (GObject *object, guint param_id, GValue *value, + GParamSpec * pspec) +{ + ViviViviDocklet *docklet = VIVI_VIVI_DOCKLET (object); + + switch (param_id) { + case PROP_APP: + g_value_set_object (value, docklet->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +vivi_vivi_docklet_set_property (GObject *object, guint param_id, const GValue *value, + GParamSpec *pspec) +{ + ViviViviDocklet *docklet = VIVI_VIVI_DOCKLET (object); + ViviViviDockletClass *klass; + + switch (param_id) { + case PROP_APP: + docklet->app = g_value_dup_object (value); + klass = VIVI_VIVI_DOCKLET_GET_CLASS (docklet); + if (klass->set_app) + klass->set_app (docklet, docklet->app); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + break; + } +} + +static void +vivi_vivi_docklet_dispose (GObject *object) +{ + ViviViviDocklet *docklet = VIVI_VIVI_DOCKLET (object); + ViviViviDockletClass *klass; + + klass = VIVI_VIVI_DOCKLET_GET_CLASS (docklet); + if (klass->unset_app) + klass->unset_app (docklet, docklet->app); + g_object_unref (docklet->app); + + G_OBJECT_CLASS (vivi_vivi_docklet_parent_class)->dispose (object); +} + +static void +vivi_vivi_docklet_class_init (ViviViviDockletClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + object_class->dispose = vivi_vivi_docklet_dispose; + object_class->get_property = vivi_vivi_docklet_get_property; + object_class->set_property = vivi_vivi_docklet_set_property; + + g_object_class_install_property (object_class, PROP_APP, + g_param_spec_object ("application", "application", "application used by this docklet", + VIVI_TYPE_APPLICATION, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY)); +} + +static void +vivi_vivi_docklet_init (ViviViviDocklet *vivi_docklet) +{ +} + diff --git a/vivified/ui/vivi_vivi_docklet.h b/vivified/ui/vivi_vivi_docklet.h new file mode 100644 index 0000000..66b1b14 --- /dev/null +++ b/vivified/ui/vivi_vivi_docklet.h @@ -0,0 +1,59 @@ +/* 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_VIVI_DOCKLET_H_ +#define _VIVI_VIVI_DOCKLET_H_ + +#include <vivified/core/vivified-core.h> +#include <vivified/dock/vivified-dock.h> + +G_BEGIN_DECLS + + +typedef struct _ViviViviDocklet ViviViviDocklet; +typedef struct _ViviViviDockletClass ViviViviDockletClass; + +#define VIVI_TYPE_VIVI_DOCKLET (vivi_vivi_docklet_get_type()) +#define VIVI_IS_VIVI_DOCKLET(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), VIVI_TYPE_VIVI_DOCKLET)) +#define VIVI_IS_VIVI_DOCKLET_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), VIVI_TYPE_VIVI_DOCKLET)) +#define VIVI_VIVI_DOCKLET(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), VIVI_TYPE_VIVI_DOCKLET, ViviViviDocklet)) +#define VIVI_VIVI_DOCKLET_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), VIVI_TYPE_VIVI_DOCKLET, ViviViviDockletClass)) +#define VIVI_VIVI_DOCKLET_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), VIVI_TYPE_VIVI_DOCKLET, ViviViviDockletClass)) + +struct _ViviViviDocklet { + ViviDocklet docklet; + + ViviApplication * app; /* the application we connect to */ +}; + +struct _ViviViviDockletClass +{ + ViviDockletClass docklet_class; + + void (* set_app) (ViviViviDocklet * docklet, + ViviApplication * app); + void (* unset_app) (ViviViviDocklet * docklet, + ViviApplication * app); +}; + +GType vivi_vivi_docklet_get_type (void); + + +G_END_DECLS +#endif diff-tree d0b370d01cd37dcaac383206aade7d886cf8f423 (from 7adaaba7e86f29eb42b555bd61d46fb428cfe9d7) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 10:04:33 2007 +0200 make this work with a ViviApplication diff --git a/vivified/ui/vivi_movie_list.c b/vivified/ui/vivi_movie_list.c index 7178a32..7a4ddef 100644 --- a/vivified/ui/vivi_movie_list.c +++ b/vivified/ui/vivi_movie_list.c @@ -22,7 +22,6 @@ #endif #include <gtk/gtk.h> -#include <libswfdec/swfdec.h> #include <libswfdec/swfdec_movie.h> #include <libswfdec/swfdec_player_internal.h> #include "vivi_movie_list.h" @@ -273,14 +272,18 @@ vivi_movie_list_get_index (GNode *parent return i; } -static void -vivi_movie_list_added (SwfdecPlayer *player, SwfdecMovie *movie, ViviMovieList *movies) +static gboolean +vivi_movie_list_added (ViviDebugger *debugger, SwfdecAsObject *object, ViviMovieList *movies) { + SwfdecMovie *movie; GtkTreePath *path; GtkTreeIter iter; GNode *node, *new; int pos; + if (!SWFDEC_IS_MOVIE (object)) + return FALSE; + movie = SWFDEC_MOVIE (object); if (movie->parent) { node = g_hash_table_lookup (movies->nodes, movie->parent); g_assert (node); @@ -297,6 +300,7 @@ vivi_movie_list_added (SwfdecPlayer *pla path = vivi_movie_list_node_to_path (new); gtk_tree_model_row_inserted (GTK_TREE_MODEL (movies), path, &iter); gtk_tree_path_free (path); + return FALSE; } static void @@ -318,30 +322,35 @@ vivi_movie_list_movie_notify (SwfdecMovi gtk_tree_path_free (path); } -static void -vivi_movie_list_removed (SwfdecPlayer *player, SwfdecMovie *movie, ViviMovieList *movies) +static gboolean +vivi_movie_list_removed (ViviDebugger *debugger, SwfdecAsObject *object, ViviMovieList *movies) { GNode *node; GtkTreePath *path; - node = g_hash_table_lookup (movies->nodes, movie); - g_hash_table_remove (movies->nodes, movie); - g_signal_handlers_disconnect_by_func (movie, vivi_movie_list_movie_notify, movies); + if (!SWFDEC_IS_MOVIE (object)) + return FALSE; + node = g_hash_table_lookup (movies->nodes, object); + g_hash_table_remove (movies->nodes, object); + g_signal_handlers_disconnect_by_func (object, vivi_movie_list_movie_notify, movies); path = vivi_movie_list_node_to_path (node); g_assert (g_node_n_children (node) == 0); g_node_destroy (node); gtk_tree_model_row_deleted (GTK_TREE_MODEL (movies), path); gtk_tree_path_free (path); + return FALSE; } static void vivi_movie_list_dispose (GObject *object) { ViviMovieList *movies = VIVI_MOVIE_LIST (object); + ViviDebugger *debugger; - g_signal_handlers_disconnect_by_func (movies->player, vivi_movie_list_removed, movies); - g_signal_handlers_disconnect_by_func (movies->player, vivi_movie_list_added, movies); - g_object_unref (movies->player); + debugger = movies->app->debugger; + g_signal_handlers_disconnect_by_func (debugger, vivi_movie_list_removed, movies); + g_signal_handlers_disconnect_by_func (debugger, vivi_movie_list_added, movies); + g_object_unref (movies->app); g_assert (g_node_n_children (movies->root) == 0); g_node_destroy (movies->root); g_hash_table_destroy (movies->nodes); @@ -365,15 +374,17 @@ vivi_movie_list_init (ViviMovieList *mov } ViviMovieList * -vivi_movie_list_new (SwfdecPlayer *player) +vivi_movie_list_new (ViviApplication *app) { ViviMovieList *movies; + ViviDebugger *debugger; movies = g_object_new (VIVI_TYPE_MOVIE_LIST, NULL); - movies->player = player; - g_object_ref (player); - g_signal_connect (player, "movie-added", G_CALLBACK (vivi_movie_list_added), movies); - g_signal_connect (player, "movie-removed", G_CALLBACK (vivi_movie_list_removed), movies); + g_object_ref (app); + movies->app = app; + debugger = app->debugger; + g_signal_connect (debugger, "add", G_CALLBACK (vivi_movie_list_added), movies); + g_signal_connect (debugger, "remove", G_CALLBACK (vivi_movie_list_removed), movies); return movies; } diff --git a/vivified/ui/vivi_movie_list.h b/vivified/ui/vivi_movie_list.h index eaa7eb6..ddd4a81 100644 --- a/vivified/ui/vivi_movie_list.h +++ b/vivified/ui/vivi_movie_list.h @@ -17,7 +17,7 @@ * Boston, MA 02110-1301 USA */ -#include <libswfdec/swfdec.h> +#include <vivified/core/vivified-core.h> #ifndef _VIVI_MOVIE_LIST_H_ #define _VIVI_MOVIE_LIST_H_ @@ -46,7 +46,7 @@ struct _ViviMovieList { GObject object; - SwfdecPlayer * player; /* the video we play */ + ViviApplication * app; /* the application we watch */ GNode * root; /* the root node containing all the movies */ int stamp; /* to validate tree iters */ GHashTable * nodes; /* movies => node fast lookup table */ @@ -59,7 +59,7 @@ struct _ViviMovieListClass GType vivi_movie_list_get_type (void); -ViviMovieList * vivi_movie_list_new (SwfdecPlayer * player); +ViviMovieList * vivi_movie_list_new (ViviApplication * app); G_END_DECLS diff-tree 7adaaba7e86f29eb42b555bd61d46fb428cfe9d7 (from 04f4684b200ee8e3c102282b56040881d279a39c) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 10:03:59 2007 +0200 implement add and remove vfuncs diff --git a/vivified/core/vivi_debugger.c b/vivified/core/vivi_debugger.c index a5ae2eb..68a7b89 100644 --- a/vivified/core/vivi_debugger.c +++ b/vivified/core/vivi_debugger.c @@ -28,6 +28,8 @@ #include "libswfdec/swfdec_player_internal.h" enum { + ADD, + REMOVE, STEP, START_FRAME, FINISH_FRAME, @@ -87,6 +89,30 @@ vivi_debugger_break (ViviDebugger *debug } static void +vivi_debugger_add (SwfdecAsDebugger *debugger, SwfdecAsContext *context, + SwfdecAsObject *object) +{ + gboolean retval = FALSE; + + g_signal_emit (debugger, signals[ADD], 0, object, &retval); + + if (retval) + vivi_debugger_break (VIVI_DEBUGGER (debugger)); +} + +static void +vivi_debugger_remove (SwfdecAsDebugger *debugger, SwfdecAsContext *context, + SwfdecAsObject *object) +{ + gboolean retval = FALSE; + + g_signal_emit (debugger, signals[REMOVE], 0, object, &retval); + + if (retval) + vivi_debugger_break (VIVI_DEBUGGER (debugger)); +} + +static void vivi_debugger_step (SwfdecAsDebugger *debugger, SwfdecAsContext *context) { gboolean retval = FALSE; @@ -149,6 +175,12 @@ vivi_debugger_class_init (ViviDebuggerCl object_class->dispose = vivi_debugger_dispose; + signals[ADD] = g_signal_new ("add", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, 0, vivi_accumulate_or, NULL, vivi_marshal_BOOLEAN__OBJECT, + G_TYPE_BOOLEAN, 1, SWFDEC_TYPE_AS_OBJECT); + signals[REMOVE] = g_signal_new ("remove", G_TYPE_FROM_CLASS (klass), + G_SIGNAL_RUN_LAST, 0, vivi_accumulate_or, NULL, vivi_marshal_BOOLEAN__OBJECT, + G_TYPE_BOOLEAN, 1, SWFDEC_TYPE_AS_OBJECT); signals[STEP] = g_signal_new ("step", G_TYPE_FROM_CLASS (klass), G_SIGNAL_RUN_LAST, 0, vivi_accumulate_or, NULL, vivi_marshal_BOOLEAN__VOID, G_TYPE_BOOLEAN, 0); @@ -162,6 +194,8 @@ vivi_debugger_class_init (ViviDebuggerCl G_SIGNAL_RUN_LAST, 0, vivi_accumulate_or, NULL, vivi_marshal_BOOLEAN__OBJECT_STRING_POINTER, G_TYPE_BOOLEAN, 3, SWFDEC_TYPE_AS_OBJECT, G_TYPE_STRING, G_TYPE_POINTER); + debugger_class->add = vivi_debugger_add; + debugger_class->remove = vivi_debugger_remove; debugger_class->step = vivi_debugger_step; debugger_class->start_frame = vivi_debugger_start_frame; debugger_class->finish_frame = vivi_debugger_finish_frame; diff-tree 04f4684b200ee8e3c102282b56040881d279a39c (from 10153690d1eafad2f3bdbedda1e00d2d6b1b16dc) Author: Benjamin Otte <otte at gnome.org> Date: Tue Aug 21 10:03:29 2007 +0200 emit remove debugger function before collecting the object Otherwise we end up with a freed object (nice!) diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index a135585..59df631 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -261,12 +261,12 @@ swfdec_as_context_remove_objects (gpoint return FALSE; } else { SWFDEC_LOG ("deleted: %s %p", G_OBJECT_TYPE_NAME (object), object); - swfdec_as_object_collect (object); if (debugger) { SwfdecAsDebuggerClass *klass = SWFDEC_AS_DEBUGGER_GET_CLASS (debugger); if (klass->remove) klass->remove (debugger, object->context, object); } + swfdec_as_object_collect (object); return TRUE; } } diff-tree 10153690d1eafad2f3bdbedda1e00d2d6b1b16dc (from a5468cc9ac5545c607021cc89a6f541df3d6c56e) Author: Benjamin Otte <otte at gnome.org> Date: Mon Aug 20 21:49:21 2007 +0200 ad functionality to get notified about object add/remove to GC diff --git a/libswfdec/swfdec_as_context.c b/libswfdec/swfdec_as_context.c index 0cb0226..a135585 100644 --- a/libswfdec/swfdec_as_context.c +++ b/libswfdec/swfdec_as_context.c @@ -248,7 +248,7 @@ swfdec_as_context_remove_strings (gpoint } static gboolean -swfdec_as_context_remove_objects (gpointer key, gpointer value, gpointer data) +swfdec_as_context_remove_objects (gpointer key, gpointer value, gpointer debugger) { SwfdecAsObject *object; @@ -262,6 +262,11 @@ swfdec_as_context_remove_objects (gpoint } else { SWFDEC_LOG ("deleted: %s %p", G_OBJECT_TYPE_NAME (object), object); swfdec_as_object_collect (object); + if (debugger) { + SwfdecAsDebuggerClass *klass = SWFDEC_AS_DEBUGGER_GET_CLASS (debugger); + if (klass->remove) + klass->remove (debugger, object->context, object); + } return TRUE; } } @@ -274,7 +279,7 @@ swfdec_as_context_collect (SwfdecAsConte g_hash_table_foreach_remove (context->strings, swfdec_as_context_remove_strings, context); g_hash_table_foreach_remove (context->objects, - swfdec_as_context_remove_objects, context); + swfdec_as_context_remove_objects, context->debugger); SWFDEC_INFO (">> done collecting garbage"); } diff --git a/libswfdec/swfdec_as_debugger.h b/libswfdec/swfdec_as_debugger.h index 4a0f952..61aaae6 100644 --- a/libswfdec/swfdec_as_debugger.h +++ b/libswfdec/swfdec_as_debugger.h @@ -43,6 +43,14 @@ struct _SwfdecAsDebugger { struct _SwfdecAsDebuggerClass { GObjectClass object_class; + /* a new object was added to the GC */ + void (* add) (SwfdecAsDebugger * debugger, + SwfdecAsContext * context, + SwfdecAsObject * object); + /* an object was removed from the GC */ + void (* remove) (SwfdecAsDebugger * debugger, + SwfdecAsContext * context, + SwfdecAsObject * object); /* called before executing a bytecode */ void (* step) (SwfdecAsDebugger * debugger, SwfdecAsContext * context); diff --git a/libswfdec/swfdec_as_object.c b/libswfdec/swfdec_as_object.c index d041803..bd2cf90 100644 --- a/libswfdec/swfdec_as_object.c +++ b/libswfdec/swfdec_as_object.c @@ -528,6 +528,11 @@ swfdec_as_object_add (SwfdecAsObject *ob klass = SWFDEC_AS_OBJECT_GET_CLASS (object); g_return_if_fail (klass->add); klass->add (object); + if (context->debugger) { + SwfdecAsDebuggerClass *dklass = SWFDEC_AS_DEBUGGER_GET_CLASS (context->debugger); + if (dklass->add) + dklass->add (context->debugger, context, object); + } } void diff-tree a5468cc9ac5545c607021cc89a6f541df3d6c56e (from 307c09bbe7611bf2b1dae7e59a98d32cf009f595) Author: Benjamin Otte <otte at gnome.org> Date: Mon Aug 20 21:36:19 2007 +0200 remove last remains of SwfdecDebugger note: I didn't remove the source files yet, they might be useful for reference while implementing Vivified diff --git a/libswfdec/Makefile.am b/libswfdec/Makefile.am index 198b805..1e5e8a5 100644 --- a/libswfdec/Makefile.am +++ b/libswfdec/Makefile.am @@ -60,7 +60,6 @@ libswfdec_ at SWFDEC_MAJORMINOR@_la_SOURCES swfdec_color.c \ swfdec_color_as.c \ swfdec_debug.c \ - swfdec_debugger.c \ swfdec_decoder.c \ swfdec_edittext.c \ swfdec_edittext_movie.c \ @@ -179,7 +178,6 @@ noinst_HEADERS = \ swfdec_color.h \ swfdec_color_as.h \ swfdec_debug.h \ - swfdec_debugger.h \ swfdec_decoder.h \ swfdec_edittext.h \ swfdec_edittext_movie.h \ diff --git a/libswfdec/swfdec_script.c b/libswfdec/swfdec_script.c index 221e25c..90f3e2a 100644 --- a/libswfdec/swfdec_script.c +++ b/libswfdec/swfdec_script.c @@ -26,7 +26,6 @@ #include "swfdec_as_context.h" #include "swfdec_as_interpret.h" #include "swfdec_debug.h" -#include "swfdec_debugger.h" /* Define this to get SWFDEC_WARN'd about missing properties of objects. * This can be useful to find out about unimplemented native properties, diff --git a/libswfdec/swfdec_types.h b/libswfdec/swfdec_types.h index 907ac87..b66ecd9 100644 --- a/libswfdec/swfdec_types.h +++ b/libswfdec/swfdec_types.h @@ -37,7 +37,6 @@ typedef struct _SwfdecCacheHandle Swfdec typedef struct _SwfdecCharacter SwfdecCharacter; typedef struct _SwfdecColorTransform SwfdecColorTransform; typedef struct _SwfdecContent SwfdecContent; -typedef struct _SwfdecDebugger SwfdecDebugger; typedef struct _SwfdecDecoder SwfdecDecoder; typedef struct _SwfdecEventList SwfdecEventList; typedef struct _SwfdecFont SwfdecFont; diff-tree 307c09bbe7611bf2b1dae7e59a98d32cf009f595 (from e04f9526fa8a613d88219ebcb47ac61addd5bcab) Author: Benjamin Otte <otte at gnome.org> Date: Mon Aug 20 21:34:07 2007 +0200 get rid of debugger bits diff --git a/libswfdec/swfdec_movie.c b/libswfdec/swfdec_movie.c index 243dabc..420c508 100644 --- a/libswfdec/swfdec_movie.c +++ b/libswfdec/swfdec_movie.c @@ -32,7 +32,6 @@ #include "swfdec_as_strings.h" #include "swfdec_button_movie.h" #include "swfdec_debug.h" -#include "swfdec_debugger.h" #include "swfdec_event.h" #include "swfdec_graphic.h" #include "swfdec_loader_internal.h" @@ -315,16 +314,8 @@ swfdec_movie_destroy (SwfdecMovie *movie swfdec_movie_destroy (movie->list->data); } if (movie->parent) { - if (SWFDEC_IS_DEBUGGER (player) && - g_list_find (movie->parent->list, movie)) { - g_signal_emit_by_name (player, "movie-removed", movie); - } movie->parent->list = g_list_remove (movie->parent->list, movie); } else { - if (SWFDEC_IS_DEBUGGER (player) && - g_list_find (player->roots, movie)) { - g_signal_emit_by_name (player, "movie-removed", movie); - } player->roots = g_list_remove (player->roots, movie); } /* FIXME: figure out how to handle destruction pre-init/construct. @@ -1000,7 +991,6 @@ swfdec_movie_new (SwfdecPlayer *player, size = 0; } g_object_ref (movie); - swfdec_as_object_add (SWFDEC_AS_OBJECT (movie), SWFDEC_AS_CONTEXT (player), size); /* set essential properties */ movie->parent = parent; if (parent) { @@ -1030,9 +1020,8 @@ swfdec_movie_new (SwfdecPlayer *player, * new movies to be created (and added to this list) */ player->movies = g_list_prepend (player->movies, movie); - /* emit the new-movie signal */ - if (SWFDEC_IS_DEBUGGER (player)) - g_signal_emit_by_name (player, "movie-added", movie); + /* only add the movie here, because it needs to be setup for the debugger */ + swfdec_as_object_add (SWFDEC_AS_OBJECT (movie), SWFDEC_AS_CONTEXT (player), size); return movie; }
Reasonably Related Threads
- 163 commits - autogen.sh configure.ac doc/swfdec-sections.txt libswfdec-gtk/swfdec_gtk_player.c libswfdec-gtk/swfdec_gtk_player.h libswfdec-gtk/swfdec_gtk_widget.c libswfdec-gtk/swfdec_source.c libswfdec/Makefile.am libswfdec/swfdec_as_array.c
- Branch 'vivi' - 24 commits - configure.ac libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_tag.c libswfdec/swfdec_tag.h vivified/core vivified/dock vivified/ui
- Branch 'vivi' - 10 commits - libswfdec/swfdec_button_movie.c libswfdec/swfdec_movie.c libswfdec/swfdec_player.c vivified/core vivified/dock vivified/ui
- 15 commits - libswfdec/swfdec_as_strings.c libswfdec/swfdec_initialize.as libswfdec/swfdec_initialize.h libswfdec/swfdec_movie.c libswfdec/swfdec_movie.h libswfdec/swfdec_sprite.c libswfdec/swfdec_sprite_movie.c libswfdec/swfdec_system_as.c
- Branch 'vivi' - 6 commits - configure.ac vivified/core vivified/dock vivified/Makefile.am vivified/ui