diff options
author | Vaxry <[email protected]> | 2024-12-15 00:37:17 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2024-12-15 00:37:17 +0100 |
commit | db249648776875ce3142141d0d3055e43ce606aa (patch) | |
tree | 50cac68a73e0da6e8154bd4deef08a11e2784ad2 /src/xwayland/XWM.hpp | |
parent | 9f7a96b997d90c4c188f3837e02859a25a05611e (diff) | |
download | Hyprland-db249648776875ce3142141d0d3055e43ce606aa.tar.gz Hyprland-db249648776875ce3142141d0d3055e43ce606aa.zip |
xwayland: Support cross DnD from Wayland (#8708)
Adds support for drag-and-drop from Wayland clients to XWayland ones
Diffstat (limited to 'src/xwayland/XWM.hpp')
-rw-r--r-- | src/xwayland/XWM.hpp | 69 |
1 files changed, 42 insertions, 27 deletions
diff --git a/src/xwayland/XWM.hpp b/src/xwayland/XWM.hpp index d6d4f6f5..38fdab94 100644 --- a/src/xwayland/XWM.hpp +++ b/src/xwayland/XWM.hpp @@ -2,6 +2,7 @@ #include "../macros.hpp" #include "XDataSource.hpp" +#include "Dnd.hpp" #include "../helpers/memory/Memory.hpp" #include "../helpers/signal/Signal.hpp" @@ -104,7 +105,9 @@ class CXWM { CXWM(); ~CXWM(); - int onEvent(int fd, uint32_t mask); + int onEvent(int fd, uint32_t mask); + SP<CX11DataDevice> getDataDevice(); + SP<IDataOffer> createX11DataOffer(SP<CWLSurfaceResource> surf, SP<IDataSource> source); private: void setCursor(unsigned char* pixData, uint32_t stride, const Vector2D& size, const Vector2D& hotspot); @@ -128,6 +131,7 @@ class CXWM { void sendWMMessage(SP<CXWaylandSurface> surf, xcb_client_message_data_t* data, uint32_t mask); SP<CXWaylandSurface> windowForXID(xcb_window_t wid); + SP<CXWaylandSurface> windowForWayland(SP<CWLSurfaceResource> surf); void readWindowData(SP<CXWaylandSurface> surf); void associate(SP<CXWaylandSurface> surf, SP<CWLSurfaceResource> wlSurf); @@ -135,33 +139,37 @@ class CXWM { void updateClientList(); + void sendDndEvent(SP<CWLSurfaceResource> destination, xcb_atom_t type, xcb_client_message_data_t& data); + // event handlers - void handleCreate(xcb_create_notify_event_t* e); - void handleDestroy(xcb_destroy_notify_event_t* e); - void handleConfigure(xcb_configure_request_event_t* e); - void handleConfigureNotify(xcb_configure_notify_event_t* e); - void handleMapRequest(xcb_map_request_event_t* e); - void handleMapNotify(xcb_map_notify_event_t* e); - void handleUnmapNotify(xcb_unmap_notify_event_t* e); - void handlePropertyNotify(xcb_property_notify_event_t* e); - void handleClientMessage(xcb_client_message_event_t* e); - void handleFocusIn(xcb_focus_in_event_t* e); - void handleFocusOut(xcb_focus_out_event_t* e); - void handleError(xcb_value_error_t* e); - - bool handleSelectionEvent(xcb_generic_event_t* e); - void handleSelectionNotify(xcb_selection_notify_event_t* e); - bool handleSelectionPropertyNotify(xcb_property_notify_event_t* e); - void handleSelectionRequest(xcb_selection_request_event_t* e); - bool handleSelectionXFixesNotify(xcb_xfixes_selection_notify_event_t* e); - - void selectionSendNotify(xcb_selection_request_event_t* e, bool success); - xcb_atom_t mimeToAtom(const std::string& mime); - std::string mimeFromAtom(xcb_atom_t atom); - void setClipboardToWayland(SXSelection& sel); - void getTransferData(SXSelection& sel); - std::string getAtomName(uint32_t atom); - void readProp(SP<CXWaylandSurface> XSURF, uint32_t atom, xcb_get_property_reply_t* reply); + void handleCreate(xcb_create_notify_event_t* e); + void handleDestroy(xcb_destroy_notify_event_t* e); + void handleConfigure(xcb_configure_request_event_t* e); + void handleConfigureNotify(xcb_configure_notify_event_t* e); + void handleMapRequest(xcb_map_request_event_t* e); + void handleMapNotify(xcb_map_notify_event_t* e); + void handleUnmapNotify(xcb_unmap_notify_event_t* e); + void handlePropertyNotify(xcb_property_notify_event_t* e); + void handleClientMessage(xcb_client_message_event_t* e); + void handleFocusIn(xcb_focus_in_event_t* e); + void handleFocusOut(xcb_focus_out_event_t* e); + void handleError(xcb_value_error_t* e); + + bool handleSelectionEvent(xcb_generic_event_t* e); + void handleSelectionNotify(xcb_selection_notify_event_t* e); + bool handleSelectionPropertyNotify(xcb_property_notify_event_t* e); + void handleSelectionRequest(xcb_selection_request_event_t* e); + bool handleSelectionXFixesNotify(xcb_xfixes_selection_notify_event_t* e); + + void selectionSendNotify(xcb_selection_request_event_t* e, bool success); + xcb_atom_t mimeToAtom(const std::string& mime); + std::string mimeFromAtom(xcb_atom_t atom); + void setClipboardToWayland(SXSelection& sel); + void getTransferData(SXSelection& sel); + std::string getAtomName(uint32_t atom); + void readProp(SP<CXWaylandSurface> XSURF, uint32_t atom, xcb_get_property_reply_t* reply); + + SXSelection* getSelection(xcb_atom_t atom); // CXCBConnection connection; @@ -191,6 +199,9 @@ class CXWM { uint64_t lastFocusSeq = 0; SXSelection clipboard; + SXSelection dndSelection; + SP<CX11DataDevice> dndDataDevice = makeShared<CX11DataDevice>(); + std::vector<SP<CX11DataOffer>> dndDataOffers; struct { CHyprSignalListener newWLSurface; @@ -200,6 +211,10 @@ class CXWM { friend class CXWaylandSurface; friend class CXWayland; friend class CXDataSource; + friend class CX11DataDevice; + friend class CX11DataSource; + friend class CX11DataOffer; + friend class CWLDataDeviceProtocol; friend struct SXSelection; friend struct SXTransfer; }; |