Commit e621e77c authored by Mitsuru Oshima's avatar Mitsuru Oshima Committed by Commit Bot

Update the gesture target on AttemptToStartDrag.

For Exo windows, the initial gesture target is set to an ExoSurface. If
the client (Android) requests a drag-move or drag-resize, then Exo calls
AttemptToStartDrag, and provides the ExoShellSurface as the target.
Then, ToplevelWindowEventHandler will transfer the events to the new
target. However, WmToplevelWindowEventHandler won't update the gesture
target. This means all events will be ignored later in
WmToplevelWindowEventHandler::OnGestureEvent because it believes they
are events for the client which need to not be delivered.

Bug: b/124026845
Test: Drag-to-move via touch of a PIP window no longer lags.
Change-Id: I6e7bca73561fdab1bf357dd86de2a5d4e9a4bddc
Reviewed-on: https://chromium-review.googlesource.com/c/1477452Reviewed-by: default avatarEliot Courtney <edcourtney@chromium.org>
Reviewed-by: default avatarMitsuru Oshima <oshima@chromium.org>
Commit-Queue: Mitsuru Oshima <oshima@chromium.org>
Cr-Commit-Position: refs/heads/master@{#634401}
parent f2827420
...@@ -51,13 +51,9 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag( ...@@ -51,13 +51,9 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag(
::wm::WindowMoveSource source = gesture_target ::wm::WindowMoveSource source = gesture_target
? ::wm::WINDOW_MOVE_SOURCE_TOUCH ? ::wm::WINDOW_MOVE_SOURCE_TOUCH
: ::wm::WINDOW_MOVE_SOURCE_MOUSE; : ::wm::WINDOW_MOVE_SOURCE_MOUSE;
if (gesture_target) {
window->env()->gesture_recognizer()->TransferEventsTo(
gesture_target, window, ui::TransferTouchesBehavior::kDontCancel);
}
return wm_toplevel_window_event_handler_.AttemptToStartDrag( return wm_toplevel_window_event_handler_.AttemptToStartDrag(
window, point_in_parent, window_component, source, window, point_in_parent, window_component, source, std::move(end_closure),
std::move(end_closure)); /*update_gesture_target=*/true);
} }
::wm::WindowMoveResult ToplevelWindowEventHandler::RunMoveLoop( ::wm::WindowMoveResult ToplevelWindowEventHandler::RunMoveLoop(
...@@ -96,7 +92,8 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag( ...@@ -96,7 +92,8 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag(
if (!wm_toplevel_window_event_handler_.AttemptToStartDrag( if (!wm_toplevel_window_event_handler_.AttemptToStartDrag(
source, drag_location, HTCAPTION, move_source, source, drag_location, HTCAPTION, move_source,
base::Bind(&ToplevelWindowEventHandler::OnDragCompleted, base::Bind(&ToplevelWindowEventHandler::OnDragCompleted,
weak_factory_.GetWeakPtr(), &result, &run_loop))) { weak_factory_.GetWeakPtr(), &result, &run_loop),
/*update_gesture_target=*/false)) {
return ::wm::MOVE_CANCELED; return ::wm::MOVE_CANCELED;
} }
......
...@@ -376,7 +376,8 @@ void WmToplevelWindowEventHandler::OnGestureEvent(ui::GestureEvent* event, ...@@ -376,7 +376,8 @@ void WmToplevelWindowEventHandler::OnGestureEvent(ui::GestureEvent* event,
if (CanStartTwoFingerMove(target, first_finger_hittest_, if (CanStartTwoFingerMove(target, first_finger_hittest_,
second_finger_hittest)) { second_finger_hittest)) {
AttemptToStartDrag(target, first_finger_touch_point_, HTCAPTION, AttemptToStartDrag(target, first_finger_touch_point_, HTCAPTION,
::wm::WINDOW_MOVE_SOURCE_TOUCH, EndClosure()); ::wm::WINDOW_MOVE_SOURCE_TOUCH, EndClosure(),
/*update_gesture_target=*/false);
event->StopPropagation(); event->StopPropagation();
} }
} }
...@@ -398,7 +399,8 @@ void WmToplevelWindowEventHandler::OnGestureEvent(ui::GestureEvent* event, ...@@ -398,7 +399,8 @@ void WmToplevelWindowEventHandler::OnGestureEvent(ui::GestureEvent* event,
aura::Window::ConvertPointToTarget(target, target->parent(), aura::Window::ConvertPointToTarget(target, target->parent(),
&location_in_parent); &location_in_parent);
AttemptToStartDrag(target, location_in_parent, component, AttemptToStartDrag(target, location_in_parent, component,
::wm::WINDOW_MOVE_SOURCE_TOUCH, EndClosure()); ::wm::WINDOW_MOVE_SOURCE_TOUCH, EndClosure(),
/*update_gesture_target=*/false);
event->StopPropagation(); event->StopPropagation();
return; return;
} }
...@@ -461,7 +463,8 @@ bool WmToplevelWindowEventHandler::AttemptToStartDrag( ...@@ -461,7 +463,8 @@ bool WmToplevelWindowEventHandler::AttemptToStartDrag(
const gfx::Point& point_in_parent, const gfx::Point& point_in_parent,
int window_component, int window_component,
::wm::WindowMoveSource source, ::wm::WindowMoveSource source,
EndClosure end_closure) { EndClosure end_closure,
bool update_gesture_target) {
if (!PrepareForDrag(window, point_in_parent, window_component, source)) { if (!PrepareForDrag(window, point_in_parent, window_component, source)) {
// Treat failure to start as a revert. // Treat failure to start as a revert.
if (end_closure) if (end_closure)
...@@ -473,8 +476,14 @@ bool WmToplevelWindowEventHandler::AttemptToStartDrag( ...@@ -473,8 +476,14 @@ bool WmToplevelWindowEventHandler::AttemptToStartDrag(
in_gesture_drag_ = (source == ::wm::WINDOW_MOVE_SOURCE_TOUCH); in_gesture_drag_ = (source == ::wm::WINDOW_MOVE_SOURCE_TOUCH);
// |gesture_target_| needs to be updated if the drag originated from a // |gesture_target_| needs to be updated if the drag originated from a
// client (i.e. |this| never handled ET_GESTURE_EVENT_BEGIN). // client (i.e. |this| never handled ET_GESTURE_EVENT_BEGIN).
if (in_gesture_drag_ && !gesture_target_) if (in_gesture_drag_ && (!gesture_target_ || update_gesture_target)) {
if (gesture_target_ && gesture_target_ != window) {
// Transfer events for gesture if switching to new target.
window->env()->gesture_recognizer()->TransferEventsTo(
gesture_target_, window, ui::TransferTouchesBehavior::kDontCancel);
}
UpdateGestureTarget(window); UpdateGestureTarget(window);
}
return true; return true;
} }
...@@ -543,7 +552,8 @@ void WmToplevelWindowEventHandler::HandleMousePressed(aura::Window* target, ...@@ -543,7 +552,8 @@ void WmToplevelWindowEventHandler::HandleMousePressed(aura::Window* target,
aura::Window::ConvertPointToTarget(target, target->parent(), aura::Window::ConvertPointToTarget(target, target->parent(),
&location_in_parent); &location_in_parent);
AttemptToStartDrag(target, location_in_parent, component, AttemptToStartDrag(target, location_in_parent, component,
::wm::WINDOW_MOVE_SOURCE_MOUSE, EndClosure()); ::wm::WINDOW_MOVE_SOURCE_MOUSE, EndClosure(),
/*update_gesture_target=*/false);
// Set as handled so that other event handlers do no act upon the event // Set as handled so that other event handlers do no act upon the event
// but still receive it so that they receive both parts of each pressed/ // but still receive it so that they receive both parts of each pressed/
// released pair. // released pair.
......
...@@ -67,12 +67,15 @@ class ASH_EXPORT WmToplevelWindowEventHandler ...@@ -67,12 +67,15 @@ class ASH_EXPORT WmToplevelWindowEventHandler
// Attempts to start a drag if one is not already in progress. Returns true if // Attempts to start a drag if one is not already in progress. Returns true if
// successful. |end_closure| is run when the drag completes, including if the // successful. |end_closure| is run when the drag completes, including if the
// drag is not started. // drag is not started. If |update_gesture_target| is true, the gesture
// target is forcefully updated and gesture events are transferred to
// new target if any.
bool AttemptToStartDrag(aura::Window* window, bool AttemptToStartDrag(aura::Window* window,
const gfx::Point& point_in_parent, const gfx::Point& point_in_parent,
int window_component, int window_component,
::wm::WindowMoveSource source, ::wm::WindowMoveSource source,
EndClosure end_closure); EndClosure end_closure,
bool update_gesture_target);
// If there is a drag in progress it is reverted, otherwise does nothing. // If there is a drag in progress it is reverted, otherwise does nothing.
void RevertDrag(); void RevertDrag();
......
...@@ -137,7 +137,8 @@ void WindowServiceDelegateImpl::RunWindowMoveLoop( ...@@ -137,7 +137,8 @@ void WindowServiceDelegateImpl::RunWindowMoveLoop(
->wm_toplevel_window_event_handler() ->wm_toplevel_window_event_handler()
->AttemptToStartDrag( ->AttemptToStartDrag(
window, location_in_parent, window_component, aura_source, window, location_in_parent, window_component, aura_source,
base::BindOnce(&OnMoveLoopCompleted, std::move(callback))); base::BindOnce(&OnMoveLoopCompleted, std::move(callback)),
/*update_gesture_target=*/false);
} }
void WindowServiceDelegateImpl::CancelWindowMoveLoop() { void WindowServiceDelegateImpl::CancelWindowMoveLoop() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment