diff options
author | Sergio Villar Senin <svillar@igalia.com> | 2012-08-24 18:14:05 +0800 |
---|---|---|
committer | Sergio Villar Senin <svillar@igalia.com> | 2012-09-03 18:15:59 +0800 |
commit | b0c5be1011f5fed19c6979b63e9d12475fd381d3 (patch) | |
tree | 22c661dfc0dcfc4c010e3ff77249290e377e7eff | |
parent | c077cdea4bcdb95b58b7fff0b9dc7cce3aaa2982 (diff) | |
download | gsoc2013-epiphany-b0c5be1011f5fed19c6979b63e9d12475fd381d3.tar.gz gsoc2013-epiphany-b0c5be1011f5fed19c6979b63e9d12475fd381d3.tar.zst gsoc2013-epiphany-b0c5be1011f5fed19c6979b63e9d12475fd381d3.zip |
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
-rw-r--r-- | lib/widgets/ephy-node-view.c | 2 | ||||
-rw-r--r-- | src/bookmarks/ephy-bookmarks-editor.c | 42 |
2 files changed, 35 insertions, 9 deletions
diff --git a/lib/widgets/ephy-node-view.c b/lib/widgets/ephy-node-view.c index 1be6c93d0..53830e1b2 100644 --- a/lib/widgets/ephy-node-view.c +++ b/lib/widgets/ephy-node-view.c @@ -1304,7 +1304,7 @@ ephy_node_view_add_column (EphyNodeView *view, if (icon_func) { icon_column = ephy_tree_model_node_add_func_column - (view->priv->nodemodel, GDK_TYPE_PIXBUF, icon_func, NULL); + (view->priv->nodemodel, GDK_TYPE_PIXBUF, icon_func, view); renderer = gtk_cell_renderer_pixbuf_new (); gtk_tree_view_column_pack_start (gcolumn, renderer, FALSE); 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); |