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 ...@@ -104,7 +104,8 @@ class ToplevelWindowEventHandler::ScopedWindowResizer
public WindowStateObserver { public WindowStateObserver {
public: public:
ScopedWindowResizer(ToplevelWindowEventHandler* handler, ScopedWindowResizer(ToplevelWindowEventHandler* handler,
std::unique_ptr<WindowResizer> resizer); std::unique_ptr<WindowResizer> resizer,
bool grab_capture);
~ScopedWindowResizer() override; ~ScopedWindowResizer() override;
// Returns true if the drag moves the window and does not resize. // Returns true if the drag moves the window and does not resize.
...@@ -137,7 +138,8 @@ class ToplevelWindowEventHandler::ScopedWindowResizer ...@@ -137,7 +138,8 @@ class ToplevelWindowEventHandler::ScopedWindowResizer
ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer( ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer(
ToplevelWindowEventHandler* handler, ToplevelWindowEventHandler* handler,
std::unique_ptr<WindowResizer> resizer) std::unique_ptr<WindowResizer> resizer,
bool grab_capture)
: handler_(handler), resizer_(std::move(resizer)), grabbed_capture_(false) { : handler_(handler), resizer_(std::move(resizer)), grabbed_capture_(false) {
aura::Window* target = resizer_->GetTarget(); aura::Window* target = resizer_->GetTarget();
target->AddObserver(this); target->AddObserver(this);
...@@ -146,7 +148,7 @@ ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer( ...@@ -146,7 +148,7 @@ ToplevelWindowEventHandler::ScopedWindowResizer::ScopedWindowResizer(
if (IsResize()) if (IsResize())
target->NotifyResizeLoopStarted(); target->NotifyResizeLoopStarted();
if (!target->HasCapture()) { if (grab_capture && !target->HasCapture()) {
grabbed_capture_ = true; grabbed_capture_ = true;
target->SetCapture(); target->SetCapture();
} }
...@@ -469,7 +471,8 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag( ...@@ -469,7 +471,8 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag(
int window_component, int window_component,
::wm::WindowMoveSource source, ::wm::WindowMoveSource source,
EndClosure end_closure, EndClosure end_closure,
bool update_gesture_target) { bool update_gesture_target,
bool grab_capture) {
if (gesture_target_ != nullptr && update_gesture_target) { if (gesture_target_ != nullptr && update_gesture_target) {
DCHECK_EQ(source, ::wm::WINDOW_MOVE_SOURCE_TOUCH); DCHECK_EQ(source, ::wm::WINDOW_MOVE_SOURCE_TOUCH);
// Transfer events for gesture if switching to new target. // Transfer events for gesture if switching to new target.
...@@ -477,7 +480,8 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag( ...@@ -477,7 +480,8 @@ bool ToplevelWindowEventHandler::AttemptToStartDrag(
gesture_target_, window, ui::TransferTouchesBehavior::kDontCancel); 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. // Treat failure to start as a revert.
if (end_closure) if (end_closure)
std::move(end_closure).Run(DragResult::REVERT); std::move(end_closure).Run(DragResult::REVERT);
...@@ -624,7 +628,8 @@ bool ToplevelWindowEventHandler::PrepareForDrag( ...@@ -624,7 +628,8 @@ bool ToplevelWindowEventHandler::PrepareForDrag(
aura::Window* window, aura::Window* window,
const gfx::PointF& point_in_parent, const gfx::PointF& point_in_parent,
int window_component, int window_component,
::wm::WindowMoveSource source) { ::wm::WindowMoveSource source,
bool grab_capture) {
if (window_resizer_) if (window_resizer_)
return false; return false;
...@@ -632,8 +637,8 @@ bool ToplevelWindowEventHandler::PrepareForDrag( ...@@ -632,8 +637,8 @@ bool ToplevelWindowEventHandler::PrepareForDrag(
CreateWindowResizer(window, point_in_parent, window_component, source)); CreateWindowResizer(window, point_in_parent, window_component, source));
if (!resizer) if (!resizer)
return false; return false;
window_resizer_ = window_resizer_ = std::make_unique<ScopedWindowResizer>(
std::make_unique<ScopedWindowResizer>(this, std::move(resizer)); this, std::move(resizer), grab_capture);
return true; return true;
} }
......
...@@ -72,7 +72,8 @@ class ASH_EXPORT ToplevelWindowEventHandler ...@@ -72,7 +72,8 @@ class ASH_EXPORT ToplevelWindowEventHandler
// 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. If |update_gesture_target| is true, the gesture // drag is not started. If |update_gesture_target| is true, the gesture
// target is forcefully updated and gesture events are transferred to // 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, bool AttemptToStartDrag(aura::Window* window,
const gfx::PointF& point_in_parent, const gfx::PointF& point_in_parent,
int window_component, int window_component,
...@@ -82,7 +83,8 @@ class ASH_EXPORT ToplevelWindowEventHandler ...@@ -82,7 +83,8 @@ class ASH_EXPORT ToplevelWindowEventHandler
int window_component, int window_component,
::wm::WindowMoveSource source, ::wm::WindowMoveSource source,
EndClosure end_closure, 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. // If there is a drag in progress it is reverted, otherwise does nothing.
void RevertDrag(); void RevertDrag();
...@@ -121,7 +123,8 @@ class ASH_EXPORT ToplevelWindowEventHandler ...@@ -121,7 +123,8 @@ class ASH_EXPORT ToplevelWindowEventHandler
bool PrepareForDrag(aura::Window* window, bool PrepareForDrag(aura::Window* window,
const gfx::PointF& point_in_parent, const gfx::PointF& point_in_parent,
int window_component, 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 // Completes or reverts the drag if one is in progress. Returns true if a
// drag was completed or reverted. // 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