Changeset View
Changeset View
Standalone View
Standalone View
src/client/dataoffer.cpp
Show All 32 Lines | |||||
33 | { | 33 | { | ||
34 | 34 | | |||
35 | class Q_DECL_HIDDEN DataOffer::Private | 35 | class Q_DECL_HIDDEN DataOffer::Private | ||
36 | { | 36 | { | ||
37 | public: | 37 | public: | ||
38 | Private(wl_data_offer *offer, DataOffer *q); | 38 | Private(wl_data_offer *offer, DataOffer *q); | ||
39 | WaylandPointer<wl_data_offer, wl_data_offer_destroy> dataOffer; | 39 | WaylandPointer<wl_data_offer, wl_data_offer_destroy> dataOffer; | ||
40 | QList<QMimeType> mimeTypes; | 40 | QList<QMimeType> mimeTypes; | ||
41 | DataDeviceManager::DnDActions sourceActions = DataDeviceManager::DnDAction::None; | ||||
42 | DataDeviceManager::DnDAction selectedAction = DataDeviceManager::DnDAction::None; | ||||
41 | 43 | | |||
42 | private: | 44 | private: | ||
43 | void offer(const QString &mimeType); | 45 | void offer(const QString &mimeType); | ||
46 | void setAction(DataDeviceManager::DnDAction action); | ||||
44 | static void offerCallback(void *data, wl_data_offer *dataOffer, const char *mimeType); | 47 | static void offerCallback(void *data, wl_data_offer *dataOffer, const char *mimeType); | ||
48 | static void sourceActionsCallback(void *data, wl_data_offer *wl_data_offer, uint32_t source_actions); | ||||
49 | static void actionCallback(void *data, wl_data_offer *wl_data_offer, uint32_t dnd_action); | ||||
45 | DataOffer *q; | 50 | DataOffer *q; | ||
46 | 51 | | |||
47 | static const struct wl_data_offer_listener s_listener; | 52 | static const struct wl_data_offer_listener s_listener; | ||
48 | }; | 53 | }; | ||
49 | 54 | | |||
50 | #ifndef DOXYGEN_SHOULD_SKIP_THIS | 55 | #ifndef DOXYGEN_SHOULD_SKIP_THIS | ||
51 | const struct wl_data_offer_listener DataOffer::Private::s_listener = { | 56 | const struct wl_data_offer_listener DataOffer::Private::s_listener = { | ||
52 | offerCallback | 57 | offerCallback, | ||
58 | sourceActionsCallback, | ||||
59 | actionCallback | ||||
53 | }; | 60 | }; | ||
54 | #endif | 61 | #endif | ||
55 | 62 | | |||
56 | DataOffer::Private::Private(wl_data_offer *offer, DataOffer *q) | 63 | DataOffer::Private::Private(wl_data_offer *offer, DataOffer *q) | ||
57 | : q(q) | 64 | : q(q) | ||
58 | { | 65 | { | ||
59 | dataOffer.setup(offer); | 66 | dataOffer.setup(offer); | ||
60 | wl_data_offer_add_listener(offer, &s_listener, this); | 67 | wl_data_offer_add_listener(offer, &s_listener, this); | ||
Show All 11 Lines | 78 | { | |||
72 | QMimeDatabase db; | 79 | QMimeDatabase db; | ||
73 | const auto &m = db.mimeTypeForName(mimeType); | 80 | const auto &m = db.mimeTypeForName(mimeType); | ||
74 | if (m.isValid()) { | 81 | if (m.isValid()) { | ||
75 | mimeTypes << m; | 82 | mimeTypes << m; | ||
76 | emit q->mimeTypeOffered(m.name()); | 83 | emit q->mimeTypeOffered(m.name()); | ||
77 | } | 84 | } | ||
78 | } | 85 | } | ||
79 | 86 | | |||
87 | void DataOffer::Private::sourceActionsCallback(void *data, wl_data_offer *wl_data_offer, uint32_t source_actions) | ||||
88 | { | ||||
89 | Q_UNUSED(wl_data_offer) | ||||
90 | DataDeviceManager::DnDActions actions; | ||||
91 | if (source_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY) { | ||||
92 | actions |= DataDeviceManager::DnDAction::Copy; | ||||
93 | } | ||||
94 | if (source_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE) { | ||||
95 | actions |= DataDeviceManager::DnDAction::Move; | ||||
96 | } | ||||
97 | if (source_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK) { | ||||
98 | actions |= DataDeviceManager::DnDAction::Ask; | ||||
99 | } | ||||
100 | auto d = reinterpret_cast<Private*>(data); | ||||
101 | if (d->sourceActions != actions) { | ||||
102 | d->sourceActions = actions; | ||||
103 | emit d->q->sourceDragAndDropActionsChanged(); | ||||
104 | } | ||||
105 | } | ||||
106 | | ||||
107 | void DataOffer::Private::actionCallback(void *data, wl_data_offer *wl_data_offer, uint32_t dnd_action) | ||||
108 | { | ||||
109 | Q_UNUSED(wl_data_offer) | ||||
110 | auto d = reinterpret_cast<Private*>(data); | ||||
111 | switch(dnd_action) { | ||||
112 | case WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY: | ||||
113 | d->setAction(DataDeviceManager::DnDAction::Copy); | ||||
114 | break; | ||||
115 | case WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE: | ||||
116 | d->setAction(DataDeviceManager::DnDAction::Move); | ||||
117 | break; | ||||
118 | case WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK: | ||||
119 | d->setAction(DataDeviceManager::DnDAction::Ask); | ||||
120 | break; | ||||
121 | case WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE: | ||||
122 | d->setAction(DataDeviceManager::DnDAction::None); | ||||
123 | break; | ||||
124 | default: | ||||
125 | Q_UNREACHABLE(); | ||||
126 | } | ||||
127 | } | ||||
128 | | ||||
129 | void DataOffer::Private::setAction(DataDeviceManager::DnDAction action) | ||||
130 | { | ||||
131 | if (action == selectedAction) { | ||||
132 | return; | ||||
133 | } | ||||
134 | selectedAction = action; | ||||
135 | emit q->selectedDragAndDropActionChanged(); | ||||
136 | } | ||||
137 | | ||||
80 | DataOffer::DataOffer(DataDevice *parent, wl_data_offer *dataOffer) | 138 | DataOffer::DataOffer(DataDevice *parent, wl_data_offer *dataOffer) | ||
81 | : QObject(parent) | 139 | : QObject(parent) | ||
82 | , d(new Private(dataOffer, this)) | 140 | , d(new Private(dataOffer, this)) | ||
83 | { | 141 | { | ||
84 | } | 142 | } | ||
85 | 143 | | |||
86 | DataOffer::~DataOffer() | 144 | DataOffer::~DataOffer() | ||
87 | { | 145 | { | ||
Show All 36 Lines | 181 | { | |||
124 | return d->dataOffer; | 182 | return d->dataOffer; | ||
125 | } | 183 | } | ||
126 | 184 | | |||
127 | DataOffer::operator wl_data_offer*() const | 185 | DataOffer::operator wl_data_offer*() const | ||
128 | { | 186 | { | ||
129 | return d->dataOffer; | 187 | return d->dataOffer; | ||
130 | } | 188 | } | ||
131 | 189 | | |||
190 | void DataOffer::dragAndDropFinished() | ||||
191 | { | ||||
192 | Q_ASSERT(isValid()); | ||||
193 | if (wl_proxy_get_version(d->dataOffer) < WL_DATA_OFFER_FINISH_SINCE_VERSION) { | ||||
194 | return; | ||||
195 | } | ||||
196 | wl_data_offer_finish(d->dataOffer); | ||||
197 | } | ||||
198 | | ||||
199 | DataDeviceManager::DnDActions DataOffer::sourceDragAndDropActions() const | ||||
200 | { | ||||
201 | return d->sourceActions; | ||||
202 | } | ||||
203 | | ||||
204 | void DataOffer::setDragAndDropActions(DataDeviceManager::DnDActions supported, DataDeviceManager::DnDAction preferred) | ||||
205 | { | ||||
206 | if (wl_proxy_get_version(d->dataOffer) < WL_DATA_OFFER_SET_ACTIONS_SINCE_VERSION) { | ||||
207 | return; | ||||
208 | } | ||||
209 | auto toWayland = [] (DataDeviceManager::DnDAction action) { | ||||
210 | switch (action) { | ||||
211 | case DataDeviceManager::DnDAction::Copy: | ||||
212 | return WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY; | ||||
213 | case DataDeviceManager::DnDAction::Move: | ||||
214 | return WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE; | ||||
215 | case DataDeviceManager::DnDAction::Ask: | ||||
216 | return WL_DATA_DEVICE_MANAGER_DND_ACTION_ASK; | ||||
217 | case DataDeviceManager::DnDAction::None: | ||||
218 | return WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE; | ||||
219 | default: | ||||
220 | Q_UNREACHABLE(); | ||||
221 | } | ||||
222 | }; | ||||
223 | uint32_t wlSupported = WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE; | ||||
224 | if (supported.testFlag(DataDeviceManager::DnDAction::Copy)) { | ||||
225 | wlSupported |= toWayland(DataDeviceManager::DnDAction::Copy); | ||||
226 | } | ||||
227 | if (supported.testFlag(DataDeviceManager::DnDAction::Move)) { | ||||
228 | wlSupported |= toWayland(DataDeviceManager::DnDAction::Move); | ||||
229 | } | ||||
230 | if (supported.testFlag(DataDeviceManager::DnDAction::Ask)) { | ||||
231 | wlSupported |= toWayland(DataDeviceManager::DnDAction::Ask); | ||||
232 | } | ||||
233 | wl_data_offer_set_actions(d->dataOffer, wlSupported, toWayland(preferred)); | ||||
234 | } | ||||
235 | | ||||
236 | DataDeviceManager::DnDAction DataOffer::selectedDragAndDropAction() const | ||||
237 | { | ||||
238 | return d->selectedAction; | ||||
239 | } | ||||
240 | | ||||
132 | } | 241 | } | ||
133 | } | 242 | } |