From ff56aed70b99a4395fac4b7f504a70d24582b295 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Mon, 20 May 2013 00:45:27 +0200 Subject: [PATCH] Added support for favicons (requires WebKit 1.8) --- src/callbacks.c | 1 + src/ghtml-webkit.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++ src/ghtml.h | 3 ++- src/surfer.c | 25 +++++++++++++++-- src/surfer.h | 3 ++- 5 files changed, 95 insertions(+), 4 deletions(-) diff --git a/src/callbacks.c b/src/callbacks.c index ba50aae..4f31cc7 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -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); diff --git a/src/ghtml-webkit.c b/src/ghtml-webkit.c index bcd73f0..e0e808a 100644 --- a/src/ghtml-webkit.c +++ b/src/ghtml-webkit.c @@ -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) diff --git a/src/ghtml.h b/src/ghtml.h index 1634c44..5d850dc 100644 --- a/src/ghtml.h +++ b/src/ghtml.h @@ -1,5 +1,5 @@ /* $Id$ */ -/* Copyright (c) 2008-2012 Pierre Pronchery */ +/* Copyright (c) 2008-2013 Pierre Pronchery */ /* 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); diff --git a/src/surfer.c b/src/surfer.c index 5fbfb9f..56efc55 100644 --- a/src/surfer.c +++ b/src/surfer.c @@ -1,6 +1,6 @@ /* $Id$ */ static char const _copyright[] = -"Copyright (c) 2006-2012 Pierre Pronchery "; +"Copyright (c) 2006-2013 Pierre Pronchery "; /* 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 ."; /* 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) { diff --git a/src/surfer.h b/src/surfer.h index 0f1e8de..0df1078 100644 --- a/src/surfer.h +++ b/src/surfer.h @@ -1,5 +1,5 @@ /* $Id$ */ -/* Copyright (c) 2006-2012 Pierre Pronchery */ +/* Copyright (c) 2006-2013 Pierre Pronchery */ /* 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);