/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifndef RetrievalContextWayland_h #define RetrievalContextWayland_h #include "mozilla/Mutex.h" #include "nsClipboard.h" #include "nsWaylandDisplay.h" #include "nsWindow.h" #include "WUniquePtr.h" namespace mozilla::widget { class nsDragSessionWayland; class DataOffer { NS_INLINE_DECL_REFCOUNTING(DataOffer) public: explicit DataOffer(wl_data_offer* aDataOffer); virtual bool MatchesOffer(wl_data_offer* aDataOffer) { return aDataOffer == mWaylandDataOffer; } void AddMIMEType(const char* aMimeType); ClipboardTargets GetTargets(); bool HasTarget(const char* aMimeType); bool DragOfferAccept(const char* aMimeType); void SetDragStatus(bool aCanDrop, GdkDragAction aPreferredAction); GdkDragAction GetSelectedDragAction(); void SetSelectedDragAction(uint32_t aWaylandAction); void SetAvailableDragActions(uint32_t aWaylandActions); GdkDragAction GetAvailableDragActions(); void DropDataEnter(GtkWidget* aGtkWidget); void DropMotion(); void DropLeave(); void DropFinish(bool aCanDrop); void Drop(); virtual bool RequestDataTransfer(const char* aMimeType, int fd); void SetDropInfo(uint32_t aTime, DesktopIntPoint aPoint); nsWindow* GetWindow() { return mWindow; } uint32_t GetTime() { return mTime; } mozilla::LayoutDeviceIntPoint GetWindowPoint() { return mPoint; } protected: virtual ~DataOffer(); private: RefPtr GetDragSession(bool aForce); private: wl_data_offer* mWaylandDataOffer = nullptr; nsTArray mTargetMIMETypes; uint32_t mSelectedDragAction = 0; uint32_t mAvailableDragActions = 0; uint32_t mTime = 0; mozilla::LayoutDeviceIntPoint mPoint; RefPtr mWindow; }; class PrimaryDataOffer : public DataOffer { public: explicit PrimaryDataOffer(gtk_primary_selection_offer* aPrimaryDataOffer); explicit PrimaryDataOffer(zwp_primary_selection_offer_v1* aPrimaryDataOffer); ~PrimaryDataOffer() override; bool MatchesOffer(wl_data_offer* aDataOffer) override { return aDataOffer == reinterpret_cast(mPrimaryDataOfferGtk) || aDataOffer == reinterpret_cast(mPrimaryDataOfferZwpV1); } private: bool RequestDataTransfer(const char* aMimeType, int fd) override; gtk_primary_selection_offer* mPrimaryDataOfferGtk; zwp_primary_selection_offer_v1* mPrimaryDataOfferZwpV1; }; class RetrievalContextWayland : public RetrievalContext { public: explicit RetrievalContextWayland(bool aIsDragContext); virtual ClipboardData GetClipboardData(const char* aMimeType, int32_t aWhichClipboard) override; virtual mozilla::GUniquePtr GetClipboardText( int32_t aWhichClipboard) override; ClipboardTargets GetTargets(int32_t aWhichClipboard) override; void RegisterNewDataOffer(wl_data_offer* aDataOffer); void RegisterNewDataOffer(gtk_primary_selection_offer* aPrimaryDataOffer); void RegisterNewDataOffer(zwp_primary_selection_offer_v1* aPrimaryDataOffer); void SetClipboardDataOffer(wl_data_offer* aDataOffer); void SetPrimaryDataOffer(gtk_primary_selection_offer* aPrimaryDataOffer); void SetPrimaryDataOffer(zwp_primary_selection_offer_v1* aPrimaryDataOffer); void AddDragAndDropDataOffer(wl_data_offer* aDataOffer); RefPtr GetDataOffer() { return mDataOffer; } void ClearDragAndDropDataOffer(); bool HasSelectionSupport(void); private: ~RetrievalContextWayland(void) = default; ClipboardData WaitForClipboardData(ClipboardDataType aDataType, RefPtr aDataOffer, const char* aMimeType); RefPtr FindActiveOffer(wl_data_offer* aDataOffer, bool aRemove = false); void InsertOffer(RefPtr aDataOffer); private: // Data offers provided by Wayland data device nsTArray> mActiveOffers; RefPtr mClipboardOffer; RefPtr mPrimaryOffer; RefPtr mDataOffer; WUniquePtr mDataDevice; // Mime types used for text data at Wayland, // see gdk_wayland_selection_source_handles_target(). static constexpr int kTextMimeTypesNum = 4; static const char* sTextMimeTypes[kTextMimeTypesNum]; }; }; // namespace mozilla::widget #endif /* RetrievalContextWayland_h */