// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_DRAG_DROP_DRAG_DROP_CAPTURE_DELEGATE_H_
#define ASH_DRAG_DROP_DRAG_DROP_CAPTURE_DELEGATE_H_
#include "ash/ash_export.h"
#include "base/functional/bind.h"
#include "ui/events/gestures/gesture_types.h"
namespace aura {
class Window;
}
namespace ui {
class LocatedEvent;
}
namespace ash {
class DragDropTracker;
class ASH_EXPORT DragDropCaptureDelegate {
public:
using CancelDragDropCallback = base::RepeatingCallback<void(void)>;
DragDropCaptureDelegate();
DragDropCaptureDelegate(const DragDropCaptureDelegate&) = delete;
DragDropCaptureDelegate& operator=(const DragDropCaptureDelegate&) = delete;
virtual ~DragDropCaptureDelegate();
// Conditionally takes capture of top level touch events, returning whether
// this was successful.
bool TakeCapture(aura::Window* root_window,
aura::Window* source_window,
CancelDragDropCallback callback,
ui::TransferTouchesBehavior behavior);
// Converts an event target that was dispatched against a capture window to
// once that can be processed by the drag and drop controller.
//
// This should only be called on events if TakeCapture returned true at the
// start of a drag and drop session. Returns nullptr after `ReleaseCapture`.
aura::Window* GetTarget(const ui::LocatedEvent& event);
// Converts an event that was dispatched against a capture window to once
// that can be processed by the drag and drop controller, using the target
// returned via GetTarget.
//
// This should only be called on events if TakeCapture returned true at the
// start of a drag and drop session. Returns nullptr after `ReleaseCapture`.
std::unique_ptr<ui::LocatedEvent> ConvertEvent(aura::Window* target,
const ui::LocatedEvent& event);
// Return the capture window used if TakeCapture returns true. Returns nullptr
// after `ReleaseCapture`.
aura::Window* capture_window();
// Stop capturing input events.
void ReleaseCapture();
private:
std::unique_ptr<DragDropTracker> drag_drop_tracker_;
};
void DispatchGestureEndToWindow(aura::Window* window);
} // namespace ash
#endif // ASH_DRAG_DROP_DRAG_DROP_CAPTURE_DELEGATE_H_