Added support for favicons (requires WebKit 1.8)

This commit is contained in:
Pierre Pronchery 2013-05-20 00:45:27 +02:00
parent b860df5155
commit ff56aed70b
5 changed files with 95 additions and 4 deletions

View File

@ -496,6 +496,7 @@ static gboolean _switch_page_idle(gpointer data)
* - change the title (tab)
* - update toolbar buttons */
/* XXX the Surfer fetches the right values by himself => API change? */
surfer_set_favicon(surfer, NULL);
surfer_set_location(surfer, NULL);
surfer_set_progress(surfer, 0.0);
surfer_set_security(surfer, SS_NONE);

View File

@ -47,6 +47,10 @@ typedef struct _GHtml
/* prototypes */
/* functions */
/* accessors */
#if WEBKIT_CHECK_VERSION(1, 1, 18)
static void _ghtml_set_favicon(GtkWidget * widget, char const * icon);
#endif
static void _ghtml_set_status(GtkWidget * widget, char const * status);
/* callbacks */
@ -60,6 +64,9 @@ static gboolean _on_download_requested(WebKitWebView * view,
#endif
static void _on_hovering_over_link(WebKitWebView * view, const gchar * title,
const gchar * url, gpointer data);
#if WEBKIT_CHECK_VERSION(1, 1, 18)
static void _on_icon_load(WebKitWebView * view, gchar * icon, gpointer data);
#endif
static void _on_load_committed(WebKitWebView * view, WebKitWebFrame * frame,
gpointer data);
static gboolean _on_load_error(WebKitWebView * view, WebKitWebFrame * frame,
@ -118,6 +125,10 @@ GtkWidget * ghtml_new(Surfer * surfer)
#endif
g_signal_connect(G_OBJECT(ghtml->view), "hovering-over-link",
G_CALLBACK(_on_hovering_over_link), widget);
#if WEBKIT_CHECK_VERSION(1, 1, 18)
g_signal_connect(G_OBJECT(ghtml->view), "icon-loaded", G_CALLBACK(
_on_icon_load), widget);
#endif
g_signal_connect(G_OBJECT(ghtml->view), "load-committed", G_CALLBACK(
_on_load_committed), widget);
g_signal_connect(G_OBJECT(ghtml->view), "load-error", G_CALLBACK(
@ -212,6 +223,26 @@ gboolean ghtml_can_go_back(GtkWidget * widget)
}
/* ghtml_get_favicon */
GdkPixbuf * ghtml_get_favicon(GtkWidget * widget)
{
GHtml * ghtml;
WebKitWebFrame * frame;
ghtml = g_object_get_data(G_OBJECT(widget), "ghtml");
#if WEBKIT_CHECK_VERSION(1, 8, 0)
if((frame = webkit_web_view_get_main_frame(
WEBKIT_WEB_VIEW(ghtml->view))) != NULL
&& webkit_web_frame_get_uri(frame) != NULL)
return webkit_web_view_try_get_favicon_pixbuf(
WEBKIT_WEB_VIEW(ghtml->view), 16, 16);
#else
/* FIXME implement */
#endif
return NULL;
}
gboolean ghtml_can_go_forward(GtkWidget * widget)
{
GHtml * ghtml;
@ -731,6 +762,32 @@ void ghtml_zoom_reset(GtkWidget * widget)
/* private */
/* functions */
#if WEBKIT_CHECK_VERSION(1, 1, 18)
/* ghtml_set_favicon */
static void _ghtml_set_favicon(GtkWidget * widget, char const * icon)
{
GHtml * ghtml;
GdkPixbuf * pixbuf = NULL;
# if WEBKIT_CHECK_VERSION(1, 8, 0)
WebKitWebFrame * frame;
# endif
ghtml = g_object_get_data(G_OBJECT(widget), "ghtml");
# if WEBKIT_CHECK_VERSION(1, 8, 0)
if((frame = webkit_web_view_get_main_frame(
WEBKIT_WEB_VIEW(ghtml->view))) != NULL
&& webkit_web_frame_get_uri(frame) != NULL)
pixbuf = webkit_web_view_try_get_favicon_pixbuf(
WEBKIT_WEB_VIEW(ghtml->view), 16, 16);
# else
/* FIXME implement */
# endif
surfer_set_favicon(ghtml->surfer, pixbuf);
}
#endif
/* ghtml_set_status */
static void _ghtml_set_status(GtkWidget * widget, char const * status)
{
GHtml * ghtml;
@ -816,6 +873,16 @@ static void _on_hovering_over_link(WebKitWebView * view, const gchar * title,
}
#if WEBKIT_CHECK_VERSION(1, 1, 18)
static void _on_icon_load(WebKitWebView * view, gchar * icon, gpointer data)
{
GtkWidget * widget = data;
_ghtml_set_favicon(widget, icon);
}
#endif
/* on_load_committed */
static void _on_load_committed(WebKitWebView * view, WebKitWebFrame * frame,
gpointer data)

View File

@ -1,5 +1,5 @@
/* $Id$ */
/* Copyright (c) 2008-2012 Pierre Pronchery <khorben@defora.org> */
/* Copyright (c) 2008-2013 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Surfer */
/* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -31,6 +31,7 @@ void ghtml_delete(GtkWidget * ghtml);
gboolean ghtml_can_go_back(GtkWidget * ghtml);
gboolean ghtml_can_go_forward(GtkWidget * ghtml);
GdkPixbuf * ghtml_get_favicon(GtkWidget * ghtml);
char const * ghtml_get_link_message(GtkWidget * ghtml);
char const * ghtml_get_location(GtkWidget * ghtml);
gdouble ghtml_get_progress(GtkWidget * ghtml);

View File

@ -1,6 +1,6 @@
/* $Id$ */
static char const _copyright[] =
"Copyright (c) 2006-2012 Pierre Pronchery <khorben@defora.org>";
"Copyright (c) 2006-2013 Pierre Pronchery <khorben@defora.org>";
/* This file is part of DeforaOS Desktop Surfer */
static char const _license[] =
"This program is free software: you can redistribute it and/or modify\n"
@ -15,7 +15,6 @@ static char const _license[] =
"You should have received a copy of the GNU General Public License\n"
"along with this program. If not, see <http://www.gnu.org/licenses/>.";
/* TODO:
* - implement the favicon
* - support multiple profiles
* - implement "always ask" for the default download directory
* - provide access to SSL information in embedded mode
@ -320,6 +319,7 @@ Surfer * _new_do(char const * url)
group = gtk_accel_group_new();
surfer->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_add_accel_group(GTK_WINDOW(surfer->window), group);
g_object_unref(group);
gtk_window_set_default_size(GTK_WINDOW(surfer->window), 1024, 768);
#if GTK_CHECK_VERSION(2, 6, 0)
gtk_window_set_icon_name(GTK_WINDOW(surfer->window), "web-browser");
@ -532,6 +532,27 @@ void surfer_set_enable_javascript(Surfer * surfer, gboolean enable)
}
/* surfer_set_favicon */
void surfer_set_favicon(Surfer * surfer, GdkPixbuf * pixbuf)
{
GtkWidget * view;
#if GTK_CHECK_VERSION(2, 16, 0)
GtkWidget * widget;
#endif
if((view = surfer_get_view(surfer)) == NULL)
return; /* consider the current tab only */
#if GTK_CHECK_VERSION(2, 16, 0)
widget = gtk_bin_get_child(GTK_BIN(surfer->lb_path));
pixbuf = ghtml_get_favicon(view);
gtk_entry_set_icon_from_pixbuf(GTK_ENTRY(widget),
GTK_ENTRY_ICON_PRIMARY, pixbuf);
#else
/* FIXME implement */
#endif
}
/* surfer_set_fullscreen */
void surfer_set_fullscreen(Surfer * surfer, gboolean fullscreen)
{

View File

@ -1,5 +1,5 @@
/* $Id$ */
/* Copyright (c) 2006-2012 Pierre Pronchery <khorben@defora.org> */
/* Copyright (c) 2006-2013 Pierre Pronchery <khorben@defora.org> */
/* This file is part of DeforaOS Desktop Surfer */
/* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -66,6 +66,7 @@ void surfer_delete(Surfer * surfer);
GtkWidget * surfer_get_view(Surfer * surfer);
void surfer_set_enable_javascript(Surfer * surfer, gboolean enable);
void surfer_set_favicon(Surfer * surfer, GdkPixbuf * pixbuf);
void surfer_set_fullscreen(Surfer * surfer, gboolean fullscreen);
void surfer_set_homepage(Surfer * surfer, char const * homepage);
void surfer_set_location(Surfer * surfer, char const * url);