6 #include "datadevice.h"
7 #include "datasource.h"
9 #include "wayland_pointer_p.h"
13 #include <wayland-client-protocol.h>
19 class Q_DECL_HIDDEN DataDevice::Private
22 explicit Private(DataDevice *q);
23 void setup(wl_data_device *d);
25 WaylandPointer<wl_data_device, wl_data_device_release> device;
34 void dataOffer(wl_data_offer *
id);
35 void selection(wl_data_offer *
id);
36 void dragEnter(quint32 serial,
const QPointer<Surface> &surface,
const QPointF &relativeToSurface, wl_data_offer *dataOffer);
38 static void dataOfferCallback(
void *data, wl_data_device *dataDevice, wl_data_offer *
id);
39 static void enterCallback(
void *data, wl_data_device *dataDevice, uint32_t serial, wl_surface *surface, wl_fixed_t x, wl_fixed_t y, wl_data_offer *
id);
40 static void leaveCallback(
void *data, wl_data_device *dataDevice);
41 static void motionCallback(
void *data, wl_data_device *dataDevice, uint32_t time, wl_fixed_t x, wl_fixed_t y);
42 static void dropCallback(
void *data, wl_data_device *dataDevice);
43 static void selectionCallback(
void *data, wl_data_device *dataDevice, wl_data_offer *
id);
45 static const struct wl_data_device_listener s_listener;
48 DataOffer *lastOffer =
nullptr;
51 const wl_data_device_listener DataDevice::Private::s_listener =
52 {dataOfferCallback, enterCallback, leaveCallback, motionCallback, dropCallback, selectionCallback};
54 void DataDevice::Private::dataOfferCallback(
void *data, wl_data_device *dataDevice, wl_data_offer *
id)
56 auto d =
reinterpret_cast<Private *
>(data);
57 Q_ASSERT(d->device == dataDevice);
61 void DataDevice::Private::dataOffer(wl_data_offer *
id)
64 lastOffer =
new DataOffer(q,
id);
65 Q_ASSERT(lastOffer->isValid());
68 void DataDevice::Private::enterCallback(
void *data,
69 wl_data_device *dataDevice,
76 auto d =
reinterpret_cast<Private *
>(data);
77 Q_ASSERT(d->device == dataDevice);
81 void DataDevice::Private::dragEnter(quint32 serial,
const QPointer<Surface> &surface,
const QPointF &relativeToSurface, wl_data_offer *dataOffer)
83 drag.surface = surface;
84 Q_ASSERT(*lastOffer == dataOffer);
85 drag.offer = lastOffer;
87 Q_EMIT q->dragEntered(serial, relativeToSurface);
90 void DataDevice::Private::leaveCallback(
void *data, wl_data_device *dataDevice)
92 auto d =
reinterpret_cast<Private *
>(data);
93 Q_ASSERT(d->device == dataDevice);
97 void DataDevice::Private::dragLeft()
103 Q_EMIT q->dragLeft();
106 void DataDevice::Private::motionCallback(
void *data, wl_data_device *dataDevice, uint32_t time, wl_fixed_t x, wl_fixed_t y)
108 auto d =
reinterpret_cast<Private *
>(data);
109 Q_ASSERT(d->device == dataDevice);
110 Q_EMIT d->q->dragMotion(
QPointF(wl_fixed_to_double(x), wl_fixed_to_double(y)), time);
113 void DataDevice::Private::dropCallback(
void *data, wl_data_device *dataDevice)
115 auto d =
reinterpret_cast<Private *
>(data);
116 Q_ASSERT(d->device == dataDevice);
117 Q_EMIT d->q->dropped();
120 void DataDevice::Private::selectionCallback(
void *data, wl_data_device *dataDevice, wl_data_offer *
id)
122 auto d =
reinterpret_cast<Private *
>(data);
123 Q_ASSERT(d->device == dataDevice);
127 void DataDevice::Private::selection(wl_data_offer *
id)
130 selectionOffer.reset();
131 Q_EMIT q->selectionCleared();
134 Q_ASSERT(*lastOffer ==
id);
135 selectionOffer.reset(lastOffer);
137 Q_EMIT q->selectionOffered(selectionOffer.data());
140 DataDevice::Private::Private(DataDevice *q)
145 void DataDevice::Private::setup(wl_data_device *d)
148 Q_ASSERT(!device.isValid());
150 wl_data_device_add_listener(device, &s_listener,
this);
153 DataDevice::DataDevice(
QObject *parent)
155 , d(new Private(this))
159 DataDevice::~DataDevice()
162 delete d->drag.offer;
167 void DataDevice::destroy()
177 bool DataDevice::isValid()
const
179 return d->device.isValid();
182 void DataDevice::setup(wl_data_device *dataDevice)
184 d->setup(dataDevice);
187 void DataDevice::startDragInternally(quint32 serial,
Surface *origin,
Surface *icon)
189 startDrag(serial,
nullptr, origin, icon);
194 static wl_data_source *dataSource(
const DataSource *source)
203 void DataDevice::startDrag(quint32 serial, DataSource *source, Surface *origin, Surface *icon)
205 wl_data_device_start_drag(d->device, dataSource(source), *origin, icon ? (wl_surface *)*icon :
nullptr, serial);
208 void DataDevice::setSelection(quint32 serial, DataSource *source)
210 wl_data_device_set_selection(d->device, dataSource(source), serial);
213 void DataDevice::clearSelection(quint32 serial)
215 setSelection(serial);
218 DataOffer *DataDevice::offeredSelection()
const
220 return d->selectionOffer.data();
225 return d->drag.surface;
230 return d->drag.offer;
233 DataDevice::operator wl_data_device *()
238 DataDevice::operator wl_data_device *()
const
246 #include "moc_datadevice.cpp"