Index: chrome/browser/gtk/gtk_chrome_button.cc |
diff --git a/chrome/browser/gtk/gtk_chrome_button.cc b/chrome/browser/gtk/gtk_chrome_button.cc |
index 558e6108c52fb625f7de8420894bcef51cf69854..6b35716bf9af0ad1183299737f5f16151f12114f 100644 |
--- a/chrome/browser/gtk/gtk_chrome_button.cc |
+++ b/chrome/browser/gtk/gtk_chrome_button.cc |
@@ -5,6 +5,7 @@ |
#include "chrome/browser/gtk/gtk_chrome_button.h" |
#include "base/basictypes.h" |
+#include "base/gfx/gtk_util.h" |
#include "chrome/browser/gtk/nine_box.h" |
#include "grit/app_resources.h" |
@@ -27,6 +28,10 @@ typedef struct _GtkChromeButtonPrivate GtkChromeButtonPrivate; |
struct _GtkChromeButtonPrivate { |
int paint_state; |
+ |
+ // If true, we use images provided by the theme instead of GTK's default |
+ // button rendering. |
+ gboolean use_gtk_rendering; |
}; |
G_DEFINE_TYPE(GtkChromeButton, gtk_chrome_button, GTK_TYPE_BUTTON) |
@@ -66,6 +71,7 @@ static void gtk_chrome_button_class_init(GtkChromeButtonClass* button_class) { |
static void gtk_chrome_button_init(GtkChromeButton* button) { |
GtkChromeButtonPrivate* priv = GTK_CHROME_BUTTON_GET_PRIVATE(button); |
priv->paint_state = -1; |
+ priv->use_gtk_rendering = FALSE; |
gtk_widget_set_app_paintable(GTK_WIDGET(button), TRUE); |
@@ -78,19 +84,34 @@ static gboolean gtk_chrome_button_expose(GtkWidget* widget, |
int paint_state = priv->paint_state < 0 ? |
GTK_WIDGET_STATE(widget) : priv->paint_state; |
- NineBox* nine_box = NULL; |
- if (paint_state == GTK_STATE_PRELIGHT) |
- nine_box = g_nine_box_prelight; |
- else if (paint_state == GTK_STATE_ACTIVE) |
- nine_box = g_nine_box_active; |
- |
- // Only draw theme graphics if we have some. |
- if (nine_box) |
- nine_box->RenderToWidget(widget); |
- |
- gtk_container_propagate_expose(GTK_CONTAINER(widget), |
- gtk_bin_get_child(GTK_BIN(widget)), |
- event); |
+ if (priv->use_gtk_rendering) { |
+ // We have the superclass handle this expose when we aren't using custom |
+ // rendering AND we're in either the prelight or active state so that we |
+ // get the button border for the current GTK theme drawn. |
+ if (paint_state == GTK_STATE_PRELIGHT || paint_state == GTK_STATE_ACTIVE) { |
+ (*GTK_WIDGET_CLASS(gtk_chrome_button_parent_class)->expose_event) |
+ (widget, event); |
+ } else { |
+ // Otherwise, we're still responsible for rendering our children. |
+ gtk_container_propagate_expose(GTK_CONTAINER(widget), |
+ gtk_bin_get_child(GTK_BIN(widget)), |
+ event); |
+ } |
+ } else { |
+ NineBox* nine_box = NULL; |
+ if (paint_state == GTK_STATE_PRELIGHT) |
+ nine_box = g_nine_box_prelight; |
+ else if (paint_state == GTK_STATE_ACTIVE) |
+ nine_box = g_nine_box_active; |
+ |
+ // Only draw theme graphics if we have some. |
+ if (nine_box) |
+ nine_box->RenderToWidget(widget); |
+ |
+ gtk_container_propagate_expose(GTK_CONTAINER(widget), |
+ gtk_bin_get_child(GTK_BIN(widget)), |
+ event); |
+ } |
return TRUE; // Don't propagate, we are the default handler. |
} |
@@ -118,4 +139,11 @@ void gtk_chrome_button_unset_paint_state(GtkChromeButton* button) { |
gtk_widget_queue_draw(GTK_WIDGET(button)); |
} |
+void gtk_chrome_button_set_use_gtk_rendering(GtkChromeButton* button, |
+ gboolean value) { |
+ g_return_if_fail(GTK_IS_CHROME_BUTTON(button)); |
+ GtkChromeButtonPrivate *priv = GTK_CHROME_BUTTON_GET_PRIVATE(button); |
+ priv->use_gtk_rendering = value; |
+} |
+ |
G_END_DECLS |