summaryrefslogtreecommitdiffstats
path: root/views/widget/widget_gtk.cc
diff options
context:
space:
mode:
Diffstat (limited to 'views/widget/widget_gtk.cc')
-rw-r--r--views/widget/widget_gtk.cc38
1 files changed, 25 insertions, 13 deletions
diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc
index c437f70..1dcc258 100644
--- a/views/widget/widget_gtk.cc
+++ b/views/widget/widget_gtk.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -749,6 +749,30 @@ gboolean WidgetGtk::OnDragMotion(GdkDragContext* context,
}
gboolean WidgetGtk::OnEnterNotify(GtkWidget* widget, GdkEventCrossing* event) {
+ if (last_mouse_event_was_move_ && last_mouse_move_x_ == event->x_root &&
+ last_mouse_move_y_ == event->y_root) {
+ // Don't generate a mouse event for the same location as the last.
+ return false;
+ }
+
+ if (!last_mouse_event_was_move_ && !is_mouse_down_) {
+ // When a mouse button is pressed gtk generates a leave, enter, press.
+ // RootView expects to get a mouse move before a press, otherwise enter is
+ // not set. So we generate a move here.
+ last_mouse_move_x_ = event->x_root;
+ last_mouse_move_y_ = event->y_root;
+ last_mouse_event_was_move_ = true;
+ // If this event is the result of pressing a button then one of the button
+ // modifiers is set. Unset it as we're compensating for the leave generated
+ // when you press a button.
+ int flags = (Event::GetFlagsFromGdkState(event->state) &
+ ~(Event::EF_LEFT_BUTTON_DOWN |
+ Event::EF_MIDDLE_BUTTON_DOWN |
+ Event::EF_RIGHT_BUTTON_DOWN));
+ MouseEvent mouse_move(Event::ET_MOUSE_MOVED, event->x, event->y, flags);
+ root_view_->OnMouseMoved(mouse_move);
+ }
+
return false;
}
@@ -763,12 +787,6 @@ gboolean WidgetGtk::OnMotionNotify(GtkWidget* widget, GdkEventMotion* event) {
if (has_capture_ && is_mouse_down_) {
last_mouse_event_was_move_ = false;
int flags = Event::GetFlagsFromGdkState(event->state);
- if (event->state & GDK_BUTTON1_MASK)
- flags |= Event::EF_LEFT_BUTTON_DOWN;
- if (event->state & GDK_BUTTON2_MASK)
- flags |= Event::EF_MIDDLE_BUTTON_DOWN;
- if (event->state & GDK_BUTTON3_MASK)
- flags |= Event::EF_RIGHT_BUTTON_DOWN;
MouseEvent mouse_drag(Event::ET_MOUSE_DRAGGED, event->x, event->y, flags);
root_view_->OnMouseDragged(mouse_drag);
return true;
@@ -783,12 +801,6 @@ gboolean WidgetGtk::OnMotionNotify(GtkWidget* widget, GdkEventMotion* event) {
last_mouse_move_y_ = screen_loc.y();
last_mouse_event_was_move_ = true;
int flags = Event::GetFlagsFromGdkState(event->state);
- if (event->state & GDK_BUTTON1_MASK)
- flags |= Event::EF_LEFT_BUTTON_DOWN;
- if (event->state & GDK_BUTTON2_MASK)
- flags |= Event::EF_MIDDLE_BUTTON_DOWN;
- if (event->state & GDK_BUTTON3_MASK)
- flags |= Event::EF_RIGHT_BUTTON_DOWN;
MouseEvent mouse_move(Event::ET_MOUSE_MOVED, event->x, event->y, flags);
root_view_->OnMouseMoved(mouse_move);
return true;