summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/gtk')
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.cc26
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.h8
-rw-r--r--chrome/browser/gtk/bookmark_menu_controller_gtk.cc8
-rw-r--r--chrome/browser/gtk/bookmark_menu_controller_gtk.h3
-rw-r--r--chrome/browser/gtk/bookmark_utils_gtk.cc217
-rw-r--r--chrome/browser/gtk/bookmark_utils_gtk.h10
-rw-r--r--chrome/browser/gtk/gtk_util.cc9
-rw-r--r--chrome/browser/gtk/gtk_util.h3
-rw-r--r--chrome/browser/gtk/location_bar_view_gtk.cc60
-rw-r--r--chrome/browser/gtk/location_bar_view_gtk.h4
10 files changed, 227 insertions, 121 deletions
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.cc b/chrome/browser/gtk/bookmark_bar_gtk.cc
index 7181ed6..de3008c 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.cc
+++ b/chrome/browser/gtk/bookmark_bar_gtk.cc
@@ -132,6 +132,7 @@ BookmarkBarGtk::BookmarkBarGtk(BrowserWindowGtk* window,
instructions_(NULL),
sync_service_(NULL),
dragged_node_(NULL),
+ drag_icon_(NULL),
toolbar_drop_item_(NULL),
theme_provider_(GtkThemeProvider::GetFrom(profile)),
show_instructions_(true),
@@ -960,6 +961,8 @@ void BookmarkBarGtk::PopupMenuForNode(GtkWidget* sender,
gboolean BookmarkBarGtk::OnButtonPressed(GtkWidget* sender,
GdkEventButton* event) {
+ last_pressed_coordinates_ = gfx::Point(event->x, event->y);
+
if (event->button == 3 && GTK_WIDGET_VISIBLE(bookmark_hbox_)) {
const BookmarkNode* node = GetNodeForToolButton(sender);
DCHECK(node);
@@ -1006,11 +1009,20 @@ void BookmarkBarGtk::OnButtonDragBegin(GtkWidget* button,
dragged_node_ = node;
DCHECK(dragged_node_);
- GtkWidget* window = bookmark_utils::GetDragRepresentation(
+ drag_icon_ = bookmark_utils::GetDragRepresentationForNode(
node, model_, theme_provider_);
- gint x, y;
- gtk_widget_get_pointer(button, &x, &y);
- gtk_drag_set_icon_widget(drag_context, window, x, y);
+
+ // We have to jump through some hoops to get the drag icon to line up because
+ // it is a different size than the button.
+ GtkRequisition req;
+ gtk_widget_size_request(drag_icon_, &req);
+ gfx::Rect button_rect = gtk_util::WidgetBounds(button);
+ gfx::Point drag_icon_relative =
+ gfx::Rect(req.width, req.height).CenterPoint().Add(
+ (last_pressed_coordinates_.Subtract(button_rect.CenterPoint())));
+ gtk_drag_set_icon_widget(drag_context, drag_icon_,
+ drag_icon_relative.x(),
+ drag_icon_relative.y());
// Hide our node, but reserve space for it on the toolbar.
int index = gtk_toolbar_get_item_index(GTK_TOOLBAR(bookmark_toolbar_.get()),
@@ -1032,11 +1044,17 @@ void BookmarkBarGtk::OnButtonDragEnd(GtkWidget* button,
if (toolbar_drop_item_) {
g_object_unref(toolbar_drop_item_);
toolbar_drop_item_ = NULL;
+ gtk_toolbar_set_drop_highlight_item(GTK_TOOLBAR(bookmark_toolbar_.get()),
+ NULL, 0);
}
DCHECK(dragged_node_);
dragged_node_ = NULL;
+ DCHECK(drag_icon_);
+ gtk_widget_destroy(drag_icon_);
+ drag_icon_ = NULL;
+
g_object_unref(button->parent);
}
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.h b/chrome/browser/gtk/bookmark_bar_gtk.h
index 405ca15..c6e7ae0 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.h
+++ b/chrome/browser/gtk/bookmark_bar_gtk.h
@@ -22,6 +22,7 @@
#include "chrome/common/notification_observer.h"
#include "chrome/common/notification_registrar.h"
#include "chrome/common/owned_widget_gtk.h"
+#include "gfx/point.h"
#include "gfx/size.h"
#include "testing/gtest/include/gtest/gtest_prod.h"
@@ -319,6 +320,9 @@ class BookmarkBarGtk : public AnimationDelegate,
// dragging.
const BookmarkNode* dragged_node_;
+ // The visual representation that follows the cursor during drags.
+ GtkWidget* drag_icon_;
+
// We create a GtkToolbarItem from |dragged_node_| ;or display.
GtkToolItem* toolbar_drop_item_;
@@ -358,6 +362,10 @@ class BookmarkBarGtk : public AnimationDelegate,
// of this so we don't force too many paints.
gfx::Size last_tab_contents_size_;
+ // The last coordinates recorded by OnButtonPress; used to line up the
+ // drag icon during bookmark drags.
+ gfx::Point last_pressed_coordinates_;
+
// The currently throbbing widget. This is NULL if no widget is throbbing.
// We track it because we only want to allow one widget to throb at a time.
GtkWidget* throbbing_widget_;
diff --git a/chrome/browser/gtk/bookmark_menu_controller_gtk.cc b/chrome/browser/gtk/bookmark_menu_controller_gtk.cc
index 485b440..491c885 100644
--- a/chrome/browser/gtk/bookmark_menu_controller_gtk.cc
+++ b/chrome/browser/gtk/bookmark_menu_controller_gtk.cc
@@ -76,6 +76,7 @@ BookmarkMenuController::BookmarkMenuController(Browser* browser,
parent_window_(window),
model_(profile->GetBookmarkModel()),
node_(node),
+ drag_icon_(NULL),
ignore_button_release_(false),
triggering_widget_(NULL) {
menu_ = gtk_menu_new();
@@ -321,11 +322,11 @@ void BookmarkMenuController::OnMenuItemDragBegin(GtkWidget* menu_item,
ignore_button_release_ = true;
const BookmarkNode* node = bookmark_utils::BookmarkNodeForWidget(menu_item);
- GtkWidget* window = bookmark_utils::GetDragRepresentation(
+ drag_icon_ = bookmark_utils::GetDragRepresentationForNode(
node, model_, GtkThemeProvider::GetFrom(profile_));
gint x, y;
gtk_widget_get_pointer(menu_item, &x, &y);
- gtk_drag_set_icon_widget(drag_context, window, x, y);
+ gtk_drag_set_icon_widget(drag_context, drag_icon_, x, y);
// Hide our node.
gtk_widget_hide(menu_item);
@@ -335,6 +336,9 @@ void BookmarkMenuController::OnMenuItemDragEnd(GtkWidget* menu_item,
GdkDragContext* drag_context) {
gtk_widget_show(menu_item);
g_object_unref(menu_item->parent);
+
+ gtk_widget_destroy(drag_icon_);
+ drag_icon_ = NULL;
}
void BookmarkMenuController::OnMenuItemDragGet(
diff --git a/chrome/browser/gtk/bookmark_menu_controller_gtk.h b/chrome/browser/gtk/bookmark_menu_controller_gtk.h
index 843f556..c1c4517 100644
--- a/chrome/browser/gtk/bookmark_menu_controller_gtk.h
+++ b/chrome/browser/gtk/bookmark_menu_controller_gtk.h
@@ -115,6 +115,9 @@ class BookmarkMenuController : public BaseBookmarkModelObserver,
// - The menu items have context menus.
GtkWidget* menu_;
+ // The visual representation that follows the cursor during drags.
+ GtkWidget* drag_icon_;
+
// Whether we should ignore the next button release event (because we were
// dragging).
bool ignore_button_release_;
diff --git a/chrome/browser/gtk/bookmark_utils_gtk.cc b/chrome/browser/gtk/bookmark_utils_gtk.cc
index 0ea4b82..9c9c235 100644
--- a/chrome/browser/gtk/bookmark_utils_gtk.cc
+++ b/chrome/browser/gtk/bookmark_utils_gtk.cc
@@ -16,10 +16,15 @@
#include "chrome/browser/gtk/gtk_theme_provider.h"
#include "chrome/browser/gtk/gtk_util.h"
#include "chrome/browser/profile.h"
+#include "gfx/canvas_paint.h"
+#include "gfx/font.h"
#include "gfx/gtk_util.h"
namespace {
+// Spacing between the favicon and the text.
+const int kBarButtonPadding = 4;
+
// Used in gtk_selection_data_set(). (I assume from this parameter that gtk has
// to some really exotic hardware...)
const int kBitsInAByte = 8;
@@ -47,15 +52,115 @@ void* AsVoid(const BookmarkNode* node) {
return const_cast<BookmarkNode*>(node);
}
+// Creates the widget hierarchy for a bookmark button.
+void PackButton(GdkPixbuf* pixbuf, const std::wstring& title, bool ellipsize,
+ GtkThemeProvider* provider, GtkWidget* button) {
+ GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(button));
+ if (former_child)
+ gtk_container_remove(GTK_CONTAINER(button), former_child);
+
+ // We pack the button manually (rather than using gtk_button_set_*) so that
+ // we can have finer control over its label.
+ GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf);
+
+ GtkWidget* box = gtk_hbox_new(FALSE, kBarButtonPadding);
+ gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0);
+
+ std::string label_string = WideToUTF8(title);
+ if (!label_string.empty()) {
+ GtkWidget* label = gtk_label_new(label_string.c_str());
+ // Until we switch to vector graphics, force the font size.
+ gtk_util::ForceFontSizePixels(label, 13.4); // 13.4px == 10pt @ 96dpi
+
+ // Ellipsize long bookmark names.
+ if (ellipsize) {
+ gtk_label_set_max_width_chars(GTK_LABEL(label), kMaxCharsOnAButton);
+ gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_END);
+ }
+
+ gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
+ bookmark_utils::SetButtonTextColors(label, provider);
+ }
+
+ GtkWidget* alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
+ // If we are not showing the label, don't set any padding, so that the icon
+ // will just be centered.
+ if (label_string.c_str()) {
+ gtk_alignment_set_padding(GTK_ALIGNMENT(alignment),
+ kButtonPaddingTop, kButtonPaddingBottom,
+ kButtonPaddingLeft, kButtonPaddingRight);
+ }
+ gtk_container_add(GTK_CONTAINER(alignment), box);
+ gtk_container_add(GTK_CONTAINER(button), alignment);
+
+ gtk_widget_show_all(alignment);
+}
+
+const int kDragRepresentationWidth = 140;
+
+struct DragRepresentationData {
+ public:
+ GdkPixbuf* favicon;
+ std::wstring text;
+ SkColor text_color;
+
+ DragRepresentationData(GdkPixbuf* favicon,
+ const std::wstring& text,
+ SkColor text_color)
+ : favicon(favicon),
+ text(text),
+ text_color(text_color) {
+ g_object_ref(favicon);
+ }
+
+ ~DragRepresentationData() {
+ g_object_unref(favicon);
+ }
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(DragRepresentationData);
+};
+
+gboolean OnDragIconExpose(GtkWidget* sender,
+ GdkEventExpose* event,
+ DragRepresentationData* data) {
+ // 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_set_operator(cr, CAIRO_OPERATOR_SOURCE);
+ gdk_cairo_set_source_pixbuf(cr, data->favicon, 0, 0);
+ cairo_paint(cr);
+ cairo_destroy(cr);
+
+ // Paint the title text.
+ gfx::CanvasPaint canvas(event, false);
+ int text_x = gdk_pixbuf_get_width(data->favicon) + kBarButtonPadding;
+ int text_width = sender->allocation.width - text_x;
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ const gfx::Font& base_font = rb.GetFont(ResourceBundle::BaseFont);
+ canvas.DrawStringInt(data->text,
+ base_font, data->text_color,
+ text_x, 0, text_width, sender->allocation.height);
+
+ return TRUE;
+}
+
+void OnDragIconDestroy(GtkWidget* drag_icon,
+ DragRepresentationData* data) {
+ g_object_unref(drag_icon);
+ delete data;
+}
+
} // namespace
namespace bookmark_utils {
const char kBookmarkNode[] = "bookmark-node";
-// Spacing between the buttons on the bar.
-const int kBarButtonPadding = 4;
-
GdkPixbuf* GetPixbufForNode(const BookmarkNode* node, BookmarkModel* model,
bool native) {
GdkPixbuf* pixbuf;
@@ -75,83 +180,69 @@ GdkPixbuf* GetPixbufForNode(const BookmarkNode* node, BookmarkModel* model,
return pixbuf;
}
-GtkWidget* GetDragRepresentation(const BookmarkNode* node,
- BookmarkModel* model,
+GtkWidget* GetDragRepresentation(GdkPixbuf* pixbuf,
+ const std::wstring& title,
GtkThemeProvider* provider) {
- // Build a windowed representation for our button.
GtkWidget* window = gtk_window_new(GTK_WINDOW_POPUP);
- if (!provider->UseGtkTheme()) {
- // TODO(erg): Theme wise, which color should I be picking here?
- // COLOR_BUTTON_BACKGROUND doesn't match the default theme!
- gtk_widget_modify_bg(window, GTK_STATE_NORMAL, &kBackgroundColor);
- }
- gtk_widget_realize(window);
- GtkWidget* frame = gtk_frame_new(NULL);
- gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
- gtk_container_add(GTK_CONTAINER(window), frame);
- gtk_widget_show(frame);
+ if (gtk_util::IsScreenComposited() &&
+ gtk_util::AddWindowAlphaChannel(window)) {
+ DragRepresentationData* data = new DragRepresentationData(
+ pixbuf, title,
+ provider->GetColor(BrowserThemeProvider::COLOR_BOOKMARK_TEXT));
+ g_signal_connect(window, "expose-event", G_CALLBACK(OnDragIconExpose),
+ data);
+ g_object_ref(window);
+ g_signal_connect(window, "destroy", G_CALLBACK(OnDragIconDestroy), data);
+
+ ResourceBundle& rb = ResourceBundle::GetSharedInstance();
+ const gfx::Font& base_font = rb.GetFont(ResourceBundle::BaseFont);
+ gtk_widget_set_size_request(window, kDragRepresentationWidth,
+ base_font.height());
+ } else {
+ if (!provider->UseGtkTheme()) {
+ // TODO(erg): Theme wise, which color should I be picking here?
+ // COLOR_BUTTON_BACKGROUND doesn't match the default theme!
+ gtk_widget_modify_bg(window, GTK_STATE_NORMAL, &kBackgroundColor);
+ }
+ gtk_widget_realize(window);
- GtkWidget* floating_button = provider->BuildChromeButton();
- bookmark_utils::ConfigureButtonForNode(node, model, floating_button,
- provider);
- gtk_container_add(GTK_CONTAINER(frame), floating_button);
- gtk_widget_show(floating_button);
+ GtkWidget* frame = gtk_frame_new(NULL);
+ gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_OUT);
+ gtk_container_add(GTK_CONTAINER(window), frame);
+
+ GtkWidget* floating_button = provider->BuildChromeButton();
+ PackButton(pixbuf, title, true, provider, floating_button);
+ gtk_container_add(GTK_CONTAINER(frame), floating_button);
+ gtk_widget_show_all(frame);
+ }
return window;
}
+GtkWidget* GetDragRepresentationForNode(const BookmarkNode* node,
+ BookmarkModel* model,
+ GtkThemeProvider* provider) {
+ GdkPixbuf* pixbuf = GetPixbufForNode(node, model, provider->UseGtkTheme());
+ GtkWidget* widget = GetDragRepresentation(pixbuf, node->GetTitle(), provider);
+ g_object_unref(pixbuf);
+ return widget;
+}
+
void ConfigureButtonForNode(const BookmarkNode* node, BookmarkModel* model,
GtkWidget* button, GtkThemeProvider* provider) {
- GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(button));
- if (former_child)
- gtk_container_remove(GTK_CONTAINER(button), former_child);
-
- std::string tooltip = BuildTooltipFor(node);
- if (!tooltip.empty())
- gtk_widget_set_tooltip_markup(button, tooltip.c_str());
-
- // We pack the button manually (rather than using gtk_button_set_*) so that
- // we can have finer control over its label.
GdkPixbuf* pixbuf = bookmark_utils::GetPixbufForNode(node, model,
provider->UseGtkTheme());
- GtkWidget* image = gtk_image_new_from_pixbuf(pixbuf);
+ PackButton(pixbuf, node->GetTitle(), node != model->other_node(),
+ provider, button);
g_object_unref(pixbuf);
- GtkWidget* box = gtk_hbox_new(FALSE, kBarButtonPadding);
- gtk_box_pack_start(GTK_BOX(box), image, FALSE, FALSE, 0);
-
- std::string label_string = WideToUTF8(node->GetTitle());
- if (!label_string.empty()) {
- GtkWidget* label = gtk_label_new(label_string.c_str());
- // Until we switch to vector graphics, force the font size.
- gtk_util::ForceFontSizePixels(label, 13.4); // 13.4px == 10pt @ 96dpi
-
- // Ellipsize long bookmark names.
- if (node != model->other_node()) {
- gtk_label_set_max_width_chars(GTK_LABEL(label), kMaxCharsOnAButton);
- gtk_label_set_ellipsize(GTK_LABEL(label), PANGO_ELLIPSIZE_END);
- }
-
- gtk_box_pack_start(GTK_BOX(box), label, FALSE, FALSE, 0);
- SetButtonTextColors(label, provider);
- }
-
- GtkWidget* alignment = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
- // If we are not showing the label, don't set any padding, so that the icon
- // will just be centered.
- if (label_string.c_str()) {
- gtk_alignment_set_padding(GTK_ALIGNMENT(alignment),
- kButtonPaddingTop, kButtonPaddingBottom,
- kButtonPaddingLeft, kButtonPaddingRight);
- }
- gtk_container_add(GTK_CONTAINER(alignment), box);
- gtk_container_add(GTK_CONTAINER(button), alignment);
+ std::string tooltip = BuildTooltipFor(node);
+ if (!tooltip.empty())
+ gtk_widget_set_tooltip_markup(button, tooltip.c_str());
g_object_set_data(G_OBJECT(button), bookmark_utils::kBookmarkNode,
AsVoid(node));
-
- gtk_widget_show_all(alignment);
}
std::string BuildTooltipFor(const BookmarkNode* node) {
diff --git a/chrome/browser/gtk/bookmark_utils_gtk.h b/chrome/browser/gtk/bookmark_utils_gtk.h
index 012ce96..6c2227c 100644
--- a/chrome/browser/gtk/bookmark_utils_gtk.h
+++ b/chrome/browser/gtk/bookmark_utils_gtk.h
@@ -18,9 +18,6 @@ namespace bookmark_utils {
extern const char kBookmarkNode[];
-// Padding between the image and the label of a bookmark bar button.
-extern const int kBarButtonPadding;
-
// Get the image that is used to represent the node. This function adds a ref
// to the returned pixbuf, so it requires a matching call to g_object_unref().
GdkPixbuf* GetPixbufForNode(const BookmarkNode* node, BookmarkModel* model,
@@ -28,9 +25,12 @@ GdkPixbuf* GetPixbufForNode(const BookmarkNode* node, BookmarkModel* model,
// Returns a GtkWindow with a visual hierarchy for passing to
// gtk_drag_set_icon_widget().
-GtkWidget* GetDragRepresentation(const BookmarkNode* node,
- BookmarkModel* model,
+GtkWidget* GetDragRepresentation(GdkPixbuf* pixbuf,
+ const std::wstring& title,
GtkThemeProvider* provider);
+GtkWidget* GetDragRepresentationForNode(const BookmarkNode* node,
+ BookmarkModel* model,
+ GtkThemeProvider* provider);
// Helper function that sets visual properties of GtkButton |button| to the
// contents of |node|.
diff --git a/chrome/browser/gtk/gtk_util.cc b/chrome/browser/gtk/gtk_util.cc
index 4d5796a..2658d60 100644
--- a/chrome/browser/gtk/gtk_util.cc
+++ b/chrome/browser/gtk/gtk_util.cc
@@ -899,4 +899,13 @@ bool URLFromPrimarySelection(Profile* profile, GURL* url) {
return true;
}
+bool AddWindowAlphaChannel(GtkWidget* window) {
+ GdkScreen* screen = gtk_widget_get_screen(window);
+ GdkColormap* rgba = gdk_screen_get_rgba_colormap(screen);
+ if (rgba)
+ gtk_widget_set_colormap(window, rgba);
+
+ return rgba;
+}
+
} // namespace gtk_util
diff --git a/chrome/browser/gtk/gtk_util.h b/chrome/browser/gtk/gtk_util.h
index 1d8b6d3..e469a19 100644
--- a/chrome/browser/gtk/gtk_util.h
+++ b/chrome/browser/gtk/gtk_util.h
@@ -277,6 +277,9 @@ guint32 XTimeNow();
// otherwise returns false.
bool URLFromPrimarySelection(Profile* profile, GURL* url);
+// Set the colormap of the given window to rgba to allow transparency.
+bool AddWindowAlphaChannel(GtkWidget* window);
+
} // namespace gtk_util
#endif // CHROME_BROWSER_GTK_GTK_UTIL_H_
diff --git a/chrome/browser/gtk/location_bar_view_gtk.cc b/chrome/browser/gtk/location_bar_view_gtk.cc
index 6b73f34..e31262c 100644
--- a/chrome/browser/gtk/location_bar_view_gtk.cc
+++ b/chrome/browser/gtk/location_bar_view_gtk.cc
@@ -28,6 +28,7 @@
#include "chrome/browser/extensions/extension_tabs_module.h"
#include "chrome/browser/extensions/extensions_service.h"
#include "chrome/browser/gtk/bookmark_bubble_gtk.h"
+#include "chrome/browser/gtk/bookmark_utils_gtk.h"
#include "chrome/browser/gtk/cairo_cached_surface.h"
#include "chrome/browser/gtk/content_setting_bubble_gtk.h"
#include "chrome/browser/gtk/extension_popup_gtk.h"
@@ -92,9 +93,6 @@ 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) {
@@ -182,8 +180,6 @@ LocationBarViewGtk::~LocationBarViewGtk() {
// All of our widgets should have be children of / owned by the alignment.
star_.Destroy();
hbox_.Destroy();
- if (drag_icon_)
- g_object_unref(drag_icon_);
content_setting_hbox_.Destroy();
page_action_hbox_.Destroy();
}
@@ -416,19 +412,8 @@ void LocationBarViewGtk::SetSiteTypeDragSource() {
G_CALLBACK(&OnIconDragDataThunk), this);
g_signal_connect(site_type_event_box_, "drag-begin",
G_CALLBACK(&OnIconDragBeginThunk), this);
-
- drag_icon_ = gtk_window_new(GTK_WINDOW_POPUP);
- g_object_ref(drag_icon_);
- g_signal_connect(drag_icon_, "expose-event",
- G_CALLBACK(OnDragIconExposeThunk), this);
- GdkScreen* screen = gtk_widget_get_screen(drag_icon_);
- GdkColormap* rgba = gdk_screen_get_rgba_colormap(screen);
- if (rgba)
- gtk_widget_set_colormap(drag_icon_, rgba);
-
- ResourceBundle& rb = ResourceBundle::GetSharedInstance();
- const gfx::Font& base_font = rb.GetFont(ResourceBundle::BaseFont);
- gtk_widget_set_size_request(drag_icon_, 200, base_font.height());
+ g_signal_connect(site_type_event_box_, "drag-end",
+ G_CALLBACK(&OnIconDragEndThunk), this);
}
void LocationBarViewGtk::SetProfile(Profile* profile) {
@@ -989,35 +974,20 @@ void LocationBarViewGtk::OnIconDragData(GtkWidget* sender,
void LocationBarViewGtk::OnIconDragBegin(GtkWidget* sender,
GdkDragContext* context) {
- if (gtk_util::IsScreenComposited())
- gtk_drag_set_icon_widget(context, drag_icon_, 0, 0);
+ SkBitmap favicon = GetFavIcon();
+ GdkPixbuf* pixbuf = gfx::GdkPixbufFromSkBitmap(&favicon);
+ if (!pixbuf)
+ return;
+ drag_icon_ = bookmark_utils::GetDragRepresentation(pixbuf, GetTitle(),
+ theme_provider_);
+ g_object_unref(pixbuf);
+ gtk_drag_set_icon_widget(context, drag_icon_, 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.
- 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::OnIconDragEnd(GtkWidget* sender,
+ GdkDragContext* context) {
+ gtk_widget_destroy(drag_icon_);
+ drag_icon_ = NULL;
}
void LocationBarViewGtk::OnEntryBoxSizeAllocate(GtkWidget* sender,
diff --git a/chrome/browser/gtk/location_bar_view_gtk.h b/chrome/browser/gtk/location_bar_view_gtk.h
index 6f21c74..486e5d7 100644
--- a/chrome/browser/gtk/location_bar_view_gtk.h
+++ b/chrome/browser/gtk/location_bar_view_gtk.h
@@ -280,8 +280,8 @@ class LocationBarViewGtk : public AutocompleteEditController,
GdkDragContext*, GtkSelectionData*, guint, guint);
CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnIconDragBegin,
GdkDragContext*);
- CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnDragIconExpose,
- GdkEventExpose*);
+ CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnIconDragEnd,
+ GdkDragContext*);
CHROMEGTK_CALLBACK_1(LocationBarViewGtk, void, OnEntryBoxSizeAllocate,
GtkAllocation*);
CHROMEGTK_CALLBACK_1(LocationBarViewGtk, gboolean, OnStarButtonPress,