Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qqnxclipboard.cpp
Go to the documentation of this file.
1// Copyright (C) 2011 - 2012 Research In Motion
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#undef QT_NO_FOREACH // this file contains unported legacy Q_FOREACH uses
5
6#if !defined(QT_NO_CLIPBOARD)
7
8#include "qqnxclipboard.h"
9
10#include <QtGui/QColor>
11
12#include <QtCore/QDebug>
13#include <QtCore/QMimeData>
14#include <QtCore/QStringList>
15#include <QtCore/QUrl>
16
17#include <clipboard/clipboard.h>
18#include <errno.h>
19
21
22Q_LOGGING_CATEGORY(lcQpaClipboard, "qt.qpa.clipboard");
23
24// null terminated array
25static const char *typeList[] = {"text/html", "text/plain", "image/png", "image/jpeg", "application/x-color", 0};
26
28{
29 char *pbuffer;
30 if (is_clipboard_format_present(type) == 0) {
31 int size = get_clipboard_data(type, &pbuffer);
32 if (size != -1 && pbuffer) {
33 const QByteArray result = QByteArray(pbuffer, size);
34 free(pbuffer);
35 return result;
36 }
37 }
38
39 return QByteArray();
40}
41
43{
45public:
47 : QMimeData(),
48 m_clipboard(clipboard),
49 m_userMimeData(0)
50 {
51 Q_ASSERT(clipboard);
52
53 for (int i = 0; typeList[i] != 0; ++i) {
54 m_formatsToCheck << QString::fromUtf8(typeList[i]);
55 }
56 }
57
59 {
60 delete m_userMimeData;
61 }
62
64 m_formatsToCheck << format;
65 qCDebug(lcQpaClipboard) << "formats=" << m_formatsToCheck;
66 }
67
68 bool hasFormat(const QString &mimetype) const override
69 {
70 const bool result = is_clipboard_format_present(mimetype.toUtf8().constData()) == 0;
71 qCDebug(lcQpaClipboard) << "mimetype=" << mimetype << "result=" << result;
72 return result;
73 }
74
75 QStringList formats() const override
76 {
78
79 Q_FOREACH (const QString &format, m_formatsToCheck) {
80 if (is_clipboard_format_present(format.toUtf8().constData()) == 0)
81 result << format;
82 }
83
84 qCDebug(lcQpaClipboard) << "result=" << result;
85 return result;
86 }
87
89 {
90 delete m_userMimeData;
91 m_userMimeData = userMimeData;
92
93 // system clipboard API doesn't allow detection of changes by other applications
94 // simulate an owner change through delayed invocation
95 // basically transfer ownership of data to the system clipboard once event processing resumes
96 if (m_userMimeData)
97 QMetaObject::invokeMethod(this, "releaseOwnership", Qt::QueuedConnection);
98 }
99
101 {
102 return m_userMimeData;
103 }
104
105protected:
106 QVariant retrieveData(const QString &mimetype, QMetaType preferredType) const override
107 {
108 qCDebug(lcQpaClipboard) << "mimetype=" << mimetype << "preferredType=" << preferredType.name();
109 if (is_clipboard_format_present(mimetype.toUtf8().constData()) != 0)
110 return QMimeData::retrieveData(mimetype, preferredType);
111
112 const QByteArray data = readClipboardBuff(mimetype.toUtf8().constData());
114 }
115
116private Q_SLOTS:
117 void releaseOwnership()
118 {
119 if (m_userMimeData) {
120 qCDebug(lcQpaClipboard) << "user data formats=" << m_userMimeData->formats() << "system formats=" << formats();
121 delete m_userMimeData;
122 m_userMimeData = 0;
124 }
125 }
126
127private:
128 QQnxClipboard * const m_clipboard;
129
130 QSet<QString> m_formatsToCheck;
131 QMimeData *m_userMimeData;
132};
133
135 : m_mimeData(new MimeData(this))
136{
137}
138
140{
141 delete m_mimeData;
142}
143
145{
147 return;
148
149 if (m_mimeData == data)
150 return;
151
152 if (m_mimeData->userMimeData() && m_mimeData->userMimeData() == data)
153 return;
154
155 empty_clipboard();
156
157 m_mimeData->clear();
158 m_mimeData->setUserMimeData(data);
159
160 if (data == 0) {
162 return;
163 }
164
165 const QStringList formats = data->formats();
166 qCDebug(lcQpaClipboard) << "formats=" << formats;
167
168 Q_FOREACH (const QString &format, formats) {
169 const QByteArray buf = data->data(format);
170
171 if (buf.isEmpty())
172 continue;
173
174 int ret = set_clipboard_data(format.toUtf8().data(), buf.size(), buf.data());
175 qCDebug(lcQpaClipboard) << "set " << format << "to clipboard, size=" << buf.size() << ";ret=" << ret;
176 if (ret)
177 m_mimeData->addFormatToCheck(format);
178 }
179
181}
182
184{
186 return 0;
187
188 if (m_mimeData->userMimeData())
189 return m_mimeData->userMimeData();
190
191 m_mimeData->clear();
192
193 return m_mimeData;
194}
195
197
198#include "qqnxclipboard.moc"
199
200#endif //QT_NO_CLIPBOARD
\inmodule QtCore
Definition qbytearray.h:57
char * data()
\macro QT_NO_CAST_FROM_BYTEARRAY
Definition qbytearray.h:611
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
Definition qbytearray.h:124
Mode
\keyword clipboard mode
Definition qclipboard.h:27
\inmodule QtCore
Definition qmetatype.h:341
constexpr const char * name() const
Definition qmetatype.h:2680
\inmodule QtCore
Definition qmimedata.h:16
virtual QVariant retrieveData(const QString &mimetype, QMetaType preferredType) const
Returns a variant with the given type containing data for the MIME type specified by mimeType.
void clear()
Removes all the MIME type and data entries in the object.
virtual QStringList formats() const
Returns a list of formats supported by the object.
void emitChanged(QClipboard::Mode mode)
void setUserMimeData(QMimeData *userMimeData)
QVariant retrieveData(const QString &mimetype, QMetaType preferredType) const override
Returns a variant with the given type containing data for the MIME type specified by mimeType.
bool hasFormat(const QString &mimetype) const override
Returns true if the object can return data for the MIME type specified by mimeType; otherwise returns...
void addFormatToCheck(const QString &format)
QStringList formats() const override
Returns a list of formats supported by the object.
MimeData(QQnxClipboard *clipboard)
QMimeData * mimeData(QClipboard::Mode mode=QClipboard::Clipboard) override
void setMimeData(QMimeData *data, QClipboard::Mode mode=QClipboard::Clipboard) override
\inmodule QtCore
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromUtf8(QByteArrayView utf8)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:6018
QByteArray toUtf8() const &
Definition qstring.h:634
\inmodule QtCore
Definition qvariant.h:65
static auto fromValue(T &&value) noexcept(std::is_nothrow_copy_constructible_v< T > &&Private::CanUseInternalSpace< T >) -> std::enable_if_t< std::conjunction_v< std::is_copy_constructible< T >, std::is_destructible< T > >, QVariant >
Definition qvariant.h:536
#define this
Definition dialogs.cpp:9
EGLint EGLint * formats
Combined button and popup list for selecting options.
@ QueuedConnection
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
#define Q_FOREACH(variable, container)
Definition qforeach.h:66
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
return ret
GLenum mode
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum type
GLenum GLuint GLenum GLsizei const GLchar * buf
GLint GLsizei GLsizei GLenum format
GLuint64EXT * result
[6]
static QByteArray readClipboardBuff(const char *type)
static const char * typeList[]
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
#define Q_OBJECT
#define Q_SLOTS
static bool invokeMethod(QObject *obj, const char *member, Qt::ConnectionType, QGenericReturnArgument ret, QGenericArgument val0=QGenericArgument(nullptr), QGenericArgument val1=QGenericArgument(), QGenericArgument val2=QGenericArgument(), QGenericArgument val3=QGenericArgument(), QGenericArgument val4=QGenericArgument(), QGenericArgument val5=QGenericArgument(), QGenericArgument val6=QGenericArgument(), QGenericArgument val7=QGenericArgument(), QGenericArgument val8=QGenericArgument(), QGenericArgument val9=QGenericArgument())
\threadsafe This is an overloaded member function, provided for convenience. It differs from the abov...