[rhythmbox] podcast: remove uses of gtk_dialog_run
- From: Jonathan Matthew <jmatthew src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [rhythmbox] podcast: remove uses of gtk_dialog_run
- Date: Sat, 18 Feb 2012 11:01:17 +0000 (UTC)
commit dd6a86d99a13d8c6260929908d3632ddcfb6290c
Author: Jonathan Matthew <jonathan d14n org>
Date: Sat Feb 18 20:59:57 2012 +1000
podcast: remove uses of gtk_dialog_run
podcast/rb-podcast-main-source.c | 28 ++++++--
podcast/rb-podcast-manager.c | 137 +++++++++++++++++++++++---------------
podcast/rb-podcast-manager.h | 13 ++--
podcast/rb-podcast-source.c | 129 ++++++++++++++++++++---------------
4 files changed, 185 insertions(+), 122 deletions(-)
---
diff --git a/podcast/rb-podcast-main-source.c b/podcast/rb-podcast-main-source.c
index c7d0864..4c801e7 100644
--- a/podcast/rb-podcast-main-source.c
+++ b/podcast/rb-podcast-main-source.c
@@ -194,14 +194,29 @@ feed_updates_available_cb (RBPodcastManager *pd,
}
-static gboolean
+static void
+error_dialog_response_cb (GtkDialog *dialog, int response, RBPodcastMainSource *source)
+{
+ const char *url = g_object_get_data (G_OBJECT (dialog), "feed-url");
+
+ if (response == GTK_RESPONSE_YES) {
+ RBPodcastManager *pd;
+ g_object_get (source, "podcast-manager", &pd, NULL);
+ rb_podcast_manager_insert_feed_url (pd, url);
+ g_object_unref (pd);
+ }
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
feed_error_cb (RBPodcastManager *pd,
+ const char *url,
const char *error,
gboolean existing,
RBPodcastMainSource *source)
{
GtkWidget *dialog;
- int result;
/* if the podcast feed doesn't already exist in the db,
* ask if the user wants to add it anyway; if it already
@@ -224,13 +239,10 @@ feed_error_cb (RBPodcastManager *pd,
gtk_window_set_title (GTK_WINDOW (dialog), "");
gtk_container_set_border_width (GTK_CONTAINER (dialog), 6);
- result = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
+ g_object_set_data_full (G_OBJECT (dialog), "feed-url", g_strdup (url), g_free);
+ g_signal_connect (dialog, "response", G_CALLBACK (error_dialog_response_cb), source);
- /* in the existing feed case, the response will be _OK or _NONE.
- * we want to return FALSE here in this case, so this check works.
- */
- return (result == GTK_RESPONSE_YES);
+ gtk_widget_show_all (dialog);
}
static void
diff --git a/podcast/rb-podcast-manager.c b/podcast/rb-podcast-manager.c
index b04e35f..88df223 100644
--- a/podcast/rb-podcast-manager.c
+++ b/podcast/rb-podcast-manager.c
@@ -154,7 +154,7 @@ static void rb_podcast_manager_db_entry_added_cb (RBPodcastManager *pd,
RhythmDBEntry *entry);
static gboolean rb_podcast_manager_next_file (RBPodcastManager * pd);
static void rb_podcast_manager_insert_feed (RBPodcastManager *pd, RBPodcastChannel *data);
-static gboolean rb_podcast_manager_handle_feed_error (RBPodcastManager *mgr,
+static void rb_podcast_manager_handle_feed_error (RBPodcastManager *mgr,
const char *url,
GError *error,
gboolean emit);
@@ -244,9 +244,10 @@ rb_podcast_manager_class_init (RBPodcastManagerClass *klass)
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (RBPodcastManagerClass, process_error),
NULL, NULL,
- rb_marshal_BOOLEAN__STRING_BOOLEAN,
- G_TYPE_BOOLEAN,
- 2,
+ NULL,
+ G_TYPE_NONE,
+ 3,
+ G_TYPE_STRING,
G_TYPE_STRING,
G_TYPE_BOOLEAN);
@@ -1077,8 +1078,6 @@ rb_podcast_manager_free_parse_result (RBPodcastManagerParseResult *result)
static gboolean
rb_podcast_manager_parse_complete_cb (RBPodcastManagerParseResult *result)
{
- gboolean add_feed = TRUE;
-
GDK_THREADS_ENTER ();
if (result->pd->priv->shutdown) {
GDK_THREADS_LEAVE ();
@@ -1086,15 +1085,11 @@ rb_podcast_manager_parse_complete_cb (RBPodcastManagerParseResult *result)
}
if (result->error) {
- if (rb_podcast_manager_handle_feed_error (result->pd,
- (char *)result->channel->url,
- result->error,
- result->automatic == FALSE) == FALSE) {
- add_feed = FALSE;
- }
- }
-
- if (add_feed) {
+ rb_podcast_manager_handle_feed_error (result->pd,
+ (char *)result->channel->url,
+ result->error,
+ (result->automatic == FALSE));
+ } else {
rb_podcast_manager_insert_feed (result->pd, result->channel);
}
@@ -1102,11 +1097,25 @@ rb_podcast_manager_parse_complete_cb (RBPodcastManagerParseResult *result)
return FALSE;
}
-static gboolean
-confirm_bad_mime_type (const char *url)
+static void
+confirm_bad_mime_type_response_cb (GtkDialog *dialog, int response, RBPodcastThreadInfo *info)
+{
+ if (response == GTK_RESPONSE_YES) {
+ /* set the 'existing feed' flag to avoid the mime type check */
+ info->existing_feed = TRUE;
+ rb_podcast_manager_thread_parse_feed (info);
+ } else {
+ g_free (info->url);
+ g_free (info);
+ }
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
+confirm_bad_mime_type (RBPodcastThreadInfo *info)
{
GtkWidget *dialog;
- gboolean result = FALSE;
GDK_THREADS_ENTER ();
dialog = gtk_message_dialog_new (NULL, 0,
@@ -1115,23 +1124,16 @@ confirm_bad_mime_type (const char *url)
_("The URL '%s' does not appear to be a podcast feed. "
"It may be the wrong URL, or the feed may be broken. "
"Would you like Rhythmbox to attempt to use it anyway?"),
- url);
-
- if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_YES) {
- result = TRUE;
- }
-
- gtk_widget_destroy (dialog);
+ info->url);
+ gtk_widget_show_all (dialog);
+ g_signal_connect (dialog, "response", G_CALLBACK (confirm_bad_mime_type_response_cb), info);
GDK_THREADS_LEAVE ();
- return result;
}
static gpointer
rb_podcast_manager_thread_parse_feed (RBPodcastThreadInfo *info)
{
RBPodcastChannel *feed = g_new0 (RBPodcastChannel, 1);
- gboolean retry = FALSE;
- gboolean existing_feed;
RBPodcastManagerParseResult *result;
result = g_new0 (RBPodcastManagerParseResult, 1);
@@ -1139,27 +1141,17 @@ rb_podcast_manager_thread_parse_feed (RBPodcastThreadInfo *info)
result->pd = info->pd; /* adopts our reference */
result->automatic = info->automatic;
- existing_feed = info->existing_feed;
- do {
- retry = FALSE;
- g_clear_error (&result->error);
-
- rb_debug ("attempting to parse feed %s", info->url);
- if (rb_podcast_parse_load_feed (feed, info->url, existing_feed, &result->error) == FALSE) {
- if (g_error_matches (result->error,
- RB_PODCAST_PARSE_ERROR,
- RB_PODCAST_PARSE_ERROR_MIME_TYPE)) {
- /* ask if the user really wants to use this feed.
- * if so, set the 'existing feed' flag, which causes
- * the mime type check to be skipped next time.
- */
- if (confirm_bad_mime_type (info->url)) {
- existing_feed = TRUE;
- retry = TRUE;
- }
- }
+ g_clear_error (&result->error);
+
+ rb_debug ("attempting to parse feed %s", info->url);
+ if (rb_podcast_parse_load_feed (feed, info->url, info->existing_feed, &result->error) == FALSE) {
+ if (g_error_matches (result->error,
+ RB_PODCAST_PARSE_ERROR,
+ RB_PODCAST_PARSE_ERROR_MIME_TYPE)) {
+ confirm_bad_mime_type (info);
+ return NULL;
}
- } while (retry);
+ }
if (feed->is_opml) {
GList *l;
@@ -1876,6 +1868,48 @@ remove_if_not_downloaded (GtkTreeModel *model,
return FALSE;
}
+void
+rb_podcast_manager_insert_feed_url (RBPodcastManager *pd, const char *url)
+{
+ RhythmDBEntry *entry;
+ GValue status_val = { 0, };
+ GValue title_val = { 0, };
+ GValue author_val = { 0, };
+ GValue last_update_val = { 0, };
+
+ entry = rhythmdb_entry_lookup_by_location (pd->priv->db, url);
+ if (entry) {
+ rb_debug ("podcast feed entry for %s found", url);
+ return;
+ }
+ rb_debug ("adding podcast feed %s with no entries", url);
+ entry = rhythmdb_entry_new (pd->priv->db,
+ RHYTHMDB_ENTRY_TYPE_PODCAST_FEED,
+ url);
+ if (entry == NULL)
+ return;
+
+ g_value_init (&status_val, G_TYPE_ULONG);
+ g_value_set_ulong (&status_val, 1);
+ rhythmdb_entry_set (pd->priv->db, entry, RHYTHMDB_PROP_STATUS, &status_val);
+ g_value_unset (&status_val);
+
+ g_value_init (&title_val, G_TYPE_STRING);
+ g_value_set_string (&title_val, url);
+ rhythmdb_entry_set (pd->priv->db, entry, RHYTHMDB_PROP_TITLE, &title_val);
+ g_value_unset (&title_val);
+
+ g_value_init (&author_val, G_TYPE_STRING);
+ g_value_set_static_string (&author_val, _("Unknown"));
+ rhythmdb_entry_set (pd->priv->db, entry, RHYTHMDB_PROP_ARTIST, &author_val);
+ g_value_unset (&author_val);
+
+ g_value_init (&last_update_val, G_TYPE_ULONG);
+ g_value_set_ulong (&last_update_val, time(NULL));
+ rhythmdb_entry_set (pd->priv->db, entry, RHYTHMDB_PROP_LAST_SEEN, &last_update_val);
+ g_value_unset (&last_update_val);
+}
+
static void
rb_podcast_manager_insert_feed (RBPodcastManager *pd, RBPodcastChannel *data)
{
@@ -2125,7 +2159,7 @@ rb_podcast_manager_insert_feed (RBPodcastManager *pd, RBPodcastChannel *data)
rhythmdb_commit (db);
}
-static gboolean
+static void
rb_podcast_manager_handle_feed_error (RBPodcastManager *mgr,
const char *url,
GError *error,
@@ -2134,7 +2168,6 @@ rb_podcast_manager_handle_feed_error (RBPodcastManager *mgr,
RhythmDBEntry *entry;
GValue v = {0,};
gboolean existing = FALSE;
- gboolean ret = FALSE;
/* set the error in the feed entry, if one exists */
entry = rhythmdb_entry_lookup_by_location (mgr->priv->db, url);
@@ -2155,11 +2188,9 @@ rb_podcast_manager_handle_feed_error (RBPodcastManager *mgr,
error->message, url);
g_signal_emit (mgr,
rb_podcast_manager_signals[PROCESS_ERROR],
- 0, error_msg, existing, &ret);
+ 0, url, error_msg, existing);
g_free (error_msg);
}
-
- return ret;
}
void
diff --git a/podcast/rb-podcast-manager.h b/podcast/rb-podcast-manager.h
index b00dd2f..cc2320f 100644
--- a/podcast/rb-podcast-manager.h
+++ b/podcast/rb-podcast-manager.h
@@ -54,12 +54,12 @@ typedef struct
{
GObjectClass parent_class;
- /* signals */
- void (*status_changed) (RBPodcastManager* pd, RhythmDBEntry *entry, glong value);
- void (*start_download) (RBPodcastManager* pd, RhythmDBEntry *entry);
- void (*finish_download) (RBPodcastManager* pd, RhythmDBEntry *entry);
- void (*feed_updates_available) (RBPodcastManager* pd, RhythmDBEntry *entry);
- gboolean (*process_error) (RBPodcastManager* pd, const char *error, gboolean existing);
+ /* signals */
+ void (*status_changed) (RBPodcastManager* pd, RhythmDBEntry *entry, glong value);
+ void (*start_download) (RBPodcastManager* pd, RhythmDBEntry *entry);
+ void (*finish_download) (RBPodcastManager* pd, RhythmDBEntry *entry);
+ void (*feed_updates_available) (RBPodcastManager* pd, RhythmDBEntry *entry);
+ void (*process_error) (RBPodcastManager* pd, const char *url, const char *error, gboolean existing);
} RBPodcastManagerClass;
@@ -76,6 +76,7 @@ gboolean rb_podcast_manager_remove_feed (RBPodcastManager *pd,
gchar * rb_podcast_manager_get_podcast_dir (RBPodcastManager *pd);
gboolean rb_podcast_manager_subscribe_feed (RBPodcastManager *pd, const gchar* url, gboolean automatic);
+void rb_podcast_manager_insert_feed_url (RBPodcastManager *pd, const char *url);
void rb_podcast_manager_unsubscribe_feed (RhythmDB *db, const gchar* url);
void rb_podcast_manager_shutdown (RBPodcastManager *pd);
RhythmDBEntry * rb_podcast_manager_add_post (RhythmDB *db,
diff --git a/podcast/rb-podcast-source.c b/podcast/rb-podcast-source.c
index 31304ec..4b197f7 100644
--- a/podcast/rb-podcast-source.c
+++ b/podcast/rb-podcast-source.c
@@ -350,17 +350,23 @@ podcast_location_added_cb (RBURIDialog *dialog,
}
static void
+podcast_add_response_cb (GtkDialog *dialog, int response, gpointer meh)
+{
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+
+static void
podcast_cmd_new_podcast (GtkAction *action, RBPodcastSource *source)
{
GtkWidget *dialog;
dialog = rb_uri_dialog_new (_("New Podcast Feed"), _("URL of podcast feed:"));
- g_signal_connect_object (G_OBJECT (dialog),
+ g_signal_connect_object (dialog,
"location-added",
G_CALLBACK (podcast_location_added_cb),
source, 0);
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
+ g_signal_connect (dialog, "response", G_CALLBACK (podcast_add_response_cb), NULL);
+ gtk_widget_show_all (dialog);
}
@@ -431,10 +437,32 @@ podcast_cmd_cancel_download (GtkAction *action, RBPodcastSource *source)
}
static void
-podcast_cmd_delete_feed (GtkAction *action, RBPodcastSource *source)
+podcast_remove_response_cb (GtkDialog *dialog, int response, RBPodcastSource *source)
{
GList *feeds, *l;
- gint ret;
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+
+ if (response == GTK_RESPONSE_CANCEL || response == GTK_RESPONSE_DELETE_EVENT) {
+ return;
+ }
+
+ feeds = rb_string_list_copy (source->priv->selected_feeds);
+ for (l = feeds; l != NULL; l = g_list_next (l)) {
+ const char *location = l->data;
+
+ rb_debug ("Removing podcast location: %s", location);
+ rb_podcast_manager_remove_feed (source->priv->podcast_mgr,
+ location,
+ (response == GTK_RESPONSE_YES));
+ }
+
+ rb_list_deep_free (feeds);
+}
+
+static void
+podcast_cmd_delete_feed (GtkAction *action, RBPodcastSource *source)
+{
GtkWidget *dialog;
GtkWidget *button;
GtkWindow *window;
@@ -474,23 +502,8 @@ podcast_cmd_delete_feed (GtkAction *action, RBPodcastSource *source)
gtk_window_set_focus (GTK_WINDOW (dialog), button);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
- ret = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- if (ret == GTK_RESPONSE_CANCEL || ret == GTK_RESPONSE_DELETE_EVENT)
- return;
-
- feeds = rb_string_list_copy (source->priv->selected_feeds);
- for (l = feeds; l != NULL; l = g_list_next (l)) {
- const char *location = l->data;
-
- rb_debug ("Removing podcast location: %s", location);
- rb_podcast_manager_remove_feed (source->priv->podcast_mgr,
- location,
- (ret == GTK_RESPONSE_YES));
- }
-
- rb_list_deep_free (feeds);
+ gtk_widget_show_all (dialog);
+ g_signal_connect (dialog, "response", G_CALLBACK (podcast_remove_response_cb), source);
}
static void
@@ -1028,12 +1041,46 @@ impl_can_add_to_queue (RBSource *source)
}
static void
-impl_delete (RBSource *asource)
+delete_response_cb (GtkDialog *dialog, int response, RBPodcastSource *source)
{
- RBPodcastSource *source = RB_PODCAST_SOURCE (asource);
GList *entries;
GList *l;
- gint ret;
+
+ gtk_widget_destroy (GTK_WIDGET (dialog));
+
+ if (response == GTK_RESPONSE_CANCEL || response == GTK_RESPONSE_DELETE_EVENT) {
+ return;
+ }
+
+ entries = rb_entry_view_get_selected_entries (source->priv->posts);
+ for (l = entries; l != NULL; l = g_list_next (l)) {
+ RhythmDBEntry *entry = l->data;
+
+ rb_podcast_manager_cancel_download (source->priv->podcast_mgr, entry);
+ if (response == GTK_RESPONSE_YES) {
+ rb_podcast_manager_delete_download (source->priv->podcast_mgr, entry);
+ }
+
+ /* set podcast entries to invisible instead of deleted so they will
+ * not reappear after the podcast has been updated
+ */
+ GValue v = {0,};
+ g_value_init (&v, G_TYPE_BOOLEAN);
+ g_value_set_boolean (&v, TRUE);
+ rhythmdb_entry_set (source->priv->db, entry, RHYTHMDB_PROP_HIDDEN, &v);
+ g_value_unset (&v);
+ }
+
+ g_list_foreach (entries, (GFunc)rhythmdb_entry_unref, NULL);
+ g_list_free (entries);
+
+ rhythmdb_commit (source->priv->db);
+}
+
+static void
+impl_delete (RBSource *asource)
+{
+ RBPodcastSource *source = RB_PODCAST_SOURCE (asource);
GtkWidget *dialog;
GtkWidget *button;
GtkWindow *window;
@@ -1071,36 +1118,8 @@ impl_delete (RBSource *asource)
gtk_window_set_focus (GTK_WINDOW (dialog), button);
gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_YES);
-
- ret = gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-
- if (ret == GTK_RESPONSE_CANCEL || ret == GTK_RESPONSE_DELETE_EVENT)
- return;
-
- entries = rb_entry_view_get_selected_entries (source->priv->posts);
- for (l = entries; l != NULL; l = g_list_next (l)) {
- RhythmDBEntry *entry = l->data;
-
- rb_podcast_manager_cancel_download (source->priv->podcast_mgr, entry);
- if (ret == GTK_RESPONSE_YES) {
- rb_podcast_manager_delete_download (source->priv->podcast_mgr, entry);
- }
-
- /* set podcast entries to invisible instead of deleted so they will
- * not reappear after the podcast has been updated
- */
- GValue v = {0,};
- g_value_init (&v, G_TYPE_BOOLEAN);
- g_value_set_boolean (&v, TRUE);
- rhythmdb_entry_set (source->priv->db, entry, RHYTHMDB_PROP_HIDDEN, &v);
- g_value_unset (&v);
- }
-
- g_list_foreach (entries, (GFunc)rhythmdb_entry_unref, NULL);
- g_list_free (entries);
-
- rhythmdb_commit (source->priv->db);
+ g_signal_connect (dialog, "response", G_CALLBACK (delete_response_cb), source);
+ gtk_widget_show_all (dialog);
}
static RBEntryView *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]