Index: chrome/browser/gtk/find_bar_gtk.cc |
=================================================================== |
--- chrome/browser/gtk/find_bar_gtk.cc (revision 14973) |
+++ chrome/browser/gtk/find_bar_gtk.cc (working copy) |
@@ -11,6 +11,7 @@ |
#include "chrome/browser/find_bar_controller.h" |
#include "chrome/browser/gtk/browser_window_gtk.h" |
#include "chrome/browser/gtk/custom_button.h" |
+#include "chrome/browser/gtk/nine_box.h" |
#include "chrome/browser/gtk/tab_contents_container_gtk.h" |
#include "chrome/browser/tab_contents/web_contents.h" |
#include "chrome/common/gtk_util.h" |
@@ -42,9 +43,36 @@ |
return FALSE; |
} |
+// Get the ninebox that draws the background of |container_|. It is also used |
+// to change the shape of |container_|. The pointer is shared by all instances |
+// of FindBarGtk. |
+const NineBox* GetDialogBackground() { |
+ static NineBox* dialog_backgroun = NULL; |
+ if (!dialog_background) { |
+ dialog_background = new NineBox( |
+ IDR_FIND_DLG_LEFT_BACKGROUND, |
+ IDR_FIND_DLG_MIDDLE_BACKGROUND, |
+ IDR_FIND_DLG_RIGHT_BACKGROUND, |
+ NULL, NULL, NULL, NULL, NULL, NULL); |
+ dialog_background->ChangeWhiteToTransparent(); |
+ } |
+ |
+ return dialog_background; |
} |
-FindBarGtk::FindBarGtk(BrowserWindowGtk* browser) { |
+// Used to handle custom painting of |container_|. |
+gboolean OnExpose(GtkWidget* widget, GdkEventExpose* e, gpointer userdata) { |
+ GetDialogBackground()->RenderToWidget(widget); |
+ GtkWidget* child = gtk_bin_get_child(GTK_BIN(widget)); |
+ if (child) |
+ gtk_container_propagate_expose(GTK_CONTAINER(widget), child, e); |
+ return TRUE; |
+} |
+ |
+} // namespace |
+ |
+FindBarGtk::FindBarGtk(BrowserWindowGtk* browser) |
+ : container_shaped_(false) { |
InitWidgets(); |
// Insert the widget into the browser gtk hierarchy. |
@@ -57,7 +85,11 @@ |
g_signal_connect(find_text_, "key-press-event", |
G_CALLBACK(KeyPressEvent), this); |
g_signal_connect(widget(), "size-allocate", |
- G_CALLBACK(OnSizeAllocate), this); |
+ G_CALLBACK(OnFixedSizeAllocate), this); |
+ // We can't call ContourWidget() until after |container| has been |
+ // allocated, hence we connect to this signal. |
+ g_signal_connect(container_, "size-allocate", |
+ G_CALLBACK(OnContainerSizeAllocate), this); |
} |
FindBarGtk::~FindBarGtk() { |
@@ -73,13 +105,16 @@ |
GtkWidget* hbox = gtk_hbox_new(false, 0); |
container_ = gfx::CreateGtkBorderBin(hbox, &kBackgroundColor, |
kBarPadding, kBarPadding, kBarPadding, kBarPadding); |
- fixed_.Own(gtk_fixed_new()); |
+ gtk_widget_set_app_paintable(container_, TRUE); |
+ g_signal_connect(container_, "expose-event", |
+ G_CALLBACK(OnExpose), NULL); |
// |fixed_| has to be at least one pixel tall. We color this pixel the same |
// color as the border that separates the toolbar from the web contents. |
// TODO(estade): find a better solution. (Ideally the tool bar shouldn't draw |
// its own border, but the border is part of the background bitmap, so |
// changing that would affect all platforms.) |
+ fixed_.Own(gtk_fixed_new()); |
border_ = gtk_event_box_new(); |
gtk_widget_set_size_request(border_, 1, 1); |
gtk_widget_modify_bg(border_, GTK_STATE_NORMAL, &kBorderColor); |
@@ -237,9 +272,9 @@ |
} |
// static |
-void FindBarGtk::OnSizeAllocate(GtkWidget* fixed, |
- GtkAllocation* allocation, |
- FindBarGtk* findbar) { |
+void FindBarGtk::OnFixedSizeAllocate(GtkWidget* fixed, |
+ GtkAllocation* allocation, |
+ FindBarGtk* findbar) { |
// Set the background widget to the size of |fixed|. |
if (findbar->border_->allocation.width != allocation->width) { |
// Typically it's not a good idea to use this function outside of container |
@@ -261,3 +296,13 @@ |
gtk_fixed_move(GTK_FIXED(fixed), container, xposition, kVerticalOffset); |
} |
} |
+ |
+// static |
+void FindBarGtk::OnContainerSizeAllocate(GtkWidget* container, |
+ GtkAllocation* allocation, |
+ FindBarGtk* findbar) { |
+ if (!findbar->container_shaped_) { |
+ GetDialogBackground()->ContourWidget(container); |
+ findbar->container_shaped_ = true; |
+ } |
+} |