diff options
author | William Jon McCann <jmccann@redhat.com> | 2009-09-23 01:38:59 -0400 |
---|---|---|
committer | William Jon McCann <jmccann@redhat.com> | 2009-09-23 01:38:59 -0400 |
commit | 457698f8027e79b54053fbc464c887e542553d03 (patch) | |
tree | 3a9f121bff09c05794c3f6429ee1bc38e22c6938 | |
parent | 0412aa6eb0dfcfd5119afa2107574920aa51f66f (diff) |
Mirror the colors around the half-brightness point
-rw-r--r-- | src/theme.c | 224 |
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); } |