| Index: chrome/browser/gtk/gtk_theme_provider.cc
|
| ===================================================================
|
| --- chrome/browser/gtk/gtk_theme_provider.cc (revision 34187)
|
| +++ chrome/browser/gtk/gtk_theme_provider.cc (working copy)
|
| @@ -176,6 +176,95 @@
|
| return color;
|
| }
|
|
|
| +void GtkThemeProvider::GetScrollbarColors(GdkColor* thumb_active_color,
|
| + GdkColor* thumb_inactive_color,
|
| + GdkColor* track_color,
|
| + bool use_gtk_theme) {
|
| + if (!use_gtk_theme) {
|
| + // If using the default non-GTK colors, pick some reasonable choices of
|
| + // different greys.
|
| + thumb_active_color->pixel = 0;
|
| + thumb_active_color->red = 64250;
|
| + thumb_active_color->green = 63736;
|
| + thumb_active_color->blue = 62965;
|
| + thumb_inactive_color->pixel = 0;
|
| + thumb_inactive_color->red = 61680;
|
| + thumb_inactive_color->green = 60395;
|
| + thumb_inactive_color->blue = 58853;
|
| + track_color->pixel = 0;
|
| + track_color->red = 58339;
|
| + track_color->green = 56797;
|
| + track_color->blue = 55512;
|
| + return;
|
| + }
|
| +
|
| + // Create window containing scrollbar elements
|
| + GtkWidget* window = gtk_window_new(GTK_WINDOW_POPUP);
|
| + GtkWidget* fixed = gtk_fixed_new();
|
| + GtkWidget* scrollbar = gtk_hscrollbar_new(NULL);
|
| + gtk_container_add(GTK_CONTAINER(window), fixed);
|
| + gtk_container_add(GTK_CONTAINER(fixed), scrollbar);
|
| + gtk_widget_realize(window);
|
| + gtk_widget_realize(scrollbar);
|
| +
|
| + // Draw scrollbar thumb part and track into offscreen image
|
| + int kWidth = 100;
|
| + int kHeight = 20;
|
| + GtkStyle* style = gtk_rc_get_style(scrollbar);
|
| + GdkPixmap* pm = gdk_pixmap_new(window->window, kWidth, kHeight, -1);
|
| + GdkRectangle rect = { 0, 0, kWidth, kHeight };
|
| + unsigned char data[3*kWidth*kHeight];
|
| + for (int i = 0; i < 3; ++i) {
|
| + if (i < 2) {
|
| + // Thumb part
|
| + gtk_paint_slider(style, pm,
|
| + i == 0 ? GTK_STATE_PRELIGHT : GTK_STATE_NORMAL,
|
| + GTK_SHADOW_OUT, &rect, scrollbar, "slider", 0, 0,
|
| + kWidth, kHeight, GTK_ORIENTATION_HORIZONTAL);
|
| + } else {
|
| + // Track
|
| + gtk_paint_box(style, pm, GTK_STATE_ACTIVE, GTK_SHADOW_IN, &rect,
|
| + scrollbar, "trough-upper", 0, 0, kWidth, kHeight);
|
| + }
|
| + GdkPixbuf* pb = gdk_pixbuf_new_from_data(data, GDK_COLORSPACE_RGB,
|
| + FALSE, 8, kWidth, kHeight,
|
| + 3*kWidth, 0, 0);
|
| + gdk_pixbuf_get_from_drawable(pb, pm, NULL, 0, 0, 0, 0, kWidth, kHeight);
|
| +
|
| + // Sample pixels
|
| + int components[3] = { 0 };
|
| + for (int y = 2; y < kHeight-2; ++y) {
|
| + for (int c = 0; c < 3; ++c) {
|
| + // Sample a vertical slice of pixels at about one-thirds from the
|
| + // left edge. This allows us to avoid any fixed graphics that might be
|
| + // located at the edges or in the center of the scrollbar.
|
| + // Each pixel is made up of a red, green, and blue component; taking up
|
| + // a total of three bytes.
|
| + components[c] += data[3*(kWidth/3 + y*kWidth) + c];
|
| + }
|
| + }
|
| + GdkColor* color = i == 0 ? thumb_active_color :
|
| + i == 1 ? thumb_inactive_color :
|
| + track_color;
|
| + color->pixel = 0;
|
| + // We sampled pixels across the full height of the image, ignoring a two
|
| + // pixel border. In some themes, the border has a completely different
|
| + // color which we do not want to factor into our average color computation.
|
| + //
|
| + // We now need to scale the colors from the 0..255 range, to the wider
|
| + // 0..65535 range, and we need to actually compute the average color; so,
|
| + // we divide by the total number of pixels in the sample.
|
| + color->red = components[0] * 65535 / (255*(kHeight-4));
|
| + color->green = components[1] * 65535 / (255*(kHeight-4));
|
| + color->blue = components[2] * 65535 / (255*(kHeight-4));
|
| +
|
| + g_object_unref(pb);
|
| + }
|
| + g_object_unref(pm);
|
| +
|
| + gtk_widget_destroy(window);
|
| +}
|
| +
|
| CairoCachedSurface* GtkThemeProvider::GetSurfaceNamed(
|
| int id, GtkWidget* widget_on_display) {
|
| GdkDisplay* display = gtk_widget_get_display(widget_on_display);
|
|
|