summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWilliam Jon McCann <jmccann@redhat.com>2009-09-23 01:38:59 -0400
committerWilliam Jon McCann <jmccann@redhat.com>2009-09-23 01:38:59 -0400
commit457698f8027e79b54053fbc464c887e542553d03 (patch)
tree3a9f121bff09c05794c3f6429ee1bc38e22c6938
parent0412aa6eb0dfcfd5119afa2107574920aa51f66f (diff)
Mirror the colors around the half-brightness point
-rw-r--r--src/theme.c224
1 files changed, 215 insertions, 9 deletions
diff --git a/src/theme.c b/src/theme.c
index a62e95b..1d179d8 100644
--- a/src/theme.c
+++ b/src/theme.c
@@ -156,7 +156,7 @@ fill_background (GtkWidget *widget,
widget->allocation.width - 2,
widget->allocation.height - 2);
- color = widget->style->bg [GTK_STATE_NORMAL];
+ color = widget->style->light [GTK_STATE_NORMAL];
r = (float)color.red / 65535.0;
g = (float)color.green / 65535.0;
b = (float)color.blue / 65535.0;
@@ -170,7 +170,7 @@ fill_background (GtkWidget *widget,
case URGENCY_LOW:
case URGENCY_NORMAL:
default:
- color = widget->style->dark [GTK_STATE_SELECTED];
+ color = widget->style->text_aa [GTK_STATE_NORMAL];
break;
}
@@ -292,19 +292,225 @@ configure_event_cb (GtkWidget *nw,
return FALSE;
}
+/* copied from gtkstyle.c */
static void
-invert_style (GtkWidget *widget)
+rgb_to_hls (gdouble *r,
+ gdouble *g,
+ gdouble *b)
+{
+ gdouble min;
+ gdouble max;
+ gdouble red;
+ gdouble green;
+ gdouble blue;
+ gdouble h, l, s;
+ gdouble delta;
+
+ red = *r;
+ green = *g;
+ blue = *b;
+
+ if (red > green)
+ {
+ if (red > blue)
+ max = red;
+ else
+ max = blue;
+
+ if (green < blue)
+ min = green;
+ else
+ min = blue;
+ }
+ else
+ {
+ if (green > blue)
+ max = green;
+ else
+ max = blue;
+
+ if (red < blue)
+ min = red;
+ else
+ min = blue;
+ }
+
+ l = (max + min) / 2;
+ s = 0;
+ h = 0;
+
+ if (max != min)
+ {
+ if (l <= 0.5)
+ s = (max - min) / (max + min);
+ else
+ s = (max - min) / (2 - max - min);
+
+ delta = max -min;
+ if (red == max)
+ h = (green - blue) / delta;
+ else if (green == max)
+ h = 2 + (blue - red) / delta;
+ else if (blue == max)
+ h = 4 + (red - green) / delta;
+
+ h *= 60;
+ if (h < 0.0)
+ h += 360;
+ }
+
+ *r = h;
+ *g = l;
+ *b = s;
+}
+
+/* copied from gtkstyle.c */
+static void
+hls_to_rgb (gdouble *h,
+ gdouble *l,
+ gdouble *s)
+{
+ gdouble hue;
+ gdouble lightness;
+ gdouble saturation;
+ gdouble m1, m2;
+ gdouble r, g, b;
+
+ lightness = *l;
+ saturation = *s;
+
+ if (lightness <= 0.5)
+ m2 = lightness * (1 + saturation);
+ else
+ m2 = lightness + saturation - lightness * saturation;
+ m1 = 2 * lightness - m2;
+
+ if (saturation == 0)
+ {
+ *h = lightness;
+ *l = lightness;
+ *s = lightness;
+ }
+ else
+ {
+ hue = *h + 120;
+ while (hue > 360)
+ hue -= 360;
+ while (hue < 0)
+ hue += 360;
+
+ if (hue < 60)
+ r = m1 + (m2 - m1) * hue / 60;
+ else if (hue < 180)
+ r = m2;
+ else if (hue < 240)
+ r = m1 + (m2 - m1) * (240 - hue) / 60;
+ else
+ r = m1;
+
+ hue = *h;
+ while (hue > 360)
+ hue -= 360;
+ while (hue < 0)
+ hue += 360;
+
+ if (hue < 60)
+ g = m1 + (m2 - m1) * hue / 60;
+ else if (hue < 180)
+ g = m2;
+ else if (hue < 240)
+ g = m1 + (m2 - m1) * (240 - hue) / 60;
+ else
+ g = m1;
+
+ hue = *h - 120;
+ while (hue > 360)
+ hue -= 360;
+ while (hue < 0)
+ hue += 360;
+
+ if (hue < 60)
+ b = m1 + (m2 - m1) * hue / 60;
+ else if (hue < 180)
+ b = m2;
+ else if (hue < 240)
+ b = m1 + (m2 - m1) * (240 - hue) / 60;
+ else
+ b = m1;
+
+ *h = r;
+ *l = g;
+ *s = b;
+ }
+}
+
+static void
+color_reverse (const GdkColor *a,
+ GdkColor *b)
+{
+ gdouble red;
+ gdouble green;
+ gdouble blue;
+
+ red = (gdouble) a->red / 65535.0;
+ green = (gdouble) a->green / 65535.0;
+ blue = (gdouble) a->blue / 65535.0;
+
+ rgb_to_hls (&red, &green, &blue);
+
+ green = 0.5 + (0.5 - green);
+ if (green > 1.0)
+ green = 1.0;
+ else if (green < 0.0)
+ green = 0.0;
+
+ hls_to_rgb (&red, &green, &blue);
+
+ b->red = red * 65535.0;
+ b->green = green * 65535.0;
+ b->blue = blue * 65535.0;
+}
+
+static void
+override_style (GtkWidget *widget,
+ GtkStyle *previous_style)
{
GtkStateType state;
GtkStyle *style;
+ GdkColor fg;
+ GdkColor bg;
style = gtk_style_copy (widget->style);
- state = (GtkStateType) 0;
- while (state < (GtkStateType) G_N_ELEMENTS (widget->style->bg)) {
- gtk_widget_modify_bg (widget, state, &style->fg[state]);
- gtk_widget_modify_fg (widget, state, &style->bg[state]);
- state++;
+ if (previous_style == NULL
+ || (previous_style != NULL
+ && (previous_style->bg[GTK_STATE_NORMAL].red != style->bg[GTK_STATE_NORMAL].red
+ || previous_style->bg[GTK_STATE_NORMAL].green != style->bg[GTK_STATE_NORMAL].green
+ || previous_style->bg[GTK_STATE_NORMAL].blue != style->bg[GTK_STATE_NORMAL].blue))) {
+
+ color_reverse (&style->bg[GTK_STATE_NORMAL], &bg);
+
+ state = (GtkStateType) 0;
+ while (state < (GtkStateType) G_N_ELEMENTS (widget->style->bg)) {
+ gtk_widget_modify_bg (widget, state, &bg);
+ state++;
+ }
+
+ }
+
+ if (previous_style == NULL
+ || (previous_style != NULL
+ && (previous_style->fg[GTK_STATE_NORMAL].red != style->fg[GTK_STATE_NORMAL].red
+ || previous_style->fg[GTK_STATE_NORMAL].green != style->fg[GTK_STATE_NORMAL].green
+ || previous_style->fg[GTK_STATE_NORMAL].blue != style->fg[GTK_STATE_NORMAL].blue))) {
+
+ color_reverse (&style->fg[GTK_STATE_NORMAL], &fg);
+
+ state = (GtkStateType) 0;
+ while (state < (GtkStateType) G_N_ELEMENTS (widget->style->fg)) {
+ gtk_widget_modify_fg (widget, state, &fg);
+ state++;
+ }
}
g_object_unref (style);
@@ -316,7 +522,7 @@ style_set_cb (GtkWidget *widget,
WindowData *windata)
{
g_signal_handlers_block_by_func (G_OBJECT(widget), style_set_cb, windata);
- invert_style (widget);
+ override_style (widget, previous_style);
g_signal_handlers_unblock_by_func (G_OBJECT(widget), style_set_cb, windata);
}