7 #include "datadevice.h"
8 #include "wayland_pointer_p.h"
10 #include <QMimeDatabase>
13 #include <wayland-client-protocol.h>
19 class Q_DECL_HIDDEN DataOffer::Private
22 Private(wl_data_offer *offer, DataOffer *q);
23 WaylandPointer<wl_data_offer, wl_data_offer_destroy> dataOffer;
25 DataDeviceManager::DnDActions sourceActions = DataDeviceManager::DnDAction::None;
29 void offer(
const QString &mimeType);
31 static void offerCallback(
void *data, wl_data_offer *dataOffer,
const char *mimeType);
32 static void sourceActionsCallback(
void *data, wl_data_offer *wl_data_offer, uint32_t source_actions);
33 static void actionCallback(
void *data, wl_data_offer *wl_data_offer, uint32_t dnd_action);
36 static const struct wl_data_offer_listener s_listener;
40 const struct wl_data_offer_listener DataOffer::Private::s_listener = {offerCallback, sourceActionsCallback, actionCallback};
43 DataOffer::Private::Private(wl_data_offer *offer, DataOffer *q)
46 dataOffer.setup(offer);
47 wl_data_offer_add_listener(offer, &s_listener,
this);
50 void DataOffer::Private::offerCallback(
void *data, wl_data_offer *dataOffer,
const char *mimeType)
52 auto d =
reinterpret_cast<Private *
>(data);
53 Q_ASSERT(d->dataOffer == dataOffer);
57 void DataOffer::Private::offer(
const QString &mimeType)
63 Q_EMIT q->mimeTypeOffered(m.name());
67 void DataOffer::Private::sourceActionsCallback(
void *data, wl_data_offer *wl_data_offer, uint32_t source_actions)
69 Q_UNUSED(wl_data_offer)
70 DataDeviceManager::DnDActions actions;
71 if (source_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY) {
72 actions |= DataDeviceManager::DnDAction::Copy;
74 if (source_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE) {
75 actions |= DataDeviceManager::DnDAction::Move;
77 if (source_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK) {
78 actions |= DataDeviceManager::DnDAction::Ask;
80 auto d =
reinterpret_cast<Private *
>(data);
81 if (d->sourceActions != actions) {
82 d->sourceActions = actions;
83 Q_EMIT d->q->sourceDragAndDropActionsChanged();
87 void DataOffer::Private::actionCallback(
void *data, wl_data_offer *wl_data_offer, uint32_t dnd_action)
89 Q_UNUSED(wl_data_offer)
90 auto d =
reinterpret_cast<Private *
>(data);
92 case WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY:
93 d->setAction(DataDeviceManager::DnDAction::Copy);
95 case WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE:
96 d->setAction(DataDeviceManager::DnDAction::Move);
98 case WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK:
99 d->setAction(DataDeviceManager::DnDAction::Ask);
101 case WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE:
102 d->setAction(DataDeviceManager::DnDAction::None);
109 void DataOffer::Private::setAction(DataDeviceManager::DnDAction action)
111 if (action == selectedAction) {
114 selectedAction = action;
115 Q_EMIT q->selectedDragAndDropActionChanged();
118 DataOffer::DataOffer(DataDevice *parent, wl_data_offer *dataOffer)
120 , d(new Private(dataOffer, this))
124 DataOffer::~DataOffer()
131 d->dataOffer.release();
134 void DataOffer::destroy()
136 d->dataOffer.destroy();
139 bool DataOffer::isValid()
const
141 return d->dataOffer.isValid();
149 void DataOffer::accept(
const QMimeType &mimeType, quint32 serial)
151 accept(mimeType.name(), serial);
154 void DataOffer::accept(
const QString &mimeType, quint32 serial)
156 wl_data_offer_accept(d->dataOffer, serial, mimeType.
toUtf8().
constData());
159 void DataOffer::receive(
const QMimeType &mimeType, qint32 fd)
161 receive(mimeType.name(), fd);
164 void DataOffer::receive(
const QString &mimeType, qint32 fd)
167 wl_data_offer_receive(d->dataOffer, mimeType.
toUtf8().
constData(), fd);
170 DataOffer::operator wl_data_offer *()
175 DataOffer::operator wl_data_offer *()
const
180 void DataOffer::dragAndDropFinished()
183 if (wl_proxy_get_version(d->dataOffer) < WL_DATA_OFFER_FINISH_SINCE_VERSION) {
186 wl_data_offer_finish(d->dataOffer);
191 return d->sourceActions;
196 if (wl_proxy_get_version(d->dataOffer) < WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION) {
201 case DataDeviceManager::DnDAction::Copy:
202 return WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
203 case DataDeviceManager::DnDAction::Move:
204 return WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
205 case DataDeviceManager::DnDAction::Ask:
206 return WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK;
207 case DataDeviceManager::DnDAction::None:
208 return WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
213 uint32_t wlSupported = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
214 if (supported.
testFlag(DataDeviceManager::DnDAction::Copy)) {
215 wlSupported |= toWayland(DataDeviceManager::DnDAction::Copy);
217 if (supported.
testFlag(DataDeviceManager::DnDAction::Move)) {
218 wlSupported |= toWayland(DataDeviceManager::DnDAction::Move);
220 if (supported.
testFlag(DataDeviceManager::DnDAction::Ask)) {
221 wlSupported |= toWayland(DataDeviceManager::DnDAction::Ask);
223 wl_data_offer_set_actions(d->dataOffer, wlSupported, toWayland(preferred));
228 return d->selectedAction;