Index: views/widget/widget.cc |
diff --git a/views/widget/widget.cc b/views/widget/widget.cc |
index 65382c49c766e43c83d13ec18563e76664e52a3a..a20673c321e41c658a29298f709ae0c8e0494694 100644 |
--- a/views/widget/widget.cc |
+++ b/views/widget/widget.cc |
@@ -47,7 +47,9 @@ Widget::CreateParams::CreateParams(Type type) |
// Widget, public: |
Widget::Widget() |
- : native_widget_(NULL), |
+ : is_mouse_down_(false), |
+ last_mouse_event_was_move_(false), |
+ native_widget_(NULL), |
widget_delegate_(NULL), |
dragged_view_(NULL) { |
} |
@@ -346,6 +348,49 @@ void Widget::DestroyRootView() { |
MessageLoop::current()->DeleteSoon(FROM_HERE, focus_manager); |
} |
+bool Widget::ProcessMousePressed(const MouseEvent& event) { |
+ last_mouse_event_was_move_ = false; |
+ if (GetRootView()->OnMousePressed(event)) { |
+ is_mouse_down_ = true; |
+ if (!native_widget_->HasMouseCapture()) |
+ native_widget_->SetMouseCapture(); |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+bool Widget::ProcessMouseReleased(const MouseEvent& event) { |
+ last_mouse_event_was_move_ = false; |
+ is_mouse_down_ = false; |
+ |
+ // Release capture first, to avoid confusion if OnMouseReleased blocks. |
+ if (native_widget_->HasMouseCapture() && |
+ native_widget_->ShouldReleaseCaptureOnMouseReleased()) { |
+ native_widget_->ReleaseMouseCapture(); |
+ } |
+ |
+ GetRootView()->OnMouseReleased(event); |
+ return true; |
+} |
+ |
+void Widget::ProcessMouseMoved(const MouseEvent& event) { |
+ if (native_widget_->HasMouseCapture() && is_mouse_down_) { |
+ last_mouse_event_was_move_ = false; |
+ GetRootView()->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; |
+ GetRootView()->OnMouseMoved(event); |
+ } |
+} |
+ |
+void Widget::ProcessMouseCaptureLost() { |
+ if (is_mouse_down_) |
+ GetRootView()->OnMouseCaptureLost(); |
+ is_mouse_down_ = false; |
+} |
+ |
void Widget::ReplaceFocusManager(FocusManager* focus_manager) { |
focus_manager_.reset(focus_manager); |
} |