| Index: chrome/browser/gtk/status_bubble_gtk.cc
|
| diff --git a/chrome/browser/gtk/status_bubble_gtk.cc b/chrome/browser/gtk/status_bubble_gtk.cc
|
| index 08eab1acd2cfbebbc5af5e448d765da4e718a8ec..6089eda245b95f4d30792dc873b8292f8b1f45ed 100644
|
| --- a/chrome/browser/gtk/status_bubble_gtk.cc
|
| +++ b/chrome/browser/gtk/status_bubble_gtk.cc
|
| @@ -45,7 +45,8 @@ StatusBubbleGtk::StatusBubbleGtk(Profile* profile)
|
| y_offset_(0),
|
| download_shelf_is_visible_(false),
|
| last_mouse_location_(0, 0),
|
| - last_mouse_left_content_(false) {
|
| + last_mouse_left_content_(false),
|
| + ignore_next_left_content_(false) {
|
| InitWidgets();
|
|
|
| theme_provider_->InitThemesFor(this);
|
| @@ -63,13 +64,12 @@ void StatusBubbleGtk::SetStatus(const string16& status_text_wide) {
|
| return;
|
|
|
| status_text_ = status_text;
|
| - if (!status_text_.empty()) {
|
| + if (!status_text_.empty())
|
| SetStatusTextTo(status_text_);
|
| - } else if (!url_text_.empty()) {
|
| + else if (!url_text_.empty())
|
| SetStatusTextTo(url_text_);
|
| - } else {
|
| + else
|
| SetStatusTextTo(std::string());
|
| - }
|
| }
|
|
|
| void StatusBubbleGtk::SetURL(const GURL& url, const string16& languages) {
|
| @@ -155,6 +155,11 @@ void StatusBubbleGtk::SetStatusTextTo(const std::string& status_utf8) {
|
|
|
| void StatusBubbleGtk::MouseMoved(
|
| const gfx::Point& location, bool left_content) {
|
| + if (left_content && ignore_next_left_content_) {
|
| + ignore_next_left_content_ = false;
|
| + return;
|
| + }
|
| +
|
| last_mouse_location_ = location;
|
| last_mouse_left_content_ = left_content;
|
|
|
| @@ -189,9 +194,9 @@ void StatusBubbleGtk::MouseMoved(
|
| gtk_util::GetWidgetRectRelativeToToplevel(parent);
|
| gfx::Rect bubble_rect(
|
| toplevel_x + parent_rect.x() +
|
| - (ltr ? 0 : parent->allocation.width - requisition.width),
|
| + (ltr ? 0 : parent->allocation.width - requisition.width),
|
| toplevel_y + parent_rect.y() +
|
| - parent->allocation.height - requisition.height,
|
| + parent->allocation.height - requisition.height,
|
| requisition.width,
|
| requisition.height);
|
|
|
| @@ -210,8 +215,8 @@ void StatusBubbleGtk::MouseMoved(
|
| } else {
|
| SetFlipHorizontally(false);
|
| int distance = std::max(ltr ?
|
| - location.x() - right_threshold :
|
| - left_threshold - location.x(),
|
| + location.x() - right_threshold :
|
| + left_threshold - location.x(),
|
| top_threshold - location.y());
|
| y_offset_ = std::min(-1 * distance, requisition.height);
|
| }
|
| @@ -260,9 +265,12 @@ void StatusBubbleGtk::InitWidgets() {
|
| // We need to listen for mouse motion events, since a fast-moving pointer may
|
| // enter our window without us getting any motion events on the browser near
|
| // enough for us to run away.
|
| - gtk_widget_add_events(container_.get(), GDK_POINTER_MOTION_MASK);
|
| + gtk_widget_add_events(container_.get(), GDK_POINTER_MOTION_MASK |
|
| + GDK_ENTER_NOTIFY_MASK);
|
| g_signal_connect(container_.get(), "motion-notify-event",
|
| G_CALLBACK(HandleMotionNotifyThunk), this);
|
| + g_signal_connect(container_.get(), "enter-notify-event",
|
| + G_CALLBACK(HandleEnterNotifyThunk), this);
|
|
|
| UserChangedTheme();
|
| }
|
| @@ -306,10 +314,10 @@ void StatusBubbleGtk::SetFlipHorizontally(bool flip_horizontally) {
|
| container_.get(),
|
| kCornerSize,
|
| flip_horizontally ?
|
| - gtk_util::ROUNDED_TOP_LEFT :
|
| - gtk_util::ROUNDED_TOP_RIGHT,
|
| + gtk_util::ROUNDED_TOP_LEFT :
|
| + gtk_util::ROUNDED_TOP_RIGHT,
|
| gtk_util::BORDER_TOP |
|
| - (flip_horizontally ? gtk_util::BORDER_LEFT : gtk_util::BORDER_RIGHT));
|
| + (flip_horizontally ? gtk_util::BORDER_LEFT : gtk_util::BORDER_RIGHT));
|
| gtk_widget_queue_draw(container_.get());
|
| }
|
|
|
| @@ -333,6 +341,14 @@ void StatusBubbleGtk::UpdateLabelSizeRequest() {
|
| gtk_widget_set_size_request(label_, new_width, -1);
|
| }
|
|
|
| +// See http://crbug.com/68897 for why we have to handle this event.
|
| +gboolean StatusBubbleGtk::HandleEnterNotify(GtkWidget* sender,
|
| + GdkEventCrossing* event) {
|
| + ignore_next_left_content_ = true;
|
| + MouseMoved(gfx::Point(event->x_root, event->y_root), false);
|
| + return FALSE;
|
| +}
|
| +
|
| gboolean StatusBubbleGtk::HandleMotionNotify(GtkWidget* sender,
|
| GdkEventMotion* event) {
|
| MouseMoved(gfx::Point(event->x_root, event->y_root), false);
|
|
|