6 #include "datadevice_interface.h"
7 #include "dataoffer_interface_p.h"
8 #include "datasource_interface.h"
10 #include <QStringList>
12 #include <wayland-server.h>
21 const struct wl_data_offer_interface DataOfferInterface::Private::s_interface = {acceptCallback,
23 resourceDestroyedCallback,
28 DataOfferInterface::Private::Private(DataSourceInterface *source, DataDeviceInterface *parentInterface, DataOfferInterface *q, wl_resource *parentResource)
29 :
Resource::Private(q, nullptr, parentResource, &wl_data_offer_interface, &s_interface)
31 , dataDevice(parentInterface)
36 DataOfferInterface::Private::~Private() =
default;
38 void DataOfferInterface::Private::acceptCallback(wl_client *client, wl_resource *resource, uint32_t serial,
const char *mimeType)
42 auto p = cast<Private>(resource);
49 void DataOfferInterface::Private::receiveCallback(wl_client *client, wl_resource *resource,
const char *mimeType, int32_t fd)
55 void DataOfferInterface::Private::receive(
const QString &mimeType, qint32 fd)
61 source->requestData(mimeType, fd);
64 void DataOfferInterface::Private::finishCallback(wl_client *client, wl_resource *resource)
67 auto p = cast<Private>(resource);
71 p->source->dndFinished();
75 void DataOfferInterface::Private::setActionsCallback(wl_client *client, wl_resource *resource, uint32_t dnd_actions, uint32_t preferred_action)
79 DataDeviceManagerInterface::DnDActions supportedActions;
80 if (dnd_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY) {
81 supportedActions |= DataDeviceManagerInterface::DnDAction::Copy;
83 if (dnd_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE) {
84 supportedActions |= DataDeviceManagerInterface::DnDAction::Move;
86 if (dnd_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK) {
87 supportedActions |= DataDeviceManagerInterface::DnDAction::Ask;
90 if (dnd_actions & ~(WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY | WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE | WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK)) {
91 wl_resource_post_error(resource, WL_DATA_OFFER_ERROR_INVALID_ACTION_MASK,
"Invalid action mask");
94 if (preferred_action != WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY
95 && preferred_action != WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE
96 && preferred_action != WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK
97 && preferred_action != WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE) {
98 wl_resource_post_error(resource, WL_DATA_OFFER_ERROR_INVALID_ACTION,
"Invalid preferred action");
102 DataDeviceManagerInterface::DnDAction preferredAction = DataDeviceManagerInterface::DnDAction::None;
103 if (preferred_action == WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY) {
104 preferredAction = DataDeviceManagerInterface::DnDAction::Copy;
105 }
else if (preferred_action == WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE) {
106 preferredAction = DataDeviceManagerInterface::DnDAction::Move;
107 }
else if (preferred_action == WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK) {
108 preferredAction = DataDeviceManagerInterface::DnDAction::Ask;
111 auto p = cast<Private>(resource);
112 p->supportedDnDActions = supportedActions;
113 p->preferredDnDAction = preferredAction;
114 Q_EMIT p->q_func()->dragAndDropActionsChanged();
117 void DataOfferInterface::Private::sendSourceActions()
122 if (wl_resource_get_version(resource) < WL_DATA_OFFER_SOURCE_ACTIONS_SINCE_VERSION) {
125 uint32_t wlActions = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
126 const auto actions = source->supportedDragAndDropActions();
127 if (actions.testFlag(DataDeviceManagerInterface::DnDAction::Copy)) {
128 wlActions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
130 if (actions.testFlag(DataDeviceManagerInterface::DnDAction::Move)) {
131 wlActions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
133 if (actions.testFlag(DataDeviceManagerInterface::DnDAction::Ask)) {
134 wlActions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK;
136 wl_data_offer_send_source_actions(resource, wlActions);
139 DataOfferInterface::DataOfferInterface(DataSourceInterface *source, DataDeviceInterface *parentInterface, wl_resource *parentResource)
140 :
Resource(new Private(source, parentInterface, this, parentResource))
143 connect(source, &DataSourceInterface::mimeTypeOffered,
this, [
this](
const QString &mimeType) {
156 DataOfferInterface::~DataOfferInterface() =
default;
158 void DataOfferInterface::sendAllOffers()
161 for (
const QString &mimeType : d->source->mimeTypes()) {
166 DataOfferInterface::Private *DataOfferInterface::d_func()
const
168 return reinterpret_cast<DataOfferInterface::Private *
>(d.data());
174 return d->supportedDnDActions;
180 return d->preferredDnDAction;
186 if (wl_resource_get_version(d->resource) < WL_DATA_OFFER_ACTION_SINCE_VERSION) {
189 uint32_t wlAction = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
190 if (action == DataDeviceManagerInterface::DnDAction::Copy) {
191 wlAction = WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
192 }
else if (action == DataDeviceManagerInterface::DnDAction::Move) {
193 wlAction = WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
194 }
else if (action == DataDeviceManagerInterface::DnDAction::Ask) {
195 wlAction = WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK;
197 wl_data_offer_send_action(d->resource, wlAction);