Chromium Code Reviews| Index: chrome/browser/gtk/location_bar_view_gtk.cc |
| diff --git a/chrome/browser/gtk/location_bar_view_gtk.cc b/chrome/browser/gtk/location_bar_view_gtk.cc |
| index 18eda709aee41b05d4b2e57f4198299becdcf025..c9adf88f3cc753b205cb725f9a4e496f45522b81 100644 |
| --- a/chrome/browser/gtk/location_bar_view_gtk.cc |
| +++ b/chrome/browser/gtk/location_bar_view_gtk.cc |
| @@ -46,6 +46,7 @@ |
| #include "chrome/common/page_transition_types.h" |
| #include "chrome/common/pref_names.h" |
| #include "gfx/canvas_paint.h" |
| +#include "gfx/font.h" |
| #include "gfx/gtk_util.h" |
| #include "grit/generated_resources.h" |
| #include "grit/theme_resources.h" |
| @@ -91,6 +92,9 @@ const GdkColor kHintTextColor = GDK_COLOR_RGB(0x75, 0x75, 0x75); |
| // Size of the rounding of the "Search site for:" box. |
| const int kCornerSize = 3; |
| +// Space between the favicon and the title when dragging the location icon. |
| +const int kFavIconTitleSpacing = 4; |
| + |
| // Returns the short name for a keyword. |
| std::wstring GetKeywordName(Profile* profile, |
| const std::wstring& keyword) { |
| @@ -177,6 +181,7 @@ LocationBarViewGtk::~LocationBarViewGtk() { |
| // All of our widgets should have be children of / owned by the alignment. |
| star_.Destroy(); |
| hbox_.Destroy(); |
| + drag_icon_.Destroy(); |
| content_setting_hbox_.Destroy(); |
| page_action_hbox_.Destroy(); |
| } |
| @@ -383,7 +388,8 @@ void LocationBarViewGtk::BuildSiteTypeArea() { |
| gtk_box_pack_start(GTK_BOX(hbox_.get()), site_type_alignment_, |
| FALSE, FALSE, 0); |
| - // Set up drags. |
| + g_signal_connect(site_type_event_box_, "button-release-event", |
| + G_CALLBACK(&OnIconReleasedThunk), this); |
| } |
| void LocationBarViewGtk::SetSiteTypeDragSource() { |
| @@ -404,10 +410,22 @@ void LocationBarViewGtk::SetSiteTypeDragSource() { |
| gtk_dnd_util::TEXT_URI_LIST | |
| gtk_dnd_util::CHROME_NAMED_URL); |
| - g_signal_connect(site_type_event_box_, "button-release-event", |
| - G_CALLBACK(&OnIconReleasedThunk), this); |
| g_signal_connect(site_type_event_box_, "drag-data-get", |
| G_CALLBACK(&OnIconDragDataThunk), this); |
| + g_signal_connect(site_type_event_box_, "drag-begin", |
| + G_CALLBACK(&OnIconDragBeginThunk), this); |
| + |
| + drag_icon_.Own(gtk_window_new(GTK_WINDOW_POPUP)); |
| + g_signal_connect(drag_icon_.get(), "expose-event", |
| + G_CALLBACK(OnDragIconExposeThunk), this); |
| + GdkScreen* screen = gtk_widget_get_screen(drag_icon_.get()); |
| + GdkColormap* rgba = gdk_screen_get_rgba_colormap(screen); |
| + if (rgba) |
| + gtk_widget_set_colormap(drag_icon_.get(), rgba); |
| + |
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| + const gfx::Font& base_font = rb.GetFont(ResourceBundle::BaseFont); |
| + gtk_widget_set_size_request(drag_icon_.get(), 200, base_font.height()); |
| } |
| void LocationBarViewGtk::SetProfile(Profile* profile) { |
| @@ -556,13 +574,11 @@ void LocationBarViewGtk::OnSetFocus() { |
| } |
| SkBitmap LocationBarViewGtk::GetFavIcon() const { |
| - NOTIMPLEMENTED(); |
| - return SkBitmap(); |
| + return GetTabContents()->GetFavIcon(); |
| } |
| std::wstring LocationBarViewGtk::GetTitle() const { |
| - NOTIMPLEMENTED(); |
| - return std::wstring(); |
| + return UTF16ToWideHack(GetTabContents()->GetTitle()); |
| } |
| void LocationBarViewGtk::ShowFirstRunBubble(FirstRun::BubbleType bubble_type) { |
| @@ -968,6 +984,39 @@ void LocationBarViewGtk::OnIconDragData(GtkWidget* sender, |
| gtk_dnd_util::WriteURLWithName(data, tab->GetURL(), tab->GetTitle(), info); |
| } |
| +void LocationBarViewGtk::OnIconDragBegin(GtkWidget* sender, |
| + GdkDragContext* context) { |
| + if (gtk_util::IsScreenComposited()) |
| + gtk_drag_set_icon_widget(context, drag_icon_.get(), 0, 0); |
| +} |
| + |
| +gboolean LocationBarViewGtk::OnDragIconExpose(GtkWidget* sender, |
| + GdkEventExpose* event) { |
| + // Clear the background. |
| + cairo_t* cr = gdk_cairo_create(event->window); |
| + gdk_cairo_rectangle(cr, &event->area); |
| + cairo_clip(cr); |
| + cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); |
| + cairo_paint(cr); |
| + cairo_destroy(cr); |
| + |
| + // Paint the favicon. |
|
Elliot Glaysher
2010/04/28 00:31:09
We can't do this with cairo? Tears.
Evan Stade
2010/04/28 00:33:51
well, this does use cairo underneath, but using ca
|
| + gfx::CanvasPaint canvas(event, false); |
| + SkBitmap icon = GetFavIcon(); |
| + canvas.DrawBitmapInt(icon, 0, 0); |
| + |
| + // Paint the title text. |
| + int text_x = icon.width() + kFavIconTitleSpacing; |
| + int text_width = sender->allocation.width - text_x; |
| + ResourceBundle& rb = ResourceBundle::GetSharedInstance(); |
| + const gfx::Font& base_font = rb.GetFont(ResourceBundle::BaseFont); |
| + canvas.DrawStringInt(GetTitle(), |
| + base_font, SK_ColorBLACK, |
| + text_x, 0, text_width, sender->allocation.height); |
| + |
| + return TRUE; |
| +} |
| + |
| void LocationBarViewGtk::OnEntryBoxSizeAllocate(GtkWidget* sender, |
| GtkAllocation* allocation) { |
| if (entry_box_width_ != allocation->width) { |