Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commit75c9f970bf9bb09439f02d58f08eb63ba5e53ee7 (patch)
Author
 Syndamia <kamen@syndamia.com>
2022-06-13 13:15:12 +0300
Committer
 Syndamia <kamen@syndamia.com>
2022-06-13 13:15:12 +0300
Fileseead858a3c29ad6380233783bfd84a78a469b7dc
goodwolf-75c9f970bf9bb09439f02d58f08eb63ba5e53ee7.tar
goodwolf-75c9f970bf9bb09439f02d58f08eb63ba5e53ee7.tar.gz
goodwolf-75c9f970bf9bb09439f02d58f08eb63ba5e53ee7.zip
Parent6e9679c1f6fe3b64ebbeb4a94dcc0060b3e6356d (diff)
badwolf: Added favicons to tabs
1 files changed, 50 insertions, 0 deletions
-rw-r--r--badwolf.c50
diff --git a/badwolf.c b/badwolf.c
index afb1f2a..98ba72b 100644
--- a/badwolf.c
+++ b/badwolf.c
@@ -35,6 +35,8 @@ WebViewCb_notify__uri(WebKitWebView *webView, GParamSpec *pspec, gpointer user_d
static gboolean
WebViewCb_notify__title(WebKitWebView *webView, GParamSpec *pspec, gpointer user_data);
static gboolean
+WebViewCb_notify__favicon(WebKitWebView *webView, GParamSpec *pspec, gpointer user_data);
+static gboolean
WebViewCb_notify__is__playing__audio(WebKitWebView *webView, GParamSpec *pspec, gpointer user_data);
static gboolean WebViewCb_notify__estimated_load_progress(WebKitWebView *webView,
GParamSpec *pspec,
@@ -133,6 +135,23 @@ WebViewCb_notify__uri(WebKitWebView *webView, GParamSpec *pspec, gpointer user_d
return TRUE;
}
+cairo_surface_t* scale_favicon(cairo_surface_t *f, double pixel_size)
+{
+ cairo_surface_t *result = cairo_surface_create_similar(f,
+ cairo_surface_get_content(f),
+ (int)pixel_size,
+ (int)pixel_size);
+ cairo_t *cr = cairo_create(result);
+ cairo_scale(cr,
+ pixel_size/cairo_image_surface_get_width(f),
+ pixel_size/cairo_image_surface_get_height(f));
+ cairo_set_source_surface(cr, f, 0, 0);
+ cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
+ cairo_paint(cr);
+ cairo_destroy(cr);
+ return result;
+}
+
GtkWidget *
badwolf_new_tab_box(const gchar *title, struct Client *browser)
{
@@ -148,6 +167,17 @@ badwolf_new_tab_box(const gchar *title, struct Client *browser)
GtkWidget *close =
gtk_button_new_from_icon_name("window-close-symbolic", GTK_ICON_SIZE_LARGE_TOOLBAR);
gtk_widget_set_name(close, "browser__tabbox__close");
+ cairo_surface_t *favicon_image = NULL;
+ if (webkit_web_view_get_favicon(browser->webView) != NULL)
+ {
+ gint height = 0;
+ gtk_icon_size_lookup(GTK_ICON_SIZE_SMALL_TOOLBAR, NULL, &height);
+ favicon_image = scale_favicon(webkit_web_view_get_favicon(browser->webView), height);
+ }
+ GtkWidget *favicon = gtk_image_new_from_surface(favicon_image);
+ gtk_widget_set_name(favicon, "browser__tabbox__favicon");
+ GtkWidget *favicon_event_box = gtk_event_box_new();
+ gtk_container_add(GTK_CONTAINER(favicon_event_box), favicon);
GtkWidget *label = gtk_label_new(title);
gtk_widget_set_name(label, "browser__tabbox__label");
GtkWidget *label_event_box = gtk_event_box_new();
@@ -176,6 +206,8 @@ badwolf_new_tab_box(const gchar *title, struct Client *browser)
gtk_box_pack_start(GTK_BOX(tab_box), context_label_event_box, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(tab_box), playing_event_box, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(tab_box), favicon_event_box, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(tab_box), favicon, FALSE, FALSE, 0);
gtk_box_pack_start(GTK_BOX(tab_box), label_event_box, TRUE, TRUE, 0);
gtk_box_pack_start(GTK_BOX(tab_box), close, FALSE, FALSE, 0);
@@ -218,6 +250,18 @@ WebViewCb_notify__is__playing__audio(WebKitWebView *webView, GParamSpec *pspec,
return TRUE;
}
+static gboolean
+WebViewCb_notify__favicon(WebKitWebView *webView, GParamSpec *pspec, gpointer user_data)
+{
+ (void)webView;
+ (void)pspec;
+ struct Client *browser = (struct Client *)user_data;
+
+ webView_tab_label_change(browser, NULL);
+
+ return TRUE;
+}
+
void
webView_tab_label_change(struct Client *browser, const gchar *title)
{
@@ -699,6 +743,7 @@ new_browser(struct Window *window, const gchar *target_url, struct Client *old_b
webkit_web_context_set_process_model(web_context,
WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES);
webkit_web_context_set_web_extensions_directory(web_context, web_extensions_directory);
+ webkit_web_context_set_favicon_database_directory(web_context, NULL);
g_signal_connect(G_OBJECT(web_context),
"download-started",
@@ -865,8 +910,13 @@ new_browser(struct Window *window, const gchar *target_url, struct Client *old_b
G_CALLBACK(WebViewCb_web_process_terminated),
browser);
g_signal_connect(browser->webView, "notify::uri", G_CALLBACK(WebViewCb_notify__uri), browser);
+
g_signal_connect(browser->webView, "notify::title", G_CALLBACK(WebViewCb_notify__title), browser);
g_signal_connect(browser->webView,
+ "notify::favicon",
+ G_CALLBACK(WebViewCb_notify__favicon),
+ browser);
+ g_signal_connect(browser->webView,
"notify::is-playing-audio",
G_CALLBACK(WebViewCb_notify__is__playing__audio),
browser);