| OLD | NEW |
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/gtk/gtk_chrome_button.h" | 5 #include "chrome/browser/gtk/gtk_chrome_button.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/gfx/gtk_util.h" |
| 8 #include "chrome/browser/gtk/nine_box.h" | 9 #include "chrome/browser/gtk/nine_box.h" |
| 9 | 10 |
| 10 #include "grit/app_resources.h" | 11 #include "grit/app_resources.h" |
| 11 | 12 |
| 12 namespace { | 13 namespace { |
| 13 | 14 |
| 14 // The theme graphics for when the mouse is over the button. | 15 // The theme graphics for when the mouse is over the button. |
| 15 NineBox* g_nine_box_prelight; | 16 NineBox* g_nine_box_prelight; |
| 16 // The theme graphics for when the button is clicked. | 17 // The theme graphics for when the button is clicked. |
| 17 NineBox* g_nine_box_active; | 18 NineBox* g_nine_box_active; |
| 18 | 19 |
| 19 } // namespace | 20 } // namespace |
| 20 | 21 |
| 21 G_BEGIN_DECLS | 22 G_BEGIN_DECLS |
| 22 | 23 |
| 23 #define GTK_CHROME_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o),\ | 24 #define GTK_CHROME_BUTTON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o),\ |
| 24 GTK_TYPE_CHROME_BUTTON,\ | 25 GTK_TYPE_CHROME_BUTTON,\ |
| 25 GtkChromeButtonPrivate)) | 26 GtkChromeButtonPrivate)) |
| 26 typedef struct _GtkChromeButtonPrivate GtkChromeButtonPrivate; | 27 typedef struct _GtkChromeButtonPrivate GtkChromeButtonPrivate; |
| 27 | 28 |
| 28 struct _GtkChromeButtonPrivate { | 29 struct _GtkChromeButtonPrivate { |
| 29 int paint_state; | 30 int paint_state; |
| 31 |
| 32 // If true, we use images provided by the theme instead of GTK's default |
| 33 // button rendering. |
| 34 gboolean use_gtk_rendering; |
| 30 }; | 35 }; |
| 31 | 36 |
| 32 G_DEFINE_TYPE(GtkChromeButton, gtk_chrome_button, GTK_TYPE_BUTTON) | 37 G_DEFINE_TYPE(GtkChromeButton, gtk_chrome_button, GTK_TYPE_BUTTON) |
| 33 static gboolean gtk_chrome_button_expose(GtkWidget* widget, | 38 static gboolean gtk_chrome_button_expose(GtkWidget* widget, |
| 34 GdkEventExpose* event); | 39 GdkEventExpose* event); |
| 35 | 40 |
| 36 static void gtk_chrome_button_class_init(GtkChromeButtonClass* button_class) { | 41 static void gtk_chrome_button_class_init(GtkChromeButtonClass* button_class) { |
| 37 GObjectClass* gobject_class = G_OBJECT_CLASS(button_class); | 42 GObjectClass* gobject_class = G_OBJECT_CLASS(button_class); |
| 38 GtkWidgetClass* widget_class = reinterpret_cast<GtkWidgetClass*>(button_class)
; | 43 GtkWidgetClass* widget_class = reinterpret_cast<GtkWidgetClass*>(button_class)
; |
| 39 widget_class->expose_event = gtk_chrome_button_expose; | 44 widget_class->expose_event = gtk_chrome_button_expose; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 59 IDR_TEXTBUTTON_BOTTOM_LEFT_P, | 64 IDR_TEXTBUTTON_BOTTOM_LEFT_P, |
| 60 IDR_TEXTBUTTON_BOTTOM_P, | 65 IDR_TEXTBUTTON_BOTTOM_P, |
| 61 IDR_TEXTBUTTON_BOTTOM_RIGHT_P); | 66 IDR_TEXTBUTTON_BOTTOM_RIGHT_P); |
| 62 | 67 |
| 63 g_type_class_add_private(gobject_class, sizeof(GtkChromeButtonPrivate)); | 68 g_type_class_add_private(gobject_class, sizeof(GtkChromeButtonPrivate)); |
| 64 } | 69 } |
| 65 | 70 |
| 66 static void gtk_chrome_button_init(GtkChromeButton* button) { | 71 static void gtk_chrome_button_init(GtkChromeButton* button) { |
| 67 GtkChromeButtonPrivate* priv = GTK_CHROME_BUTTON_GET_PRIVATE(button); | 72 GtkChromeButtonPrivate* priv = GTK_CHROME_BUTTON_GET_PRIVATE(button); |
| 68 priv->paint_state = -1; | 73 priv->paint_state = -1; |
| 74 priv->use_gtk_rendering = FALSE; |
| 69 | 75 |
| 70 gtk_widget_set_app_paintable(GTK_WIDGET(button), TRUE); | 76 gtk_widget_set_app_paintable(GTK_WIDGET(button), TRUE); |
| 71 | 77 |
| 72 GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); | 78 GTK_WIDGET_UNSET_FLAGS(button, GTK_CAN_FOCUS); |
| 73 } | 79 } |
| 74 | 80 |
| 75 static gboolean gtk_chrome_button_expose(GtkWidget* widget, | 81 static gboolean gtk_chrome_button_expose(GtkWidget* widget, |
| 76 GdkEventExpose* event) { | 82 GdkEventExpose* event) { |
| 77 GtkChromeButtonPrivate *priv = GTK_CHROME_BUTTON_GET_PRIVATE(widget); | 83 GtkChromeButtonPrivate *priv = GTK_CHROME_BUTTON_GET_PRIVATE(widget); |
| 78 int paint_state = priv->paint_state < 0 ? | 84 int paint_state = priv->paint_state < 0 ? |
| 79 GTK_WIDGET_STATE(widget) : priv->paint_state; | 85 GTK_WIDGET_STATE(widget) : priv->paint_state; |
| 80 | 86 |
| 81 NineBox* nine_box = NULL; | 87 if (priv->use_gtk_rendering) { |
| 82 if (paint_state == GTK_STATE_PRELIGHT) | 88 // We have the superclass handle this expose when we aren't using custom |
| 83 nine_box = g_nine_box_prelight; | 89 // rendering AND we're in either the prelight or active state so that we |
| 84 else if (paint_state == GTK_STATE_ACTIVE) | 90 // get the button border for the current GTK theme drawn. |
| 85 nine_box = g_nine_box_active; | 91 if (paint_state == GTK_STATE_PRELIGHT || paint_state == GTK_STATE_ACTIVE) { |
| 92 (*GTK_WIDGET_CLASS(gtk_chrome_button_parent_class)->expose_event) |
| 93 (widget, event); |
| 94 } else { |
| 95 // Otherwise, we're still responsible for rendering our children. |
| 96 gtk_container_propagate_expose(GTK_CONTAINER(widget), |
| 97 gtk_bin_get_child(GTK_BIN(widget)), |
| 98 event); |
| 99 } |
| 100 } else { |
| 101 NineBox* nine_box = NULL; |
| 102 if (paint_state == GTK_STATE_PRELIGHT) |
| 103 nine_box = g_nine_box_prelight; |
| 104 else if (paint_state == GTK_STATE_ACTIVE) |
| 105 nine_box = g_nine_box_active; |
| 86 | 106 |
| 87 // Only draw theme graphics if we have some. | 107 // Only draw theme graphics if we have some. |
| 88 if (nine_box) | 108 if (nine_box) |
| 89 nine_box->RenderToWidget(widget); | 109 nine_box->RenderToWidget(widget); |
| 90 | 110 |
| 91 gtk_container_propagate_expose(GTK_CONTAINER(widget), | 111 gtk_container_propagate_expose(GTK_CONTAINER(widget), |
| 92 gtk_bin_get_child(GTK_BIN(widget)), | 112 gtk_bin_get_child(GTK_BIN(widget)), |
| 93 event); | 113 event); |
| 114 } |
| 94 | 115 |
| 95 return TRUE; // Don't propagate, we are the default handler. | 116 return TRUE; // Don't propagate, we are the default handler. |
| 96 } | 117 } |
| 97 | 118 |
| 98 GtkWidget* gtk_chrome_button_new(void) { | 119 GtkWidget* gtk_chrome_button_new(void) { |
| 99 return GTK_WIDGET(g_object_new(GTK_TYPE_CHROME_BUTTON, NULL)); | 120 return GTK_WIDGET(g_object_new(GTK_TYPE_CHROME_BUTTON, NULL)); |
| 100 } | 121 } |
| 101 | 122 |
| 102 void gtk_chrome_button_set_paint_state(GtkChromeButton* button, | 123 void gtk_chrome_button_set_paint_state(GtkChromeButton* button, |
| 103 GtkStateType state) { | 124 GtkStateType state) { |
| 104 g_return_if_fail(GTK_IS_CHROME_BUTTON(button)); | 125 g_return_if_fail(GTK_IS_CHROME_BUTTON(button)); |
| 105 | 126 |
| 106 GtkChromeButtonPrivate *priv = GTK_CHROME_BUTTON_GET_PRIVATE(button); | 127 GtkChromeButtonPrivate *priv = GTK_CHROME_BUTTON_GET_PRIVATE(button); |
| 107 priv->paint_state = state; | 128 priv->paint_state = state; |
| 108 | 129 |
| 109 gtk_widget_queue_draw(GTK_WIDGET(button)); | 130 gtk_widget_queue_draw(GTK_WIDGET(button)); |
| 110 } | 131 } |
| 111 | 132 |
| 112 void gtk_chrome_button_unset_paint_state(GtkChromeButton* button) { | 133 void gtk_chrome_button_unset_paint_state(GtkChromeButton* button) { |
| 113 g_return_if_fail(GTK_IS_CHROME_BUTTON(button)); | 134 g_return_if_fail(GTK_IS_CHROME_BUTTON(button)); |
| 114 | 135 |
| 115 GtkChromeButtonPrivate *priv = GTK_CHROME_BUTTON_GET_PRIVATE(button); | 136 GtkChromeButtonPrivate *priv = GTK_CHROME_BUTTON_GET_PRIVATE(button); |
| 116 priv->paint_state = -1; | 137 priv->paint_state = -1; |
| 117 | 138 |
| 118 gtk_widget_queue_draw(GTK_WIDGET(button)); | 139 gtk_widget_queue_draw(GTK_WIDGET(button)); |
| 119 } | 140 } |
| 120 | 141 |
| 142 void gtk_chrome_button_set_use_gtk_rendering(GtkChromeButton* button, |
| 143 gboolean value) { |
| 144 g_return_if_fail(GTK_IS_CHROME_BUTTON(button)); |
| 145 GtkChromeButtonPrivate *priv = GTK_CHROME_BUTTON_GET_PRIVATE(button); |
| 146 priv->use_gtk_rendering = value; |
| 147 } |
| 148 |
| 121 G_END_DECLS | 149 G_END_DECLS |
| OLD | NEW |