diff options
Diffstat (limited to 'embed')
-rw-r--r-- | embed/ephy-embed.c | 44 | ||||
-rw-r--r-- | embed/ephy-embed.h | 7 | ||||
-rw-r--r-- | embed/mozilla/mozilla-embed.cpp | 145 |
3 files changed, 184 insertions, 12 deletions
diff --git a/embed/ephy-embed.c b/embed/ephy-embed.c index 882c9bfd6..0a822ee11 100644 --- a/embed/ephy-embed.c +++ b/embed/ephy-embed.c @@ -497,6 +497,19 @@ ephy_embed_base_init (gpointer g_class) "The embed's link message", NULL, G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + g_object_interface_install_property (g_class, + g_param_spec_object ("icon", + "Icon", + "The embed icon's", + GDK_TYPE_PIXBUF, + G_PARAM_READABLE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB)); + + g_object_interface_install_property (g_class, + g_param_spec_string ("icon-address", + "Icon address", + "The embed icon's address", + NULL, + (G_PARAM_READWRITE | G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB))); initialized = TRUE; } @@ -1229,3 +1242,34 @@ ephy_embed_get_status_message (EphyEmbed *embed) return iface->get_status_message (embed); } +/** + * ephy_embed_get_icon: + * @embed: an #EphyEmbed + * + * Returns the embed's site icon as a #GdkPixbuf, + * or %NULL if it is not available. + * + * Return value: a the embed's site icon + **/ +GdkPixbuf * +ephy_embed_get_icon (EphyEmbed *embed) +{ + EphyEmbedIface *iface = EPHY_EMBED_GET_IFACE (embed); + return iface->get_icon (embed); +} + +/** + * ephy_embed_get_icon_address: + * @embed: an #EphyEmbed + * + * Returns a URL which points to @embed's site icon. + * + * Return value: the URL of @embed's site icon + **/ +const char * +ephy_embed_get_icon_address (EphyEmbed *embed) +{ + EphyEmbedIface *iface = EPHY_EMBED_GET_IFACE (embed); + return iface->get_icon_address (embed); +} + diff --git a/embed/ephy-embed.h b/embed/ephy-embed.h index 0dc9cfa72..87d78f20d 100644 --- a/embed/ephy-embed.h +++ b/embed/ephy-embed.h @@ -252,6 +252,8 @@ struct _EphyEmbedIface EphyEmbedAddressExpire expire); const char * (* get_address) (EphyEmbed *embed); const char * (* get_status_message) (EphyEmbed *embed); + GdkPixbuf * (* get_icon) (EphyEmbed *embed); + const char * (* get_icon_address) (EphyEmbed *embed); }; GType ephy_embed_net_state_get_type (void); @@ -368,6 +370,11 @@ const char * ephy_embed_get_address (EphyEmbed *embed); /* Status messages */ const char * ephy_embed_get_status_message (EphyEmbed *embed); +/* Icon and Icon Address */ + +GdkPixbuf * ephy_embed_get_icon (EphyEmbed *embed); +const char * ephy_embed_get_icon_address (EphyEmbed *embed); + /* Encoding */ char *ephy_embed_get_encoding (EphyEmbed *embed); diff --git a/embed/mozilla/mozilla-embed.cpp b/embed/mozilla/mozilla-embed.cpp index 6f8b5c612..4ac762617 100644 --- a/embed/mozilla/mozilla-embed.cpp +++ b/embed/mozilla/mozilla-embed.cpp @@ -45,6 +45,7 @@ #include "ephy-debug.h" #include "ephy-embed-shell.h" #include "ephy-embed-single.h" +#include "ephy-favicon-cache.h" #include "ephy-history.h" #include "ephy-string.h" #include "mozilla-embed-event.h" @@ -96,6 +97,14 @@ static void mozilla_embed_set_title (MozillaEmbed *embed, static void mozilla_embed_set_loading_title (MozillaEmbed *embed, const char *title, gboolean is_address); +static void mozilla_embed_icon_cache_changed_cb (EphyFaviconCache *cache, + const char *address, + MozillaEmbed *embed); +static void mozilla_embed_set_icon_address (MozillaEmbed *embed, + const char *address); +static void mozilla_embed_favicon_cb (EphyEmbed *embed, + const char *address, + MozillaEmbed *membed); static void impl_set_typed_address (EphyEmbed *embed, const char *address, EphyEmbedAddressExpire expire); @@ -143,6 +152,8 @@ struct MozillaEmbedPrivate int total_requests; char *status_message; char *link_message; + char *icon_address; + GdkPixbuf *icon; /* File watch */ GnomeVFSMonitorHandle *monitor; @@ -157,6 +168,8 @@ enum PROP_0, PROP_ADDRESS, PROP_DOCUMENT_TYPE, + PROP_ICON, + PROP_ICON_ADDRESS, PROP_LINK_MESSAGE, PROP_LOAD_PROGRESS, PROP_LOAD_STATUS, @@ -275,12 +288,12 @@ mozilla_embed_get_property (GObject *object, case PROP_DOCUMENT_TYPE: g_value_set_enum (value, priv->document_type); break; - case PROP_SECURITY: - g_value_set_enum (value, priv->security_level); - break; - case PROP_ZOOM: - g_value_set_float (value, priv->zoom); - break; + case PROP_ICON: + g_value_set_object (value, priv->icon); + break; + case PROP_ICON_ADDRESS: + g_value_set_string (value, priv->icon_address); + break; case PROP_LINK_MESSAGE: g_value_set_string (value, priv->link_message); break; @@ -293,6 +306,9 @@ mozilla_embed_get_property (GObject *object, case PROP_NAVIGATION: g_value_set_flags (value, priv->nav_flags); break; + case PROP_SECURITY: + g_value_set_enum (value, priv->security_level); + break; case PROP_STATUS_MESSAGE: g_value_set_string (value, priv->status_message); break; @@ -302,6 +318,9 @@ mozilla_embed_get_property (GObject *object, case PROP_TYPED_ADDRESS: g_value_set_string (value, priv->typed_address); break; + case PROP_ZOOM: + g_value_set_float (value, priv->zoom); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -317,12 +336,16 @@ mozilla_embed_set_property (GObject *object, { switch (prop_id) { + case PROP_ICON_ADDRESS: + mozilla_embed_set_icon_address (MOZILLA_EMBED (object), g_value_get_string (value)); + break; case PROP_TYPED_ADDRESS: impl_set_typed_address (EPHY_EMBED (object), g_value_get_string (value), EPHY_EMBED_ADDRESS_EXPIRE_NOW); break; case PROP_ADDRESS: case PROP_DOCUMENT_TYPE: + case PROP_ICON: case PROP_LOAD_PROGRESS: case PROP_LOAD_STATUS: case PROP_LINK_MESSAGE: @@ -375,6 +398,7 @@ mozilla_embed_class_init (MozillaEmbedClass *klass) static void mozilla_embed_init (MozillaEmbed *embed) { + EphyFaviconCache *cache; MozillaEmbedPrivate *priv = embed->priv; priv = MOZILLA_EMBED_GET_PRIVATE (embed); priv->browser = new EphyBrowser (); @@ -412,6 +436,15 @@ mozilla_embed_init (MozillaEmbed *embed) g_signal_connect_object (embed, "link_message", G_CALLBACK (mozilla_embed_link_message_cb), embed, (GConnectFlags)0); + g_signal_connect_object (embed, "ge_favicon", + G_CALLBACK (mozilla_embed_favicon_cb), + embed, (GConnectFlags)0); + + cache = EPHY_FAVICON_CACHE + (ephy_embed_shell_get_favicon_cache (embed_shell)); + g_signal_connect_object (G_OBJECT (cache), "changed", + G_CALLBACK (mozilla_embed_icon_cache_changed_cb), + embed, (GConnectFlags)0); priv->document_type = EPHY_EMBED_DOCUMENT_HTML; priv->security_level = EPHY_EMBED_STATE_IS_UNKNOWN; @@ -427,6 +460,8 @@ mozilla_embed_init (MozillaEmbed *embed) priv->is_blank = TRUE; priv->total_requests = 0; priv->cur_requests = 0; + priv->icon_address = NULL; + priv->icon = NULL; } gpointer @@ -461,6 +496,14 @@ mozilla_embed_finalize (GObject *object) embed->priv->browser = nsnull; } + if (embed->priv->icon != NULL) + { + g_object_unref (embed->priv->icon); + embed->priv->icon = NULL; + } + + g_free (embed->priv->icon_address); + g_free (embed->priv->address); g_free (embed->priv->typed_address); g_free (embed->priv->title); @@ -1427,9 +1470,7 @@ mozilla_embed_location_changed_cb (GtkMozEmbed *embed, } mozilla_embed_set_link_message (membed, NULL); -#if 0 - mozilla_embed_set_icon_address (embed, NULL); -#endif + mozilla_embed_set_icon_address (membed, NULL); mozilla_embed_update_navigation_flags (membed); g_object_notify (object, "title"); @@ -1441,9 +1482,89 @@ static void mozilla_embed_link_message_cb (EphyEmbed *embed, MozillaEmbed *membed) { - char *link_message = gtk_moz_embed_get_link_message (GTK_MOZ_EMBED (membed)); - mozilla_embed_set_link_message (membed, link_message); - g_free (link_message); + char *link_message = gtk_moz_embed_get_link_message (GTK_MOZ_EMBED (membed)); + mozilla_embed_set_link_message (membed, link_message); + g_free (link_message); +} + +static void +mozilla_embed_load_icon (MozillaEmbed *embed) +{ + MozillaEmbedPrivate *priv = embed->priv; + EphyEmbedShell *shell; + EphyFaviconCache *cache; + + if (priv->icon_address == NULL || priv->icon != NULL) return; + + shell = ephy_embed_shell_get_default (); + cache = EPHY_FAVICON_CACHE (ephy_embed_shell_get_favicon_cache (shell)); + + /* ephy_favicon_cache_get returns a reference already */ + priv->icon = ephy_favicon_cache_get (cache, priv->icon_address); + + g_object_notify (G_OBJECT (embed), "icon"); +} + +static void +mozilla_embed_icon_cache_changed_cb (EphyFaviconCache *cache, + const char *address, + MozillaEmbed *embed) +{ + MozillaEmbedPrivate *priv = embed->priv; + + g_return_if_fail (address != NULL); + + /* is this for us? */ + if (priv->icon_address != NULL && + strcmp (priv->icon_address, address) == 0) + { + mozilla_embed_load_icon (embed); + } +} + +static void +mozilla_embed_set_icon_address (MozillaEmbed *embed, + const char *address) +{ + GObject *object = G_OBJECT (embed); + MozillaEmbedPrivate *priv = embed->priv; + /* EphyBookmarks *eb;*/ + EphyHistory *history; + + g_free (priv->icon_address); + priv->icon_address = g_strdup (address); + + if (priv->icon != NULL) + { + g_object_unref (priv->icon); + priv->icon = NULL; + + g_object_notify (object, "icon"); + } + + if (priv->icon_address) + { + history = EPHY_HISTORY + (ephy_embed_shell_get_global_history (embed_shell)); + ephy_history_set_icon (history, priv->address, + priv->icon_address); + /* FIXME: we need to put this somewhere inside src?/ + eb = ephy_shell_get_bookmarks (ephy_shell); + ephy_bookmarks_set_icon (eb, priv->address, + priv->icon_address);*/ + + mozilla_embed_load_icon (embed); + } + + g_object_notify (object, "icon-address"); +} + +static void +mozilla_embed_favicon_cb (EphyEmbed *embed, + const char *address, + MozillaEmbed *membed) +{ + mozilla_embed_set_icon_address (membed, address); } static gboolean |