6 #include "datasource.h"
7 #include "wayland_pointer_p.h"
11 #include <wayland-client-protocol.h>
17 class Q_DECL_HIDDEN DataSource::Private
20 explicit Private(DataSource *q);
21 void setup(wl_data_source *s);
23 WaylandPointer<wl_data_source, wl_data_source_destroy> source;
28 static void targetCallback(
void *data, wl_data_source *dataSource,
const char *mimeType);
29 static void sendCallback(
void *data, wl_data_source *dataSource,
const char *mimeType, int32_t fd);
30 static void cancelledCallback(
void *data, wl_data_source *dataSource);
31 static void dndDropPerformedCallback(
void *data, wl_data_source *wl_data_source);
32 static void dndFinishedCallback(
void *data, wl_data_source *wl_data_source);
33 static void actionCallback(
void *data, wl_data_source *wl_data_source, uint32_t dnd_action);
35 static const struct wl_data_source_listener s_listener;
40 const wl_data_source_listener DataSource::Private::s_listener =
41 {targetCallback, sendCallback, cancelledCallback, dndDropPerformedCallback, dndFinishedCallback, actionCallback};
43 DataSource::Private::Private(DataSource *q)
48 void DataSource::Private::targetCallback(
void *data, wl_data_source *dataSource,
const char *mimeType)
50 auto d =
reinterpret_cast<DataSource::Private *
>(data);
51 Q_ASSERT(d->source == dataSource);
55 void DataSource::Private::sendCallback(
void *data, wl_data_source *dataSource,
const char *mimeType, int32_t fd)
57 auto d =
reinterpret_cast<DataSource::Private *
>(data);
58 Q_ASSERT(d->source == dataSource);
62 void DataSource::Private::cancelledCallback(
void *data, wl_data_source *dataSource)
64 auto d =
reinterpret_cast<DataSource::Private *
>(data);
65 Q_ASSERT(d->source == dataSource);
66 Q_EMIT d->q->cancelled();
69 void DataSource::Private::dndDropPerformedCallback(
void *data, wl_data_source *wl_data_source)
71 Q_UNUSED(wl_data_source)
72 auto d =
reinterpret_cast<DataSource::Private *
>(data);
73 Q_EMIT d->q->dragAndDropPerformed();
76 void DataSource::Private::dndFinishedCallback(
void *data, wl_data_source *wl_data_source)
78 Q_UNUSED(wl_data_source)
79 auto d =
reinterpret_cast<DataSource::Private *
>(data);
80 Q_EMIT d->q->dragAndDropFinished();
83 void DataSource::Private::actionCallback(
void *data, wl_data_source *wl_data_source, uint32_t dnd_action)
85 Q_UNUSED(wl_data_source)
86 auto d =
reinterpret_cast<Private *
>(data);
88 case WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY:
89 d->setAction(DataDeviceManager::DnDAction::Copy);
91 case WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE:
92 d->setAction(DataDeviceManager::DnDAction::Move);
94 case WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK:
95 d->setAction(DataDeviceManager::DnDAction::Ask);
97 case WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE:
98 d->setAction(DataDeviceManager::DnDAction::None);
105 void DataSource::Private::setAction(DataDeviceManager::DnDAction action)
107 if (action == selectedAction) {
110 selectedAction = action;
111 Q_EMIT q->selectedDragAndDropActionChanged();
114 void DataSource::Private::setup(wl_data_source *s)
116 Q_ASSERT(!source.isValid());
119 wl_data_source_add_listener(s, &s_listener,
this);
122 DataSource::DataSource(
QObject *parent)
124 , d(new Private(this))
128 DataSource::~DataSource()
138 void DataSource::destroy()
143 bool DataSource::isValid()
const
145 return d->source.isValid();
148 void DataSource::setup(wl_data_source *dataSource)
150 d->setup(dataSource);
153 void DataSource::offer(
const QString &mimeType)
158 void DataSource::offer(
const QMimeType &mimeType)
160 if (!mimeType.isValid()) {
163 offer(mimeType.name());
166 DataSource::operator wl_data_source *()
const
171 DataSource::operator wl_data_source *()
178 uint32_t wlActions = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
179 if (actions.
testFlag(DataDeviceManager::DnDAction::Copy)) {
180 wlActions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY;
182 if (actions.
testFlag(DataDeviceManager::DnDAction::Move)) {
183 wlActions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE;
185 if (actions.
testFlag(DataDeviceManager::DnDAction::Ask)) {
186 wlActions |= WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK;
188 wl_data_source_set_actions(d->source, wlActions);
193 return d->selectedAction;