Commit 6f932f68 authored by Nick Diego Yamane's avatar Nick Diego Yamane Committed by Commit Bot

ash: Make capture grab optional during window dragging

This is required to make it possible to use ToplevelWindowEventHandler
for handling window dragging in Exo's extended-drag sessions, e.g:
LaCrOS Chrome's tab dragging implementation.

Extended drag sessions are driven by ash::DragDropController, which sets
capture to its internal DragDropTracker instance. This changes
ToplevelWindowEventHandler so that it does not assumes capture must be
set on the dragged window when its AttemptToStartDrag() functions are
called.

This CL does not imply in any functional change. It will start to be
used in crrev.com/c/2401280 followup change.

R=oshima@chromium.org

Bug: 1099418
Change-Id: I8d76f72675eb123fbd41093efa1d9643adeb482c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2483662Reviewed-by: default avatarMitsuru Oshima <oshima@chromium.org>
Commit-Queue: Nick Yamane <nickdiego@igalia.com>
Cr-Commit-Position: refs/heads/master@{#821599}
parent b1197946
......@@ -104,7 +104,8 @@ class ToplevelWindowEventHandler::ScopedWindowResizer
public WindowStateObserver {
public:
ScopedWindowResizer(ToplevelWindowEventHandler* handler,
std::unique_ptr<WindowResizer> resizer);
std::unique_ptr<WindowResizer> resizer,
bool grab_capture);
~ScopedWindowResizer() override;
// Returns true if the drag moves the window and does not resize.
......@@ -137,7 +138,8 @@ class ToplevelWindowEventHandler::ScopedWindowResizer
ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer(
ToplevelWindowEventHandler* handler,
std::unique_ptr<WindowResizer> resizer)
std::unique_ptr<WindowResizer> resizer,
bool grab_capture)
: handler_(handler), resizer_(std::move(resizer)), grabbed_capture_(false) {
aura::Window* target = resizer_->GetTarget();
target->AddObserver(this);
......@@ -146,7 +148,7 @@ ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer(
if (IsResize())
target->NotifyResizeLoopStarted();
if (!target->HasCapture()) {
if (grab_capture && !target->HasCapture()) {
grabbed_capture_ = true;
target->SetCapture();
}
......@@ -469,7 +471,8 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag(
int window_component,
::wm::WindowMoveSource source,
EndClosure end_closure,
bool update_gesture_target) {
bool update_gesture_target,
bool grab_capture) {
if (gesture_target_ != nullptr && update_gesture_target) {
DCHECK_EQ(source, ::wm::WINDOW_MOVE_SOURCE_TOUCH);
// Transfer events for gesture if switching to new target.
......@@ -477,7 +480,8 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag(
gesture_target_, window, ui::TransferTouchesBehavior::kDontCancel);
}
if (!PrepareForDrag(window, point_in_parent, window_component, source)) {
if (!PrepareForDrag(window, point_in_parent, window_component, source,
grab_capture)) {
// Treat failure to start as a revert.
if (end_closure)
std::move(end_closure).Run(DragResult::REVERT);
......@@ -624,7 +628,8 @@ bool ToplevelWindowEventHandler::PrepareForDrag(
aura::Window* window,
const gfx::PointF& point_in_parent,
int window_component,
::wm::WindowMoveSource source) {
::wm::WindowMoveSource source,
bool grab_capture) {
if (window_resizer_)
return false;
......@@ -632,8 +637,8 @@ bool ToplevelWindowEventHandler::PrepareForDrag(
CreateWindowResizer(window, point_in_parent, window_component, source));
if (!resizer)
return false;
window_resizer_ =
std::make_unique<ScopedWindowResizer>(this, std::move(resizer));
window_resizer_ = std::make_unique<ScopedWindowResizer>(
this, std::move(resizer), grab_capture);
return true;
}
......
......@@ -72,7 +72,8 @@ class ASH_EXPORT ToplevelWindowEventHandler
// successful. |end_closure| is run when the drag completes, including if the
// 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. In general, prefer the first version.
// new target if any. If |grab_capture| is true, capture is set to |window|,
// if it is not set yet. In general, prefer the first version.
bool AttemptToStartDrag(aura::Window* window,
const gfx::PointF& point_in_parent,
int window_component,
......@@ -82,7 +83,8 @@ class ASH_EXPORT ToplevelWindowEventHandler
int window_component,
::wm::WindowMoveSource source,
EndClosure end_closure,
bool update_gesture_target);
bool update_gesture_target,
bool grab_capture = true);
// If there is a drag in progress it is reverted, otherwise does nothing.
void RevertDrag();
......@@ -121,7 +123,8 @@ class ASH_EXPORT ToplevelWindowEventHandler
bool PrepareForDrag(aura::Window* window,
const gfx::PointF& point_in_parent,
int window_component,
::wm::WindowMoveSource source);
::wm::WindowMoveSource source,
bool grab_capture);
// Completes or reverts the drag if one is in progress. Returns true if a
// drag was completed or reverted.
......
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