[Swfdec] player/swfdec-player.ui player/swfdec-window.c player/swfdec-window.h

Benjamin Otte company at kemper.freedesktop.org
Mon Jan 14 04:49:28 PST 2008


 player/swfdec-player.ui |   42 ++++++++++++++++++++++++++++++++++++
 player/swfdec-window.c  |   55 +++++++++++++++++++++++++++++++++++++++++++-----
 player/swfdec-window.h  |    3 +-
 3 files changed, 94 insertions(+), 6 deletions(-)

New commits:
commit 96cdd32e67011296e3d0dd4f20973aefbd9081cb
Author: Benjamin Otte <otte at gnome.org>
Date:   Mon Jan 14 13:49:10 2008 +0100

    add error handling to swfdec-player
    
    swfdec-player will now pop up an error message similar to GEdit when an error
    happens.

diff --git a/player/swfdec-player.ui b/player/swfdec-player.ui
index caed4ec..48de04d 100644
--- a/player/swfdec-player.ui
+++ b/player/swfdec-player.ui
@@ -124,6 +124,48 @@
       </child>
 
       <child>
+	<object class="GtkHBox" id="player-error-area">
+	  <property name="homogeneous">False</property>
+	  <property name="spacing">0</property>
+	  <property name="visible">False</property>
+	  <child>
+	    <object class="GtkImage" id="player-error-image" >
+	      <property name="icon-size">6</property>
+	      <property name="stock">gtk-dialog-error</property>
+	      <property name="visible">True</property>
+	    </object>
+	    <packing>
+	      <property name="pack-type">start</property>
+	      <property name="expand">False</property>
+	      <property name="fill">True</property>
+	      <property name="padding">0</property>
+	    </packing>
+	  </child>
+	  <child>
+	    <object class="GtkLabel" id="player-error-label" >
+	      <property name="selectable">True</property>
+	      <property name="use-markup">True</property>
+	      <property name="visible">True</property>
+	      <property name="wrap">True</property>
+	      <property name="label">&lt;b&gt;This is a very long text that will wrap around, because it definitely is long enough.&lt;/b&gt;</property>
+	    </object>
+	    <packing>
+	      <property name="pack-type">start</property>
+	      <property name="expand">True</property>
+	      <property name="fill">True</property>
+	      <property name="padding">0</property>
+	    </packing>
+	  </child>
+	</object>
+	<packing>
+	  <property name="pack-type">start</property>
+	  <property name="expand">False</property>
+	  <property name="fill">True</property>
+	  <property name="padding">0</property>
+	</packing>
+      </child>
+
+      <child>
 	<object class="SwfdecGtkWidget" id="player-widget">
 	  <property name="visible">True</property>
 	  <property name="can_focus">True</property>
diff --git a/player/swfdec-window.c b/player/swfdec-window.c
index 5b1a32e..01a86e7 100644
--- a/player/swfdec-window.c
+++ b/player/swfdec-window.c
@@ -22,6 +22,7 @@
 #endif
 
 #include <glib/gi18n.h>
+#include <glib/gprintf.h>
 #include "swfdec-window.h"
 
 G_DEFINE_TYPE (SwfdecWindow, swfdec_window, G_TYPE_OBJECT)
@@ -76,6 +77,21 @@ swfdec_window_init (SwfdecWindow *window)
 }
 
 static void
