[Xfce4-commits] <midori:master> Implement page icon based tab colors

Christian Dywan noreply at xfce.org
Fri Mar 19 21:12:01 CET 2010


Updating branch refs/heads/master
         to 3cbce9896b9fab95b05399680706057aeb4ae96d (commit)
       from 0d27d6f17d06d3862837f159d2b96e75a8f1def8 (commit)

commit 3cbce9896b9fab95b05399680706057aeb4ae96d
Author: Samuel Creshal <creshal at arcor.de>
Date:   Fri Mar 19 21:08:28 2010 +0100

    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.

 extensions/colorful-tabs.c |  110 +++++++++++++++++++++++++++++++++++---------
 1 files changed, 88 insertions(+), 22 deletions(-)

diff --git a/extensions/colorful-tabs.c b/extensions/colorful-tabs.c
index 01a0bd7..d9c108e 100644
--- a/extensions/colorful-tabs.c
+++ b/extensions/colorful-tabs.c
@@ -1,5 +1,6 @@
 /*
  Copyright (C) 2009 Christian Dywan <christian at twotoasts.de>
+ Copyright (C) 2010 Samuel Creshal <creshal at arcor.de>
 
  This library is free software; you can redistribute it and/or
  modify it under the terms of the GNU Lesser General Public
@@ -12,55 +13,117 @@
 #include <midori/midori.h>
 
 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 <christian at twotoasts.de>",
+        "version", "0.5",
+        "authors", "Christian Dywan <christian at twotoasts.de>, Samuel Creshal <creshal at arcor.de>",
         NULL);
 
     g_signal_connect (extension, "activate",



More information about the Xfce4-commits mailing list