[epiphany] ephy-history-window: add back the favicons



commit 733bf55779c282c38fc654c53c6875a50886712a
Author: Claudio Saavedra <csaavedra igalia com>
Date:   Tue Mar 20 17:55:31 2012 +0200

    ephy-history-window: add back the favicons
    
    Use the new webkit favicon database for favicons here. This
    might not work perfectly, but that's a webkitgtk issue, see
    https://bugs.webkit.org/show_bug.cgi?id=81665
    
    https://bugzilla.gnome.org/show_bug.cgi?id=672480

 lib/widgets/ephy-hosts-store.c |   56 +++++++++++++++++++++++++++++++++++++++-
 lib/widgets/ephy-hosts-store.h |    1 +
 lib/widgets/ephy-hosts-view.c  |   22 +++++++++++++---
 3 files changed, 74 insertions(+), 5 deletions(-)
---
diff --git a/lib/widgets/ephy-hosts-store.c b/lib/widgets/ephy-hosts-store.c
index b5a9e6a..38e9b9c 100644
--- a/lib/widgets/ephy-hosts-store.c
+++ b/lib/widgets/ephy-hosts-store.c
@@ -21,6 +21,7 @@
 
 #include "config.h"
 
+#include "ephy-embed-prefs.h"
 #include "ephy-hosts-store.h"
 
 #include <glib/gi18n.h>
@@ -41,6 +42,7 @@ ephy_hosts_store_init (EphyHostsStore *self)
   types[EPHY_HOSTS_STORE_COLUMN_TITLE]       = G_TYPE_STRING;
   types[EPHY_HOSTS_STORE_COLUMN_ADDRESS]     = G_TYPE_STRING;
   types[EPHY_HOSTS_STORE_COLUMN_VISIT_COUNT] = G_TYPE_INT;
+  types[EPHY_HOSTS_STORE_COLUMN_FAVICON]     = GDK_TYPE_PIXBUF;
 
   gtk_list_store_set_column_types (GTK_LIST_STORE (self),
                                    EPHY_HOSTS_STORE_N_COLUMNS,
@@ -57,22 +59,74 @@ ephy_hosts_store_new (void)
                        NULL);
 }
 
+typedef struct {
+  GtkListStore *model;
+  GtkTreeRowReference *row_reference;
+} IconLoadData;
+
+static void
+icon_loaded_cb (GObject *source, GAsyncResult *result, gpointer user_data)
+{
+  GtkTreeIter iter;
+  GtkTreePath *path;
+  IconLoadData *data = (IconLoadData *) user_data;
+  GdkPixbuf *favicon = webkit_favicon_database_get_favicon_pixbuf_finish (webkit_get_favicon_database (),
+                                                                          result, NULL);
+
+  if (favicon) {
+    /* The completion model might have changed its contents */
+    if (gtk_tree_row_reference_valid (data->row_reference)) {
+      path = gtk_tree_row_reference_get_path (data->row_reference);
+      gtk_tree_model_get_iter (GTK_TREE_MODEL (data->model), &iter, path);
+      gtk_tree_path_free (path);
+      gtk_list_store_set (data->model, &iter,
+                          EPHY_HOSTS_STORE_COLUMN_FAVICON, favicon, -1);
+    }
+    g_object_unref (favicon);
+  }
+
+  g_object_unref (data->model);
+  gtk_tree_row_reference_free (data->row_reference);
+  g_slice_free (IconLoadData, data);
+}
+
 void
 ephy_hosts_store_add_hosts (EphyHostsStore *store,
                             GList *hosts)
 {
   EphyHistoryHost *host;
+  GtkTreeIter treeiter;
+  GtkTreePath *path;
   GList *iter;
+  GdkPixbuf *favicon;
+  IconLoadData *data;
+  WebKitFaviconDatabase *database = webkit_get_favicon_database ();
 
   for (iter = hosts; iter != NULL; iter = iter->next) {
     host = (EphyHistoryHost *)iter->data;
+    favicon = webkit_favicon_database_try_get_favicon_pixbuf (database, host->url,
+                                                              FAVICON_SIZE, FAVICON_SIZE);
     gtk_list_store_insert_with_values (GTK_LIST_STORE (store),
-                                       NULL, -1,
+                                       &treeiter, -1,
                                        EPHY_HOSTS_STORE_COLUMN_ID, host->id,
                                        EPHY_HOSTS_STORE_COLUMN_TITLE, host->title,
                                        EPHY_HOSTS_STORE_COLUMN_ADDRESS, host->url,
                                        EPHY_HOSTS_STORE_COLUMN_VISIT_COUNT, host->visit_count,
+                                       EPHY_HOSTS_STORE_COLUMN_FAVICON, favicon,
                                        -1);
+    if (favicon)
+      g_object_unref (favicon);
+    else {
+      data = g_slice_new (IconLoadData);
+      data->model = GTK_LIST_STORE (g_object_ref (store));
+      path = gtk_tree_model_get_path (GTK_TREE_MODEL (store), &treeiter);
+      data->row_reference = gtk_tree_row_reference_new (GTK_TREE_MODEL (store), path);
+      gtk_tree_path_free (path);
+
+      webkit_favicon_database_get_favicon_pixbuf (database, host->url,
+                                                  FAVICON_SIZE, FAVICON_SIZE, NULL,
+                                                  icon_loaded_cb, data);
+    }
   }
 }
 
