From db249648776875ce3142141d0d3055e43ce606aa Mon Sep 17 00:00:00 2001 From: Vaxry <43317083+vaxerski@users.noreply.github.com> Date: Sun, 15 Dec 2024 00:37:17 +0100 Subject: xwayland: Support cross DnD from Wayland (#8708) Adds support for drag-and-drop from Wayland clients to XWayland ones --- src/protocols/core/DataDevice.hpp | 69 ++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 30 deletions(-) (limited to 'src/protocols/core/DataDevice.hpp') diff --git a/src/protocols/core/DataDevice.hpp b/src/protocols/core/DataDevice.hpp index bf22b511..ae22e474 100644 --- a/src/protocols/core/DataDevice.hpp +++ b/src/protocols/core/DataDevice.hpp @@ -26,21 +26,27 @@ class CWLDataOfferResource; class CWLSurfaceResource; class CMonitor; -class CWLDataOfferResource { +class CWLDataOfferResource : public IDataOffer { public: CWLDataOfferResource(SP resource_, SP source_); ~CWLDataOfferResource(); - bool good(); - void sendData(); + bool good(); + void sendData(); + + virtual eDataSourceType type(); + virtual SP getWayland(); + virtual SP getX11(); + virtual SP getSource(); - WP source; + WP source; + WP self; - bool dead = false; - bool accepted = false; - bool recvd = false; + bool dead = false; + bool accepted = false; + bool recvd = false; - uint32_t actions = 0; + uint32_t actions = 0; private: SP resource; @@ -66,9 +72,9 @@ class CWLDataSourceResource : public IDataSource { virtual void error(uint32_t code, const std::string& msg); virtual void sendDndFinished(); virtual uint32_t actions(); // wl_data_device_manager.dnd_action - - void sendDndDropPerformed(); - void sendDndAction(wl_data_device_manager_dnd_action a); + virtual eDataSourceType type(); + virtual void sendDndDropPerformed(); + virtual void sendDndAction(wl_data_device_manager_dnd_action a); bool used = false; bool dnd = false; @@ -88,21 +94,24 @@ class CWLDataSourceResource : public IDataSource { friend class CWLDataDeviceProtocol; }; -class CWLDataDeviceResource { +class CWLDataDeviceResource : public IDataDevice { public: CWLDataDeviceResource(SP resource_); - bool good(); - wl_client* client(); + bool good(); + wl_client* client(); - void sendDataOffer(SP offer); - void sendEnter(uint32_t serial, SP surf, const Vector2D& local, SP offer); - void sendLeave(); - void sendMotion(uint32_t timeMs, const Vector2D& local); - void sendDrop(); - void sendSelection(SP offer); + virtual SP getWayland(); + virtual SP getX11(); + virtual void sendDataOffer(SP offer); + virtual void sendEnter(uint32_t serial, SP surf, const Vector2D& local, SP offer); + virtual void sendLeave(); + virtual void sendMotion(uint32_t timeMs, const Vector2D& local); + virtual void sendDrop(); + virtual void sendSelection(SP offer); + virtual eDataSourceType type(); - WP self; + WP self; private: SP resource; @@ -152,19 +161,19 @@ class CWLDataDeviceProtocol : public IWaylandProtocol { void onDestroyDataSource(WP source); void setSelection(SP source); - void sendSelectionToDevice(SP dev, SP sel); + void sendSelectionToDevice(SP dev, SP sel); void updateSelection(); void onKeyboardFocus(); void onDndPointerFocus(); struct { - WP focusedDevice; - WP currentSource; - WP dndSurface; - WP originSurface; - bool overriddenCursor = false; - CHyprSignalListener dndSurfaceDestroy; - CHyprSignalListener dndSurfaceCommit; + WP focusedDevice; + WP currentSource; + WP dndSurface; + WP originSurface; + bool overriddenCursor = false; + CHyprSignalListener dndSurfaceDestroy; + CHyprSignalListener dndSurfaceCommit; // for ending a dnd SP mouseMove; @@ -182,7 +191,7 @@ class CWLDataDeviceProtocol : public IWaylandProtocol { bool wasDragSuccessful(); // - SP dataDeviceForClient(wl_client*); + SP dataDeviceForClient(wl_client*); friend class CSeatManager; friend class CWLDataDeviceManagerResource; -- cgit v1.2.3