From 96cdd32e67011296e3d0dd4f20973aefbd9081cb Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Mon, 14 Jan 2008 13:49:10 +0100 Subject: add error handling to swfdec-player swfdec-player will now pop up an error message similar to GEdit when an error happens. --- player/swfdec-player.ui | 42 +++++++++++++++++++++++++++++++++++++ player/swfdec-window.c | 55 ++++++++++++++++++++++++++++++++++++++++++++----- player/swfdec-window.h | 3 ++- 3 files changed, 94 insertions(+), 6 deletions(-) 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 @@ -123,6 +123,48 @@ + + + False + 0 + False + + + 6 + gtk-dialog-error + True + + + start + False + True + 0 + + + + + True + True + True + True + <b>This is a very long text that will wrap around, because it definitely is long enough.</b> + + + start + True + True + 0 + + + + + start + False + True + 0 + + + True 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 +#include #include "swfdec-window.h" G_DEFINE_TYPE (SwfdecWindow, swfdec_window, G_TYPE_OBJECT) @@ -75,6 +76,21 @@ swfdec_window_init (SwfdecWindow *window) windows = g_slist_prepend (windows, 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) { @@ -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 ("%s", 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); -- cgit v1.2.3