diff --git a/lib/widgets/ephy-hosts-store.h b/lib/widgets/ephy-hosts-store.h
index 40502e8..98886fe 100644
--- a/lib/widgets/ephy-hosts-store.h
+++ b/lib/widgets/ephy-hosts-store.h
@@ -44,6 +44,7 @@ typedef enum {
   EPHY_HOSTS_STORE_COLUMN_TITLE,
   EPHY_HOSTS_STORE_COLUMN_ADDRESS,
   EPHY_HOSTS_STORE_COLUMN_VISIT_COUNT,
+  EPHY_HOSTS_STORE_COLUMN_FAVICON,
   EPHY_HOSTS_STORE_N_COLUMNS
 } EphyHostsStoreColumn;
 
diff --git a/lib/widgets/ephy-hosts-view.c b/lib/widgets/ephy-hosts-view.c
index e59d89c..a3595a2 100644
--- a/lib/widgets/ephy-hosts-view.c
+++ b/lib/widgets/ephy-hosts-view.c
@@ -22,6 +22,7 @@
 #include "config.h"
 #include "ephy-hosts-view.h"
 
+#include "ephy-embed-prefs.h"
 #include "ephy-gui.h"
 #include "ephy-hosts-store.h"
 
@@ -38,12 +39,25 @@ ephy_hosts_view_class_init (EphyHostsViewClass *klass)
 static void
 ephy_hosts_view_init (EphyHostsView *self)
 {
+  GtkCellRenderer *renderer;
   GtkTreeViewColumn *column;
 
-  column = gtk_tree_view_column_new_with_attributes (_("Sites"),
-                                                     gtk_cell_renderer_text_new (),
-                                                     "text", EPHY_HOSTS_STORE_COLUMN_TITLE,
-                                                     NULL);
+  column = g_object_new (GTK_TYPE_TREE_VIEW_COLUMN,
+                         "title", _("Sites"),
+                         NULL);
+
+  renderer = gtk_cell_renderer_pixbuf_new ();
+  gtk_tree_view_column_pack_start (column, renderer, FALSE);
+  gtk_tree_view_column_set_attributes (column, renderer,
+                                       "pixbuf", EPHY_HOSTS_STORE_COLUMN_FAVICON,
+                                       NULL);
+
+  renderer = gtk_cell_renderer_text_new ();
+  gtk_tree_view_column_pack_start (column, renderer, TRUE);
+  gtk_tree_view_column_set_attributes (column, renderer,
+                                       "text", EPHY_HOSTS_STORE_COLUMN_TITLE,
+                                       NULL);
+
   gtk_tree_view_append_column (GTK_TREE_VIEW (self), column);
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]