| Index: components/mus/ws/event_dispatcher.cc
|
| diff --git a/components/mus/ws/event_dispatcher.cc b/components/mus/ws/event_dispatcher.cc
|
| index f0c2d3bfff4a58a164da3805dd3172808f2ba43e..fd706a92e99044ed525eae5c81b27d2bcca0752f 100644
|
| --- a/components/mus/ws/event_dispatcher.cc
|
| +++ b/components/mus/ws/event_dispatcher.cc
|
| @@ -7,7 +7,6 @@
|
| #include "cc/surfaces/surface_hittest.h"
|
| #include "components/mus/surfaces/surfaces_state.h"
|
| #include "components/mus/ws/event_dispatcher_delegate.h"
|
| -#include "components/mus/ws/move_loop.h"
|
| #include "components/mus/ws/server_window.h"
|
| #include "components/mus/ws/server_window_delegate.h"
|
| #include "components/mus/ws/window_coordinate_conversions.h"
|
| @@ -15,22 +14,12 @@
|
| #include "components/mus/ws/window_tree_host_impl.h"
|
| #include "mojo/converters/geometry/geometry_type_converters.h"
|
| #include "ui/gfx/geometry/point.h"
|
| +#include "ui/gfx/geometry/point_conversions.h"
|
|
|
| namespace mus {
|
| namespace ws {
|
| namespace {
|
|
|
| -bool IsPointerEvent(const mojo::Event& event) {
|
| - return event.action == mojo::EVENT_TYPE_POINTER_CANCEL ||
|
| - event.action == mojo::EVENT_TYPE_POINTER_DOWN ||
|
| - event.action == mojo::EVENT_TYPE_POINTER_MOVE ||
|
| - event.action == mojo::EVENT_TYPE_POINTER_UP;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace {
|
| -
|
| bool IsMouseEventFlag(int32_t event_flags) {
|
| return !!(event_flags & (mojo::EVENT_FLAGS_LEFT_MOUSE_BUTTON |
|
| mojo::EVENT_FLAGS_MIDDLE_MOUSE_BUTTON |
|
| @@ -47,6 +36,17 @@ bool IsOnlyOneMouseButtonDown(mojo::EventFlags flags) {
|
| mouse_only_flags == mojo::EVENT_FLAGS_RIGHT_MOUSE_BUTTON;
|
| }
|
|
|
| +bool IsLocationInNonclientArea(const ServerWindow* target,
|
| + const gfx::Point& location) {
|
| + return target->parent() &&
|
| + !target->client_area().Contains(location);
|
| +}
|
| +
|
| +gfx::Point EventLocationToPoint(const mojo::Event& event) {
|
| + return gfx::ToFlooredPoint(gfx::PointF(event.pointer_data->location->x,
|
| + event.pointer_data->location->y));
|
| +}
|
| +
|
| } // namespace
|
|
|
| class EventMatcher {
|
| @@ -141,7 +141,10 @@ class EventMatcher {
|
| ////////////////////////////////////////////////////////////////////////////////
|
|
|
| EventDispatcher::EventDispatcher(EventDispatcherDelegate* delegate)
|
| - : delegate_(delegate), root_(nullptr), capture_window_(nullptr) {}
|
| + : delegate_(delegate),
|
| + root_(nullptr),
|
| + capture_window_(nullptr),
|
| + capture_in_nonclient_area_(false) {}
|
|
|
| EventDispatcher::~EventDispatcher() {}
|
|
|
| @@ -176,37 +179,32 @@ void EventDispatcher::OnEvent(mojo::EventPtr event) {
|
| }
|
| }
|
|
|
| - // If there is a MoveLoop all pointer events are forwarded to it.
|
| - if (move_loop_ && IsPointerEvent(*event)) {
|
| - if (move_loop_->Move(*event) == MoveLoop::DONE) {
|
| - move_loop_.reset();
|
| - ResetCaptureWindowIfPointerUp(*event);
|
| - }
|
| -
|
| - return;
|
| - }
|
| -
|
| ServerWindow* target = FindEventTarget(event.get());
|
| + bool in_nonclient_area = false;
|
|
|
| if (IsMouseEventFlag(event->flags)) {
|
| - if (!capture_window_ && (event->action == mojo::EVENT_TYPE_POINTER_DOWN))
|
| + if (!capture_window_ && target &&
|
| + (event->action == mojo::EVENT_TYPE_POINTER_DOWN)) {
|
| + // TODO(sky): |capture_window_| needs to be reset when window removed
|
| + // from hierarchy.
|
| capture_window_ = target;
|
| - else
|
| - ResetCaptureWindowIfPointerUp(*event);
|
| + // TODO(sky): this needs to happen for pointer down events too.
|
| + capture_in_nonclient_area_ =
|
| + IsLocationInNonclientArea(target, EventLocationToPoint(*event));
|
| + in_nonclient_area = capture_in_nonclient_area_;
|
| + } else if (event->action == mojo::EVENT_TYPE_POINTER_UP &&
|
| + IsOnlyOneMouseButtonDown(event->flags)) {
|
| + capture_window_ = nullptr;
|
| + }
|
| + in_nonclient_area = capture_in_nonclient_area_;
|
| }
|
|
|
| if (target) {
|
| - if (event->action == mojo::EVENT_TYPE_POINTER_DOWN) {
|
| + if (event->action == mojo::EVENT_TYPE_POINTER_DOWN)
|
| delegate_->SetFocusedWindowFromEventDispatcher(target);
|
|
|
| - if (!move_loop_) {
|
| - move_loop_ = MoveLoop::Create(target, *event);
|
| - if (move_loop_)
|
| - return;
|
| - }
|
| - }
|
| -
|
| - delegate_->DispatchInputEventToWindow(target, event.Pass());
|
| + delegate_->DispatchInputEventToWindow(target, in_nonclient_area,
|
| + event.Pass());
|
| }
|
| }
|
|
|
| @@ -251,14 +249,8 @@ ServerWindow* EventDispatcher::FindEventTarget(mojo::Event* event) {
|
|
|
| event_location->x = location.x();
|
| event_location->y = location.y();
|
| - return target;
|
| -}
|
|
|
| -void EventDispatcher::ResetCaptureWindowIfPointerUp(const mojo::Event& event) {
|
| - if (event.action == mojo::EVENT_TYPE_POINTER_UP &&
|
| - IsOnlyOneMouseButtonDown(event.flags)) {
|
| - capture_window_ = nullptr;
|
| - }
|
| + return target;
|
| }
|
|
|
| } // namespace ws
|
|
|