// Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef COMPONENTS_EXO_DATA_DEVICE_H_ #define COMPONENTS_EXO_DATA_DEVICE_H_ #include #include "base/memory/weak_ptr.h" #include "components/exo/data_offer_observer.h" #include "components/exo/seat_observer.h" #include "components/exo/surface.h" #include "components/exo/surface_observer.h" #include "ui/base/clipboard/clipboard_observer.h" #include "ui/base/dragdrop/mojom/drag_drop_types.mojom-forward.h" namespace ui { class DropTargetEvent; } namespace exo { class DataDeviceDelegate; class DataOffer; class ScopedDataOffer; class DataSource; class Seat; class ScopedSurface; enum class DndAction { kNone, kCopy, kMove, kAsk }; // DataDevice to start drag and drop and copy and paste oprations. class DataDevice : public WMHelper::DragDropObserver, public DataOfferObserver, public ui::ClipboardObserver, public SurfaceObserver, public SeatObserver { public: DataDevice(DataDeviceDelegate* delegate, Seat* seat); DataDevice(const DataDevice&) = delete; DataDevice& operator=(const DataDevice&) = delete; ~DataDevice() override; // Starts drag-and-drop operation. // |source| represents data comes from the client starting drag operation. Can // be null if the data will be transferred only in the client. |origin| is // the surface which starts the drag and drop operation. |icon| is the // nullable image which is rendered at the next to cursor while drag // operation. void StartDrag(DataSource* source, Surface* origin, Surface* icon, ui::mojom::DragEventSource event_source); // Sets selection data to the clipboard. // |source| represents data comes from the client. void SetSelection(DataSource* source); // Overridden from WMHelper::DragDropObserver: void OnDragEntered(const ui::DropTargetEvent& event) override; aura::client::DragUpdateInfo OnDragUpdated( const ui::DropTargetEvent& event) override; void OnDragExited() override; WMHelper::DragDropObserver::DropCallback GetDropCallback() override; // Overridden from ui::ClipboardObserver: void OnClipboardDataChanged() override; // Overridden from SeatObserver: void OnSurfaceFocused(Surface* surface, Surface* lost_focus, bool has_focused_client) override; // Overridden from DataOfferObserver: void OnDataOfferDestroying(DataOffer* data_offer) override; // Overridden from SurfaceObserver: void OnSurfaceDestroying(Surface* surface) override; DataDeviceDelegate* get_delegate() { return delegate_; } private: Surface* GetEffectiveTargetForEvent(const ui::DropTargetEvent& event) const; void SetSelectionToCurrentClipboardData(); void PerformDropOrExitDrag(base::ScopedClosureRunner exit_drag, ui::mojom::DragOperation& output_drag_op); DataDeviceDelegate* const delegate_; Seat* const seat_; std::unique_ptr data_offer_; std::unique_ptr focused_surface_; base::OnceClosure quit_closure_; bool drop_succeeded_; base::WeakPtrFactory drop_weak_factory_{this}; base::WeakPtrFactory weak_factory_{this}; }; } // namespace exo #endif // COMPONENTS_EXO_DATA_DEVICE_H_