Qt 6.x
The Qt SDK
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Pages
qwaylanddataoffer.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
6#include "qwaylanddisplay_p.h"
7
8#include <QtCore/private/qcore_unix_p.h>
9#include <QtGui/private/qguiapplication_p.h>
10#include <qpa/qplatformclipboard.h>
11
12#include <QtCore/QDebug>
13
15
16namespace QtWaylandClient {
17
19{
20 return QStringLiteral("text/plain;charset=utf-8");
21}
22
24 : QtWayland::wl_data_offer(offer)
25 , m_display(display)
26 , m_mimeData(new QWaylandMimeData(this))
27{
28}
29
31{
32 destroy();
33}
34
35
37{
38 if (m_mimeData->formats().isEmpty())
39 return QString();
40
41 return m_mimeData->formats().first();
42}
43
45{
46 return m_mimeData.data();
47}
48
50{
51 if (version() < 3) {
53 }
54
55 return m_supportedActions;
56}
57
59{
60 receive(mimeType, fd);
61 wl_display_flush(m_display->wl_display());
62}
63
65{
66 m_mimeData->appendFormat(mime_type);
67}
68
69void QWaylandDataOffer::data_offer_action(uint32_t dnd_action)
70{
71 Q_UNUSED(dnd_action);
72 // This is the compositor telling the drag target what action it should perform
73 // It does not map nicely into Qt final drop semantics, other than pretending there is only one supported action?
74}
75
77{
78 m_supportedActions = Qt::DropActions();
79 if (source_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_MOVE)
80 m_supportedActions |= Qt::MoveAction;
81 if (source_actions & WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY)
82 m_supportedActions |= Qt::CopyAction;
83}
84
86 : m_dataOffer(dataOffer)
87{
88}
89
91{
92}
93
95{
96 m_types << mimeType;
97 m_data.remove(mimeType); // Clear previous contents
98}
99
101{
102 if (m_types.contains(mimeType))
103 return true;
104
105 if (mimeType == QStringLiteral("text/plain") && m_types.contains(utf8Text()))
106 return true;
107
108 return false;
109}
110
112{
113 return m_types;
114}
115
117{
118 Q_UNUSED(type);
119
120 auto it = m_data.constFind(mimeType);
121 if (it != m_data.constEnd())
122 return *it;
123
125
126 if (!m_types.contains(mimeType)) {
127 if (mimeType == QStringLiteral("text/plain") && m_types.contains(utf8Text()))
128 mime = utf8Text();
129 else
130 return QVariant();
131 }
132
133 int pipefd[2];
134 if (qt_safe_pipe(pipefd) == -1) {
135 qWarning("QWaylandMimeData: pipe2() failed");
136 return QVariant();
137 }
138
139 m_dataOffer->startReceiving(mime, pipefd[1]);
140
141 close(pipefd[1]);
142
143 QByteArray content;
144 if (readData(pipefd[0], content) != 0) {
145 qWarning("QWaylandDataOffer: error reading data for mimeType %s", qPrintable(mimeType));
146 content = QByteArray();
147 }
148
149 close(pipefd[0]);
150 m_data.insert(mimeType, content);
151 return content;
152}
153
154int QWaylandMimeData::readData(int fd, QByteArray &data) const
155{
156 struct pollfd readset;
157 readset.fd = fd;
158 readset.events = POLLIN;
159 struct timespec timeout;
160 timeout.tv_sec = 1;
161 timeout.tv_nsec = 0;
162
163
164 Q_FOREVER {
165 int ready = qt_safe_poll(&readset, 1, &timeout);
166 if (ready < 0) {
167 qWarning() << "QWaylandDataOffer: qt_safe_poll() failed";
168 return -1;
169 } else if (ready == 0) {
170 qWarning("QWaylandDataOffer: timeout reading from pipe");
171 return -1;
172 } else {
173 char buf[4096];
174 int n = QT_READ(fd, buf, sizeof buf);
175
176 if (n < 0) {
177 qWarning("QWaylandDataOffer: read() failed");
178 return -1;
179 } else if (n == 0) {
180 return 0;
181 } else if (n > 0) {
182 data.append(buf, n);
183 }
184 }
185 }
186}
187
188}
189
\inmodule QtCore
Definition qbytearray.h:57
bool remove(const Key &key)
Removes the item that has the key from the hash.
Definition qhash.h:956
const_iterator constFind(const Key &key) const noexcept
Definition qhash.h:1279
const_iterator constEnd() const noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the ...
Definition qhash.h:1209
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
Definition qhash.h:1283
\inmodule QtCore
Definition qmetatype.h:320
\inmodule QtCore
Definition qmimedata.h:16
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:127
\inmodule QtCore
Definition qvariant.h:64
virtual void startReceiving(const QString &mimeType, int fd)=0
QWaylandDataOffer(QWaylandDisplay *display, struct ::wl_data_offer *offer)
Qt::DropActions supportedActions() const
void data_offer_action(uint32_t dnd_action) override
void data_offer_offer(const QString &mime_type) override
void data_offer_source_actions(uint32_t source_actions) override
void startReceiving(const QString &mimeType, int fd) override
struct wl_display * wl_display() const
QVariant retrieveData_sys(const QString &mimeType, QMetaType type) const override
void appendFormat(const QString &mimeType)
QStringList formats_sys() const override
QWaylandMimeData(QWaylandAbstractDataOffer *dataOffer)
bool hasFormat_sys(const QString &mimeType) const override
#define this
Definition dialogs.cpp:9
QSet< QString >::iterator it
struct wl_display * display
Definition linuxdmabuf.h:41
Combined button and popup list for selecting options.
static QString utf8Text()
@ CopyAction
@ MoveAction
int qt_safe_poll(struct pollfd *fds, nfds_t nfds, const struct timespec *timeout_ts)
#define QT_READ
static int qt_safe_pipe(int pipefd[2], int flags=0)
const char * mimeType
#define Q_FOREVER
Definition qforeach.h:70
#define qWarning
Definition qlogging.h:162
GLbitfield GLuint64 timeout
[4]
GLenum type
GLenum GLuint GLenum GLsizei const GLchar * buf
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLuint64 GLenum GLint fd
GLfloat n
#define qPrintable(string)
Definition qstring.h:1391
#define QStringLiteral(str)
#define Q_UNUSED(x)
application x qt windows mime
[2]
QByteArray readData()