diff options
| Commit | 75c9f970bf9bb09439f02d58f08eb63ba5e53ee7 (patch) | |
|---|---|---|
| Author | 2022-06-13 13:15:12 +0300 | |
| Committer | 2022-06-13 13:15:12 +0300 | |
| Files | eead858a3c29ad6380233783bfd84a78a469b7dc | |
| goodwolf-75c9f970bf9bb09439f02d58f08eb63ba5e53ee7.tar goodwolf-75c9f970bf9bb09439f02d58f08eb63ba5e53ee7.tar.gz goodwolf-75c9f970bf9bb09439f02d58f08eb63ba5e53ee7.zip | ||
| Parent | 6e9679c1f6fe3b64ebbeb4a94dcc0060b3e6356d (diff) | |
badwolf: Added favicons to tabs
1 files changed, 50 insertions, 0 deletions
| -rw-r--r-- | badwolf.c | 50 |
@@ -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); |