Chromium Code Reviews| Index: chrome/browser/gtk/tab_contents_container_gtk.cc |
| diff --git a/chrome/browser/gtk/tab_contents_container_gtk.cc b/chrome/browser/gtk/tab_contents_container_gtk.cc |
| index be8fe190a8b2ae5f058c1fd785fd16f0ce062b91..ad017c93424e2557f08be8d2f1a1138f943f6fd0 100644 |
| --- a/chrome/browser/gtk/tab_contents_container_gtk.cc |
| +++ b/chrome/browser/gtk/tab_contents_container_gtk.cc |
| @@ -5,14 +5,35 @@ |
| #include "chrome/browser/gtk/tab_contents_container_gtk.h" |
| #include "base/gfx/native_widget_types.h" |
| +#include "chrome/browser/gtk/status_bubble_gtk.h" |
| #include "chrome/browser/tab_contents/tab_contents.h" |
| #include "chrome/browser/renderer_host/render_widget_host_view_gtk.h" |
| #include "chrome/common/notification_service.h" |
| -TabContentsContainerGtk::TabContentsContainerGtk() |
| +namespace { |
| + |
| +// Allocates all normal tab contents views to the size of the passed in |
| +// |allocation|. Ignores StatusBubbles, which are handled separately. |
| +void ChildrenSizeAllocate(GtkWidget* widget, void* param) { |
| + GtkAllocation* allocation = reinterpret_cast<GtkAllocation*>(param); |
| + |
| + if (strcmp(gtk_widget_get_name(widget), "status-bubble") != 0) { |
| + gtk_widget_size_allocate(widget, allocation); |
| + } |
| +} |
| + |
| +} // namespace |
| + |
| +TabContentsContainerGtk::TabContentsContainerGtk(StatusBubbleGtk* status_bubble) |
| : tab_contents_(NULL), |
| - vbox_(gtk_vbox_new(FALSE, 0)) { |
| - gtk_widget_show_all(vbox_); |
| + status_bubble_(status_bubble), |
| + fixed_(gtk_fixed_new()) { |
| + gtk_fixed_put(GTK_FIXED(fixed_), status_bubble->widget(), 0, 0); |
| + |
| + g_signal_connect(fixed_, "size-allocate", |
| + G_CALLBACK(OnFixedSizeAllocate), this); |
| + |
| + gtk_widget_show(fixed_); |
| } |
| TabContentsContainerGtk::~TabContentsContainerGtk() { |
| @@ -21,7 +42,7 @@ TabContentsContainerGtk::~TabContentsContainerGtk() { |
| } |
| void TabContentsContainerGtk::AddContainerToBox(GtkWidget* box) { |
| - gtk_box_pack_start(GTK_BOX(box), vbox_, TRUE, TRUE, 0); |
| + gtk_box_pack_start(GTK_BOX(box), fixed_, TRUE, TRUE, 0); |
| } |
| void TabContentsContainerGtk::SetTabContents(TabContents* tab_contents) { |
| @@ -44,9 +65,8 @@ void TabContentsContainerGtk::SetTabContents(TabContents* tab_contents) { |
| gfx::NativeView widget = tab_contents_->GetNativeView(); |
| if (widget) { |
| - // Pack it into |vbox_| if it isn't already. |
| - if (widget->parent != vbox_) |
| - gtk_box_pack_end(GTK_BOX(vbox_), widget, TRUE, TRUE, 0); |
| + if (widget->parent != fixed_) |
| + gtk_fixed_put(GTK_FIXED(fixed_), widget, 0, 0); |
| gtk_widget_show(widget); |
| } |
| @@ -64,9 +84,11 @@ void TabContentsContainerGtk::SetTabContents(TabContents* tab_contents) { |
| void TabContentsContainerGtk::DetachTabContents(TabContents* tab_contents) { |
| gfx::NativeView widget = tab_contents_->GetNativeView(); |
| - if (widget) { |
| - DCHECK_EQ(widget->parent, vbox_); |
| - gtk_container_remove(GTK_CONTAINER(vbox_), widget); |
| + // It is possible to detach an unrealized, unparrented TabContents if you |
|
Evan Stade
2009/05/19 23:41:25
typo: unparented
|
| + // slow things down enough in valgrind. Might happen in the real world, too. |
| + if (widget && widget->parent) { |
| + DCHECK_EQ(widget->parent, fixed_); |
| + gtk_container_remove(GTK_CONTAINER(fixed_), widget); |
| } |
| } |
| @@ -129,3 +151,16 @@ void TabContentsContainerGtk::TabContentsDestroyed(TabContents* contents) { |
| DCHECK(contents == tab_contents_); |
| SetTabContents(NULL); |
| } |
| + |
| +// static |
| +void TabContentsContainerGtk::OnFixedSizeAllocate( |
| + GtkWidget* fixed, |
| + GtkAllocation* allocation, |
| + TabContentsContainerGtk* container) { |
| + // Set all the tab contents GtkWidgets to the size of the allocation. |
| + gtk_container_foreach(GTK_CONTAINER(fixed), ChildrenSizeAllocate, |
| + allocation); |
| + |
| + // Tell the status bubble about how large it can be. |
| + container->status_bubble_->SetParentAllocation(fixed, allocation); |
| +} |