summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/infobar_container_gtk.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-15 21:52:48 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-05-15 21:52:48 +0000
commit0a2aeb81a06170cf4d99392b683736c46212f9ef (patch)
tree1c491dcbe56474ad5bbbd6da0cd47c75eca414d3 /chrome/browser/gtk/infobar_container_gtk.cc
parent26ee7556422eb077a813c9a15a03867779bb8188 (diff)
downloadchromium_src-0a2aeb81a06170cf4d99392b683736c46212f9ef.zip
chromium_src-0a2aeb81a06170cf4d99392b683736c46212f9ef.tar.gz
chromium_src-0a2aeb81a06170cf4d99392b683736c46212f9ef.tar.bz2
Linux: Take download shelf and infobar close animations into account during render view sizing.
http://crbug.com/11080 Review URL: http://codereview.chromium.org/113322 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@16193 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/infobar_container_gtk.cc')
-rw-r--r--chrome/browser/gtk/infobar_container_gtk.cc43
1 files changed, 26 insertions, 17 deletions
diff --git a/chrome/browser/gtk/infobar_container_gtk.cc b/chrome/browser/gtk/infobar_container_gtk.cc
index 3623497..a44ef65 100644
--- a/chrome/browser/gtk/infobar_container_gtk.cc
+++ b/chrome/browser/gtk/infobar_container_gtk.cc
@@ -15,28 +15,33 @@
namespace {
-// Used by RemoveInfoBar to pass data to AnimateClosingForDelegate.
-struct RemoveInfoBarData {
- GtkWidget* container;
- InfoBarDelegate* delegate;
-};
-
+// If |infobar_widget| matches |info_bar_delegate|, then close the infobar.
void AnimateClosingForDelegate(GtkWidget* infobar_widget,
- gpointer remove_info_bar_data) {
+ gpointer info_bar_delegate) {
+ InfoBarDelegate* delegate =
+ static_cast<InfoBarDelegate*>(info_bar_delegate);
InfoBar* infobar = reinterpret_cast<InfoBar*>(
g_object_get_data(G_OBJECT(infobar_widget), "info-bar"));
- RemoveInfoBarData* data =
- reinterpret_cast<RemoveInfoBarData*>(remove_info_bar_data);
if (!infobar) {
NOTREACHED();
return;
}
- if (data->delegate == infobar->delegate())
+ if (delegate == infobar->delegate())
infobar->AnimateClose();
}
+// Get the height of the widget and add it to |userdata|, but only if it is in
+// the process of closing.
+void SumClosingBarHeight(GtkWidget* widget, gpointer userdata) {
+ int* height_sum = static_cast<int*>(userdata);
+ InfoBar* infobar = reinterpret_cast<InfoBar*>(
+ g_object_get_data(G_OBJECT(widget), "info-bar"));
+ if (infobar->IsClosing())
+ *height_sum += widget->allocation.height;
+}
+
} // namespace
// InfoBarContainerGtk, public: ------------------------------------------------
@@ -45,7 +50,7 @@ InfoBarContainerGtk::InfoBarContainerGtk(BrowserWindow* browser_window)
: browser_window_(browser_window),
tab_contents_(NULL),
container_(gtk_vbox_new(FALSE, 0)) {
- gtk_widget_show(container_.get());
+ gtk_widget_show(widget());
}
InfoBarContainerGtk::~InfoBarContainerGtk() {
@@ -65,7 +70,7 @@ void InfoBarContainerGtk::ChangeTabContents(TabContents* contents) {
Source<TabContents>(tab_contents_));
}
- gtk_util::RemoveAllChildren(container_.get());
+ gtk_util::RemoveAllChildren(widget());
tab_contents_ = contents;
if (tab_contents_) {
@@ -83,6 +88,12 @@ void InfoBarContainerGtk::RemoveDelegate(InfoBarDelegate* delegate) {
tab_contents_->RemoveInfoBar(delegate);
}
+int InfoBarContainerGtk::TotalHeightOfClosingBars() const {
+ int sum = 0;
+ gtk_container_foreach(GTK_CONTAINER(widget()), SumClosingBarHeight, &sum);
+ return sum;
+}
+
// InfoBarContainerGtk, NotificationObserver implementation: -------------------
void InfoBarContainerGtk::Observe(NotificationType type,
@@ -109,7 +120,7 @@ void InfoBarContainerGtk::UpdateInfoBars() {
void InfoBarContainerGtk::AddInfoBar(InfoBarDelegate* delegate, bool animate) {
InfoBar* infobar = delegate->CreateInfoBar();
infobar->set_container(this);
- gtk_box_pack_end(GTK_BOX(container_.get()), infobar->widget(),
+ gtk_box_pack_end(GTK_BOX(widget()), infobar->widget(),
FALSE, FALSE, 0);
if (animate)
infobar->AnimateOpen();
@@ -118,8 +129,6 @@ void InfoBarContainerGtk::AddInfoBar(InfoBarDelegate* delegate, bool animate) {
}
void InfoBarContainerGtk::RemoveInfoBar(InfoBarDelegate* delegate) {
- RemoveInfoBarData remove_info_bar_data = { container_.get(), delegate };
-
- gtk_container_foreach(GTK_CONTAINER(container_.get()),
- AnimateClosingForDelegate, &remove_info_bar_data);
+ gtk_container_foreach(GTK_CONTAINER(widget()),
+ AnimateClosingForDelegate, delegate);
}