+swfdec_window_player_aborted (SwfdecPlayer *player, GParamSpec *pspec, SwfdecWindow *window)
+{
+  if (swfdec_as_context_is_aborted (SWFDEC_AS_CONTEXT (player)))
+    swfdec_window_error (window, _("Broken Flash file, playback aborted."));
+}
+
+static void
+swfdec_window_player_next_event (SwfdecPlayer *player, GParamSpec *pspec, SwfdecWindow *window)
+{
+  if (!swfdec_player_is_initialized (player) && swfdec_player_get_next_event (player) < 0)
+    swfdec_window_error (window, _("%s is not a Flash file."), 
+	swfdec_loader_get_filename (window->loader));
+}
+
+static void
 swfdec_window_player_initialized (SwfdecPlayer *player, GParamSpec *pspec, SwfdecWindow *window)
 {
   static const char *mime[2] = { "swfdec-player", NULL };
@@ -87,6 +103,7 @@ swfdec_window_player_initialized (SwfdecPlayer *player, GParamSpec *pspec, Swfde
     gtk_recent_manager_add_full (gtk_recent_manager_get_default (),
 	swfdec_url_get_url (swfdec_loader_get_url (window->loader)),
 	&data);
+    g_signal_handlers_disconnect_by_func (player, swfdec_window_player_next_event, window);
   }
   g_free (data.app_exec);
 }
@@ -116,8 +133,12 @@ swfdec_window_set_url (SwfdecWindow *window, const char *url)
 
   window->loader = swfdec_gtk_loader_new (url);
   window->player = swfdec_gtk_player_new (NULL);
+  g_signal_connect (window->player, "notify::aborted", 
+      G_CALLBACK (swfdec_window_player_aborted), window);
   g_signal_connect (window->player, "notify::initialized", 
       G_CALLBACK (swfdec_window_player_initialized), window);
+  g_signal_connect (window->player, "notify::next-event", 
+      G_CALLBACK (swfdec_window_player_next_event), window);
   swfdec_player_set_loader (window->player, window->loader);
   swfdec_gtk_player_set_audio_enabled (SWFDEC_GTK_PLAYER (window->player), 
       window->settings.sound);
@@ -136,22 +157,46 @@ swfdec_window_set_url (SwfdecWindow *window, const char *url)
 /**
  * swfdec_window_error:
  * @window: a window
- * @msg: an error message to display for the user
+ * @format: an error message to display for the user in printf-style format
+ * @...: arguments for the function
  *
  * Shows the given error message to the user and aborts playback.
  * This function may be called at any time, no matter the state of the window 
  * object.
  **/
 void
-swfdec_window_error (SwfdecWindow *window, const char *msg)
+swfdec_window_error (SwfdecWindow *window, const char *format, ...)
 {
+  char *markup, *msg;
+  va_list varargs;
+
+  g_return_if_fail (SWFDEC_IS_WINDOW (window));
+  g_return_if_fail (msg != NULL);
+
   /* NB: This function can be called during the construction process (like when
    * the UI file isn't found, so a window object may not even exist. */
 
-  /* FIXME: disable playback related menu items */
-  /* FIXME: output this in a saner way */
-  g_printerr ("%s\n", msg);
+  if (window->error)
+    return;
   window->error = TRUE;
+  va_start (varargs, format);
+  msg = g_strdup_vprintf (format, varargs);
+  va_end (varargs);
+
+  if (window->window == NULL) {
+    g_printerr ("%s\n", msg);
+    g_free (msg);
+    return;
+  }
+  /* Translators: This is used to markup error message. */
+  markup = g_strdup_printf ("<b>%s</b>", msg);
+  gtk_label_set_label (GTK_LABEL (gtk_builder_get_object (window->builder, 
+	  "player-error-label")), markup);
+  g_free (markup);
+  g_free (msg);
+
+  gtk_widget_show (GTK_WIDGET (gtk_builder_get_object (window->builder, 
+	  "player-error-area")));
 }
 
 static void
diff --git a/player/swfdec-window.h b/player/swfdec-window.h
index 7f300c9..5d84b06 100644
--- a/player/swfdec-window.h
+++ b/player/swfdec-window.h
@@ -64,7 +64,8 @@ SwfdecWindow *	swfdec_window_new		(const char *			url);
 gboolean	swfdec_window_set_url		(SwfdecWindow *			window,
 						 const char *			url);
 void		swfdec_window_error		(SwfdecWindow *			window,
-						 const char *			msg);
+						 const char *			format,
+						 ...);
 void		swfdec_window_set_settings	(SwfdecWindow *			window,
 						 const SwfdecWindowSettings *	settings);
 


More information about the Swfdec mailing list