From b0c5be1011f5fed19c6979b63e9d12475fd381d3 Mon Sep 17 00:00:00 2001 From: Sergio Villar Senin Date: Fri, 24 Aug 2012 12:14:05 +0200 Subject: ephy-bookmarks-editor: repaint the favicon on "icon-loaded" Fixes a crash when epy is started with the bookmarks window open. The old code was trying to set the favicon in an already released GValue. Instead of doing that, we now force a repaint of the row once we get the favicon. https://bugzilla.gnome.org/show_bug.cgi?id=673795 --- src/bookmarks/ephy-bookmarks-editor.c | 42 ++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/src/bookmarks/ephy-bookmarks-editor.c b/src/bookmarks/ephy-bookmarks-editor.c index eeeecac97..221ab9aeb 100644 --- a/src/bookmarks/ephy-bookmarks-editor.c +++ b/src/bookmarks/ephy-bookmarks-editor.c @@ -1474,13 +1474,25 @@ webkit_favicon_database_has_favicon (WebKitFaviconDatabase *database, const char } static void -icon_loaded_cb (WebKitFaviconDatabase *database, GAsyncResult *result, GValue *value) +icon_loaded_cb (WebKitFaviconDatabase *database, GAsyncResult *result, GtkTreeRowReference *reference) { GdkPixbuf *favicon = webkit_favicon_database_get_favicon_pixbuf_finish (database, result, NULL); - if (!favicon) - return; - g_value_take_object (value, favicon); + if (favicon && gtk_tree_row_reference_valid (reference)) { + GtkTreeModel *model = gtk_tree_row_reference_get_model (reference); + GtkTreePath *path = gtk_tree_row_reference_get_path (reference); + GtkTreeIter iter; + + /* Force repaint. */ + if (gtk_tree_model_get_iter (model, &iter, path)) + gtk_tree_model_row_changed (model, path, &iter); + + gtk_tree_path_free (path); + } + + gtk_tree_row_reference_free (reference); + if (favicon) + g_object_unref (favicon); } #endif @@ -1506,10 +1518,24 @@ provide_favicon (EphyNode *node, GValue *value, gpointer user_data) favicon = webkit_favicon_database_try_get_favicon_pixbuf (database, page_location, FAVICON_SIZE, FAVICON_SIZE); - if (!favicon && webkit_favicon_database_has_favicon (database, page_location)) - webkit_favicon_database_get_favicon_pixbuf (database, page_location, - FAVICON_SIZE, FAVICON_SIZE, NULL, - (GAsyncReadyCallback) icon_loaded_cb, value); + if (!favicon && webkit_favicon_database_has_favicon (database, page_location)) { + GtkTreeModel *model = gtk_tree_view_get_model (GTK_TREE_VIEW (user_data)); + GtkTreeIter iter; + + if (ephy_node_view_get_iter_for_node (EPHY_NODE_VIEW (user_data), &iter, node)) { + GtkTreeRowReference *reference; + GtkTreePath *path; + + path = gtk_tree_model_get_path (model, &iter); + reference = gtk_tree_row_reference_new (model, path); + gtk_tree_path_free (path); + + webkit_favicon_database_get_favicon_pixbuf (database, page_location, + FAVICON_SIZE, FAVICON_SIZE, NULL, + (GAsyncReadyCallback) icon_loaded_cb, + reference); + } + } } g_value_init (value, GDK_TYPE_PIXBUF); -- cgit v1.2.3