#pragma once #include "../protocols/types/DataDevice.hpp" #include "../managers/SeatManager.hpp" #include "../managers/input/InputManager.hpp" #include #include #ifndef NO_XWAYLAND #include #endif #define XDND_VERSION 5 class CXWaylandSurface; class CX11DataOffer : public IDataOffer { public: CX11DataOffer() = default; ~CX11DataOffer() = default; virtual eDataSourceType type(); virtual SP getWayland(); virtual SP getX11(); virtual SP getSource(); virtual void markDead(); WP m_source; WP m_self; WP m_xwaylandSurface; }; class CX11DataSource : public IDataSource { public: CX11DataSource() = default; ~CX11DataSource() = default; virtual std::vector mimes(); virtual void send(const std::string& mime, Hyprutils::OS::CFileDescriptor fd); virtual void accepted(const std::string& mime); virtual void cancelled(); virtual bool hasDnd(); virtual bool dndDone(); virtual void error(uint32_t code, const std::string& msg); virtual void sendDndFinished(); virtual uint32_t actions(); // wl_data_device_manager.dnd_action virtual eDataSourceType type(); virtual void sendDndDropPerformed(); virtual void sendDndAction(wl_data_device_manager_dnd_action a); bool m_dnd = true; bool m_dndSuccess = false; bool m_dropped = false; std::vector m_mimeTypes; uint32_t m_supportedActions = 0; }; class CX11DataDevice : public IDataDevice { public: CX11DataDevice() = default; 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(); void forceCleanupDnd(); WP m_self; private: void cleanupState(); #ifndef NO_XWAYLAND xcb_window_t getProxyWindow(xcb_window_t window); void sendDndEvent(xcb_window_t targetWindow, xcb_atom_t type, xcb_client_message_data_t& data); #endif WP m_lastSurface; WP m_lastOffer; Vector2D m_lastSurfaceCoords; uint32_t m_lastTime = 0; };