Index: ui/views/widget/widget.cc |
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc |
index 52209f878a6b085057612ef081929f51ba13bd0e..8a9fa71e538c6a2b82fa221ef19e7288d4e0dfe8 100644 |
--- a/ui/views/widget/widget.cc |
+++ b/ui/views/widget/widget.cc |
@@ -168,6 +168,7 @@ |
is_top_level_(false), |
native_widget_initialized_(false), |
native_widget_destroyed_(false), |
+ is_mouse_button_pressed_(false), |
ignore_capture_loss_(false), |
last_mouse_event_was_move_(false), |
auto_release_capture_(true), |
@@ -350,6 +351,10 @@ |
AsNativeWidgetPrivate(); |
root_view_.reset(CreateRootView()); |
default_theme_provider_.reset(new ui::DefaultThemeProvider); |
+ if (params.type == InitParams::TYPE_MENU) { |
+ is_mouse_button_pressed_ = |
+ internal::NativeWidgetPrivate::IsMouseButtonDown(); |
+ } |
native_widget_->InitNativeWidget(params); |
if (RequiresNonClientView(params.type)) { |
non_client_view_ = new NonClientView; |
@@ -943,6 +948,8 @@ |
return; |
} |
+ if (internal::NativeWidgetPrivate::IsMouseButtonDown()) |
+ is_mouse_button_pressed_ = true; |
root_view_->SetMouseHandler(view); |
} |
@@ -1183,12 +1190,11 @@ |
// RootView from anywhere in Widget. Use |
// SendEventToProcessor() instead. See crbug.com/348087. |
void Widget::OnMouseEvent(ui::MouseEvent* event) { |
- if (event->type() != ui::ET_MOUSE_MOVED) |
- last_mouse_event_was_move_ = false; |
- |
View* root_view = GetRootView(); |
switch (event->type()) { |
case ui::ET_MOUSE_PRESSED: { |
+ last_mouse_event_was_move_ = false; |
+ |
// We may get deleted by the time we return from OnMousePressed. So we |
// use an observer to make sure we are still alive. |
WidgetDeletionObserver widget_deletion_observer(this); |
@@ -1206,6 +1212,7 @@ |
if (root_view && root_view->OnMousePressed(*event) && |
widget_deletion_observer.IsWidgetAlive() && IsVisible() && |
internal::NativeWidgetPrivate::IsMouseButtonDown()) { |
+ is_mouse_button_pressed_ = true; |
if (!native_widget_->HasCapture()) |
native_widget_->SetCapture(); |
event->SetHandled(); |
@@ -1214,6 +1221,8 @@ |
} |
case ui::ET_MOUSE_RELEASED: |
+ last_mouse_event_was_move_ = false; |
+ is_mouse_button_pressed_ = false; |
// Release capture first, to avoid confusion if OnMouseReleased blocks. |
if (auto_release_capture_ && native_widget_->HasCapture()) { |
base::AutoReset<bool> resetter(&ignore_capture_loss_, true); |
@@ -1226,8 +1235,13 @@ |
return; |
case ui::ET_MOUSE_MOVED: |
- if (!last_mouse_event_was_move_ || |
- last_mouse_event_position_ != event->location()) { |
+ case ui::ET_MOUSE_DRAGGED: |
+ if (native_widget_->HasCapture() && is_mouse_button_pressed_) { |
+ last_mouse_event_was_move_ = false; |
+ if (root_view) |
+ root_view->OnMouseDragged(*event); |
+ } else if (!last_mouse_event_was_move_ || |
+ last_mouse_event_position_ != event->location()) { |
last_mouse_event_position_ = event->location(); |
last_mouse_event_was_move_ = true; |
if (root_view) |
@@ -1235,12 +1249,8 @@ |
} |
return; |
- case ui::ET_MOUSE_DRAGGED: |
- if (root_view) |
- root_view->OnMouseDragged(*event); |
- return; |
- |
case ui::ET_MOUSE_EXITED: |
+ last_mouse_event_was_move_ = false; |
if (root_view) |
root_view->OnMouseExited(*event); |
return; |
@@ -1263,6 +1273,7 @@ |
View* root_view = GetRootView(); |
if (root_view) |
root_view->OnMouseCaptureLost(); |
+ is_mouse_button_pressed_ = false; |
} |
void Widget::OnScrollEvent(ui::ScrollEvent* event) { |