| Index: chrome/browser/ui/libgtk2ui/gtk2_ui.cc
|
| diff --git a/chrome/browser/ui/libgtk2ui/gtk2_ui.cc b/chrome/browser/ui/libgtk2ui/gtk2_ui.cc
|
| index 6f9e94100ee88bd8bdaf49128a54c00bd9f9ee8b..d2f84324ef6e1904e42feab82b3a522738060881 100644
|
| --- a/chrome/browser/ui/libgtk2ui/gtk2_ui.cc
|
| +++ b/chrome/browser/ui/libgtk2ui/gtk2_ui.cc
|
| @@ -181,21 +181,21 @@ const int kAutocompleteImages[] = {
|
| struct IDRGtkMapping {
|
| int idr;
|
| const char* stock_id;
|
| - GtkStateType gtk_state;
|
| + GtkStateFlags gtk_state;
|
| } const kGtkIcons[] = {
|
| - { IDR_BACK, GTK_STOCK_GO_BACK, GTK_STATE_NORMAL },
|
| - { IDR_BACK_D, GTK_STOCK_GO_BACK, GTK_STATE_INSENSITIVE },
|
| + { IDR_BACK, GTK_STOCK_GO_BACK, GTK_STATE_FLAG_NORMAL },
|
| + { IDR_BACK_D, GTK_STOCK_GO_BACK, GTK_STATE_FLAG_INSENSITIVE },
|
|
|
| - { IDR_FORWARD, GTK_STOCK_GO_FORWARD, GTK_STATE_NORMAL },
|
| - { IDR_FORWARD_D, GTK_STOCK_GO_FORWARD, GTK_STATE_INSENSITIVE },
|
| + { IDR_FORWARD, GTK_STOCK_GO_FORWARD, GTK_STATE_FLAG_NORMAL },
|
| + { IDR_FORWARD_D, GTK_STOCK_GO_FORWARD, GTK_STATE_FLAG_INSENSITIVE },
|
|
|
| - { IDR_HOME, GTK_STOCK_HOME, GTK_STATE_NORMAL },
|
| + { IDR_HOME, GTK_STOCK_HOME, GTK_STATE_FLAG_NORMAL },
|
|
|
| - { IDR_RELOAD, GTK_STOCK_REFRESH, GTK_STATE_NORMAL },
|
| - { IDR_RELOAD_D, GTK_STOCK_REFRESH, GTK_STATE_INSENSITIVE },
|
| + { IDR_RELOAD, GTK_STOCK_REFRESH, GTK_STATE_FLAG_NORMAL },
|
| + { IDR_RELOAD_D, GTK_STOCK_REFRESH, GTK_STATE_FLAG_INSENSITIVE },
|
|
|
| - { IDR_STOP, GTK_STOCK_STOP, GTK_STATE_NORMAL },
|
| - { IDR_STOP_D, GTK_STOCK_STOP, GTK_STATE_INSENSITIVE },
|
| + { IDR_STOP, GTK_STOCK_STOP, GTK_STATE_FLAG_NORMAL },
|
| + { IDR_STOP_D, GTK_STOCK_STOP, GTK_STATE_FLAG_INSENSITIVE },
|
| };
|
|
|
| // The image resources that will be tinted by the 'button' tint value.
|
| @@ -772,90 +772,6 @@ void Gtk2UI::GetScrollbarColors(GdkColor* thumb_active_color,
|
| gdk_color_free(theme_trough_color);
|
| 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
|
| - const int kWidth = 100;
|
| - const int kHeight = 20;
|
| - GtkStyle* style = gtk_rc_get_style(scrollbar);
|
| - GdkWindow* gdk_window = gtk_widget_get_window(window);
|
| - GdkPixmap* pm = gdk_pixmap_new(gdk_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);
|
| -
|
| - // Override any of the default colors with ones that were specified by the
|
| - // theme.
|
| - if (theme_thumb_active) {
|
| - *thumb_active_color = *theme_thumb_active;
|
| - gdk_color_free(theme_thumb_active);
|
| - }
|
| -
|
| - if (theme_thumb_inactive) {
|
| - *thumb_inactive_color = *theme_thumb_inactive;
|
| - gdk_color_free(theme_thumb_inactive);
|
| - }
|
| -
|
| - if (theme_trough_color) {
|
| - *track_color = *theme_trough_color;
|
| - gdk_color_free(theme_trough_color);
|
| - }
|
| }
|
|
|
| void Gtk2UI::LoadGtkValues() {
|
| @@ -1143,9 +1059,9 @@ SkBitmap Gtk2UI::GenerateGtkThemeBitmap(int id) const {
|
| return GenerateGTKIcon(id);
|
| }
|
| case IDR_TOOLBAR_BEZEL_HOVER:
|
| - return GenerateToolbarBezel(GTK_STATE_PRELIGHT, IDR_TOOLBAR_BEZEL_HOVER);
|
| + return GenerateToolbarBezel(GTK_STATE_FLAG_PRELIGHT, IDR_TOOLBAR_BEZEL_HOVER);
|
| case IDR_TOOLBAR_BEZEL_PRESSED:
|
| - return GenerateToolbarBezel(GTK_STATE_ACTIVE, IDR_TOOLBAR_BEZEL_PRESSED);
|
| + return GenerateToolbarBezel(GTK_STATE_FLAG_ACTIVE, IDR_TOOLBAR_BEZEL_PRESSED);
|
| default: {
|
| return GenerateTintedIcon(id, button_tint_);
|
| }
|
| @@ -1213,7 +1129,7 @@ SkBitmap Gtk2UI::GenerateTintedIcon(
|
|
|
| SkBitmap Gtk2UI::GenerateGTKIcon(int base_id) const {
|
| const char* stock_id = NULL;
|
| - GtkStateType gtk_state = GTK_STATE_NORMAL;
|
| + GtkStateFlags gtk_state = GTK_STATE_FLAG_NORMAL;
|
| for (unsigned int i = 0; i < arraysize(kGtkIcons); ++i) {
|
| if (kGtkIcons[i].idr == base_id) {
|
| stock_id = kGtkIcons[i].stock_id;
|
| @@ -1237,7 +1153,7 @@ SkBitmap Gtk2UI::GenerateGTKIcon(int base_id) const {
|
| icon_set,
|
| style,
|
| base::i18n::IsRTL() ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR,
|
| - gtk_state,
|
| + gtk_state == GTK_STATE_FLAG_INSENSITIVE ? GTK_STATE_INSENSITIVE : GTK_STATE_NORMAL,
|
| GTK_ICON_SIZE_SMALL_TOOLBAR,
|
| fake_frame_,
|
| NULL);
|
| @@ -1258,15 +1174,6 @@ SkBitmap Gtk2UI::GenerateGTKIcon(int base_id) const {
|
|
|
| SkCanvas canvas(retval);
|
|
|
| - if (gtk_state == GTK_STATE_ACTIVE || gtk_state == GTK_STATE_PRELIGHT) {
|
| - SkBitmap border = DrawGtkButtonBorder(gtk_state,
|
| - false,
|
| - false,
|
| - default_bitmap.width(),
|
| - default_bitmap.height());
|
| - canvas.drawBitmap(border, 0, 0);
|
| - }
|
| -
|
| canvas.drawBitmap(icon,
|
| (default_bitmap.width() / 2) - (icon.width() / 2),
|
| (default_bitmap.height() / 2) - (icon.height() / 2));
|
| @@ -1286,8 +1193,6 @@ SkBitmap Gtk2UI::GenerateToolbarBezel(int gtk_state, int sizing_idr) const {
|
| SkCanvas canvas(retval);
|
| SkBitmap border = DrawGtkButtonBorder(
|
| gtk_state,
|
| - false,
|
| - false,
|
| default_bitmap.width(),
|
| default_bitmap.height());
|
| canvas.drawBitmap(border, 0, 0);
|
| @@ -1327,13 +1232,19 @@ void Gtk2UI::GetSelectedEntryForegroundHSL(color_utils::HSL* tint) const {
|
| }
|
|
|
| SkBitmap Gtk2UI::DrawGtkButtonBorder(int gtk_state,
|
| - bool focused,
|
| - bool call_to_action,
|
| int width,
|
| int height) const {
|
| + SkBitmap border;
|
| + border.allocN32Pixels(width, height);
|
| + border.eraseColor(0);
|
| +
|
| // Create a temporary GTK button to snapshot
|
| GtkWidget* window = gtk_offscreen_window_new();
|
| - GtkWidget* button = gtk_button_new();
|
| + GtkWidget* button = gtk_toggle_button_new();
|
| +
|
| + if (gtk_state & GTK_STATE_FLAG_ACTIVE)
|
| + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), true);
|
| +
|
| gtk_widget_set_size_request(button, width, height);
|
| gtk_container_add(GTK_CONTAINER(window), button);
|
| gtk_widget_realize(window);
|
| @@ -1341,41 +1252,19 @@ SkBitmap Gtk2UI::DrawGtkButtonBorder(int gtk_state,
|
| gtk_widget_show(button);
|
| gtk_widget_show(window);
|
|
|
| - if (call_to_action)
|
| - GTK_WIDGET_SET_FLAGS(button, GTK_HAS_DEFAULT);
|
| + gtk_widget_set_state_flags(button, (GtkStateFlags)gtk_state, FALSE);
|
|
|
| - if (focused) {
|
| - // We can't just use gtk_widget_grab_focus() here because that sets
|
| - // gtk_widget_is_focus(), but not gtk_widget_has_focus(), which is what the
|
| - // GtkButton's paint checks.
|
| - GTK_WIDGET_SET_FLAGS(button, GTK_HAS_FOCUS);
|
| - }
|
| + cairo_surface_t* surface = cairo_image_surface_create_for_data(
|
| + static_cast<unsigned char*>(border.getAddr(0, 0)),
|
| + CAIRO_FORMAT_ARGB32,
|
| + width, height,
|
| + width * 4);
|
| + cairo_t* cr = cairo_create(surface);
|
|
|
| - gtk_widget_set_state(button, static_cast<GtkStateType>(gtk_state));
|
| + gtk_widget_draw(button, cr);
|
|
|
| - GdkPixmap* pixmap;
|
| - {
|
| - // http://crbug.com/346740
|
| - ANNOTATE_SCOPED_MEMORY_LEAK;
|
| - pixmap = gtk_widget_get_snapshot(button, NULL);
|
| - }
|
| - int w, h;
|
| - gdk_drawable_get_size(GDK_DRAWABLE(pixmap), &w, &h);
|
| - DCHECK_EQ(w, width);
|
| - DCHECK_EQ(h, height);
|
| -
|
| - // We render the Pixmap to a Pixbuf. This can be slow, as we're scrapping
|
| - // bits from X.
|
| - GdkColormap* colormap = gdk_drawable_get_colormap(pixmap);
|
| - GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable(NULL,
|
| - GDK_DRAWABLE(pixmap),
|
| - colormap,
|
| - 0, 0, 0, 0, w, h);
|
| -
|
| - // Finally, we convert our pixbuf into a type we can use.
|
| - SkBitmap border = GdkPixbufToImageSkia(pixbuf);
|
| - g_object_unref(pixbuf);
|
| - g_object_unref(pixmap);
|
| + cairo_destroy(cr);
|
| + cairo_surface_destroy(surface);
|
| gtk_widget_destroy(window);
|
|
|
| return border;
|
|
|