Index: chrome/browser/gtk/bookmark_bar_gtk.cc |
=================================================================== |
--- chrome/browser/gtk/bookmark_bar_gtk.cc (revision 30061) |
+++ chrome/browser/gtk/bookmark_bar_gtk.cc (working copy) |
@@ -128,7 +128,8 @@ |
show_instructions_(true), |
menu_bar_helper_(this), |
floating_(false), |
- last_allocation_width_(-1) { |
+ last_allocation_width_(-1), |
+ event_box_paint_factory_(this) { |
#if defined(BROWSER_SYNC) |
if (profile->GetProfileSyncService()) { |
// Obtain a pointer to the profile sync service and add our instance as an |
@@ -227,7 +228,7 @@ |
g_signal_connect(instructions_, "drag-data-received", |
G_CALLBACK(&OnDragReceived), this); |
- g_signal_connect(G_OBJECT(event_box_.get()), "expose-event", |
+ g_signal_connect(event_box_.get(), "expose-event", |
G_CALLBACK(&OnEventBoxExpose), this); |
UpdateEventBoxPaintability(); |
@@ -615,8 +616,19 @@ |
UpdateEventBoxPaintability(); |
// |window_| can be NULL during testing. |
- if (window_) |
+ if (window_) { |
window_->BookmarkBarIsFloating(floating_); |
+ // Listen for parent size allocations. |
+ if (floating_ && widget()->parent) { |
+ // Only connect once. |
+ if (g_signal_handler_find(widget()->parent, G_SIGNAL_MATCH_FUNC, |
+ 0, NULL, NULL, reinterpret_cast<gpointer>(OnParentSizeAllocate), |
+ NULL) == 0) { |
+ g_signal_connect(widget()->parent, "size-allocate", |
tony
2009/10/26 23:55:30
What happens if you drag a tab from one window to
Evan Stade
2009/10/27 00:11:12
the bookmark bar and the tab contents container sh
tony
2009/10/27 00:34:19
I see, it's the container. The g_signal_handler_f
Evan Stade
2009/10/27 00:37:48
it's because we don't want to connect mroe than on
|
+ G_CALLBACK(OnParentSizeAllocate), this); |
+ } |
+ } |
+ } |
} |
void BookmarkBarGtk::UpdateEventBoxPaintability() { |
@@ -629,6 +641,34 @@ |
theme_provider_->UseGtkTheme()); |
} |
+void BookmarkBarGtk::PaintEventBox() { |
+ gfx::Size tab_contents_size; |
+ if (GetTabContentsSize(&tab_contents_size) && |
+ tab_contents_size != last_tab_contents_size_) { |
+ last_tab_contents_size_ = tab_contents_size; |
+ gtk_widget_queue_draw(event_box_.get()); |
+ } |
+} |
+ |
+bool BookmarkBarGtk::GetTabContentsSize(gfx::Size* size) { |
+ Browser* browser = browser_; |
+ if (!browser) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ TabContents* tab_contents = browser->GetSelectedTabContents(); |
+ if (!tab_contents) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ if (!tab_contents->view()) { |
+ NOTREACHED(); |
+ return false; |
+ } |
+ *size = tab_contents->view()->GetContainerSize(); |
+ return true; |
+} |
+ |
bool BookmarkBarGtk::IsAlwaysShown() { |
return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar); |
} |
@@ -1100,21 +1140,8 @@ |
cairo_destroy(cr); |
} else { |
gfx::Size tab_contents_size; |
- Browser* browser = bar->browser_; |
- if (!browser) { |
- NOTREACHED(); |
+ if (!bar->GetTabContentsSize(&tab_contents_size)) |
return FALSE; |
- } |
- TabContents* tab_contents = browser->GetSelectedTabContents(); |
- if (!tab_contents) { |
- NOTREACHED(); |
- return FALSE; |
- } |
- if (!tab_contents->view()) { |
- NOTREACHED(); |
- return FALSE; |
- } |
- tab_contents_size = tab_contents->view()->GetContainerSize(); |
gfx::CanvasPaint canvas(event, true); |
NtpBackgroundUtil::PaintBackgroundDetachedMode(theme_provider, &canvas, |
gfx::Rect(widget->allocation), tab_contents_size.height()); |
@@ -1124,6 +1151,22 @@ |
} |
// static |
+void BookmarkBarGtk::OnParentSizeAllocate(GtkWidget* widget, |
+ GtkAllocation* allocation, |
+ BookmarkBarGtk* bar) { |
+ // In floating mode, our layout depends on the size of the tab contents. |
+ // We get the size-allocate signal before the tab contents does, hence we |
+ // need to post a delayed task so we will paint correctly. Note that |
+ // gtk_widget_queue_draw by itself does not work, despite that it claims to |
+ // be asynchronous. |
+ if (bar->floating_) { |
+ MessageLoop::current()->PostTask(FROM_HERE, |
tony
2009/10/26 23:55:30
Is this still necessary since we're getting the si
Evan Stade
2009/10/27 00:11:12
we are getting it from the tab contents container,
|
+ bar->event_box_paint_factory_.NewRunnableMethod( |
+ &BookmarkBarGtk::PaintEventBox)); |
+ } |
+} |
+ |
+// static |
gboolean BookmarkBarGtk::OnSeparatorExpose(GtkWidget* widget, |
GdkEventExpose* event, |
BookmarkBarGtk* bar) { |