From: Samuel Creshal Date: Fri, 19 Mar 2010 20:08:28 +0000 (+0100) Subject: Implement page icon based tab colors X-Git-Url: https://spindle.queued.net/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3cbce9896b9fab95b05399680706057aeb4ae96d;p=midori Implement page icon based tab colors Colorful Tabs now uses the icon of a page as the basis for the tab color, if it has one, otherwise falls back to the previous address based hash. The forground color is also adjusted for dark colored tabs. --- diff --git a/extensions/colorful-tabs.c b/extensions/colorful-tabs.c index 01a0bd7b..d9c108ef 100644 --- a/extensions/colorful-tabs.c +++ b/extensions/colorful-tabs.c @@ -1,5 +1,6 @@ /* Copyright (C) 2009 Christian Dywan + Copyright (C) 2010 Samuel Creshal This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public @@ -11,56 +12,118 @@ #include +static void +colorful_tabs_modify_fg (GtkWidget* child, + GdkColor* color) +{ + if (GTK_IS_LABEL (child)) + { + gtk_widget_modify_fg (child, GTK_STATE_ACTIVE, color); + gtk_widget_modify_fg (child, GTK_STATE_NORMAL, color); + } +} + static void colorful_tabs_view_notify_uri_cb (MidoriView* view, GParamSpec* pspec, MidoriExtension* extension) { + GtkWidget* box; GtkWidget* label; SoupURI* uri; - gchar* hash; gchar* colorstr; GdkColor color; + GdkColor fgcolor; + GdkPixbuf* icon; label = midori_view_get_proxy_tab_label (view); - /* Find a color that is unique to an address. We merely compute - a hash value, pick the first 6 + 1 characters and turn the - first into a hash sign, ie. #8b424b. In case a color is too - dark, we lighten it up a litte. Finally we make the event box - visible and modify its background. */ - - if ((uri = soup_uri_new (midori_view_get_display_uri (view))) && uri->host) + if ((uri = soup_uri_new (midori_view_get_display_uri (view))) + && uri->host && (katze_object_get_enum (view, "load-status") == MIDORI_LOAD_FINISHED)) { - hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, uri->host, -1); + icon = midori_view_get_icon (view); + + if (midori_view_get_icon_uri (view) != NULL) + { + GdkPixbuf* newpix; + guchar* pixels; + + newpix = gdk_pixbuf_scale_simple (icon, 1, 1, GDK_INTERP_BILINEAR); + g_return_if_fail (gdk_pixbuf_get_bits_per_sample (newpix) == 8); + pixels = gdk_pixbuf_get_pixels (newpix); + color.red = pixels[0] * 225; + color.green = pixels[1] * 225; + color.blue = pixels[2] * 225; + } + else + { + gchar* hash = g_compute_checksum_for_string (G_CHECKSUM_MD5, uri->host, 1); + colorstr = g_strndup (hash, 6 + 1); + g_free (hash); + colorstr[0] = '#'; + gdk_color_parse (colorstr, &color); + } soup_uri_free (uri); - colorstr = g_strndup (hash, 6 + 1); - g_free (hash); - colorstr[0] = '#'; - gdk_color_parse (colorstr, &color); - if (color.red < 35000) - color.red += 25000 + (color.blue + 1) / 2; - if (color.green < 35000) - color.green += 25000 + (color.red + 1) / 2; - if (color.blue < 35000) - color.blue += 25000 + (color.green + 1) / 2; + + if ((color.red < 35000) + && (color.green < 35000) + && (color.blue < 35000)) + { + color.red += 20000; + color.green += 20000; + color.blue += 20000; + } + + /* Ensure high contrast by enforcing black/ white text colour. */ + if ((color.red < 41000) + && (color.green < 41000) + && (color.blue < 41000)) + gdk_color_parse ("#fff", &fgcolor); + else + gdk_color_parse ("#000", &fgcolor); + + box = gtk_bin_get_child (GTK_BIN (label)); + gtk_event_box_set_visible_window (GTK_EVENT_BOX (label), TRUE); + + gtk_container_foreach (GTK_CONTAINER (box), + (GtkCallback) colorful_tabs_modify_fg, + &fgcolor); + gtk_widget_modify_bg (label, GTK_STATE_NORMAL, &color); + + if (color.red < 10000) + color.red = 5000; + else + color.red -= 5000; + if (color.blue < 10000) + color.blue = 5000; + else + color.blue -= 5000; + if (color.green < 10000) + color.green = 5000; + else + color.green -= 5000; + gtk_widget_modify_bg (label, GTK_STATE_ACTIVE, &color); } else { gtk_widget_modify_bg (label, GTK_STATE_NORMAL, NULL); gtk_widget_modify_bg (label, GTK_STATE_ACTIVE, NULL); + gtk_container_foreach (GTK_CONTAINER (gtk_bin_get_child (GTK_BIN (label))), + (GtkCallback) colorful_tabs_modify_fg, + NULL); } } + static void colorful_tabs_browser_add_tab_cb (MidoriBrowser* browser, GtkWidget* view, MidoriExtension* extension) { colorful_tabs_view_notify_uri_cb (MIDORI_VIEW (view), NULL, extension); - g_signal_connect (view, "notify::uri", + g_signal_connect (view, "notify::icon", G_CALLBACK (colorful_tabs_view_notify_uri_cb), extension); } @@ -90,6 +153,9 @@ colorful_tabs_deactivate_cb (MidoriExtension* extension, gtk_event_box_set_visible_window (GTK_EVENT_BOX (label), FALSE); gtk_widget_modify_bg (label, GTK_STATE_NORMAL, NULL); gtk_widget_modify_bg (label, GTK_STATE_ACTIVE, NULL); + gtk_container_foreach (GTK_CONTAINER (gtk_bin_get_child (GTK_BIN (label))), + (GtkCallback) colorful_tabs_modify_fg, + NULL); g_signal_handlers_disconnect_by_func ( view, colorful_tabs_view_notify_uri_cb, extension); } @@ -137,8 +203,8 @@ extension_init (void) MidoriExtension* extension = g_object_new (MIDORI_TYPE_EXTENSION, "name", _("Colorful Tabs"), "description", _("Tint each tab distinctly"), - "version", "0.1", - "authors", "Christian Dywan ", + "version", "0.5", + "authors", "Christian Dywan , Samuel Creshal ", NULL); g_signal_connect (extension, "activate",