24QString
QXcbMime::mimeAtomToString(QXcbConnection *connection, xcb_atom_t a)
30 if (a == XCB_ATOM_STRING
31 || a == connection->atom(QXcbAtom::AtomUTF8_STRING)
32 || a == connection->atom(QXcbAtom::AtomTEXT))
33 return "text/plain"_L1;
36 if (a == XCB_ATOM_PIXMAP)
37 return "image/ppm"_L1;
39 QByteArray atomName = connection->atomName(a);
42 if (atomName ==
"text/x-moz-url")
43 atomName =
"text/uri-list";
45 return QString::fromLatin1(atomName.constData());
48bool QXcbMime::mimeDataForAtom(QXcbConnection *connection, xcb_atom_t a, QMimeData *mimeData, QByteArray *data,
49 xcb_atom_t *atomFormat,
int *dataFormat)
58 if ((a == connection->atom(QXcbAtom::AtomUTF8_STRING)
59 || a == XCB_ATOM_STRING
60 || a == connection->atom(QXcbAtom::AtomTEXT))
61 && QInternalMimeData::hasFormatHelper(
"text/plain"_L1, mimeData)) {
63 *data = QInternalMimeData::renderDataHelper(
"text/plain"_L1, mimeData);
65 }
else if (a == XCB_ATOM_STRING ||
68 *data = QString::fromUtf8(QInternalMimeData::renderDataHelper(
69 "text/plain"_L1, mimeData)).toLatin1();
75 QString atomName = mimeAtomToString(connection, a);
76 if (QInternalMimeData::hasFormatHelper(atomName, mimeData)) {
77 *data = QInternalMimeData::renderDataHelper(atomName, mimeData);
80 if (atomName ==
"text/uri-list"_L1
81 && connection->atomName(a) ==
"text/x-moz-url") {
82 const QString mozUri = QLatin1StringView(data->split(
'\n').constFirst()) + u'\n';
83 data->assign({
reinterpret_cast<
const char *>(mozUri.data()), mozUri.size() * 2});
84 }
else if (atomName ==
"application/x-color"_L1)
87 }
else if ((a == XCB_ATOM_PIXMAP || a == XCB_ATOM_BITMAP) && mimeData->hasImage()) {
89 }
else if (atomName ==
"text/plain"_L1 && mimeData->hasFormat(
"text/uri-list"_L1)) {
91 *data = QInternalMimeData::renderDataHelper(atomName, mimeData);
97QList<xcb_atom_t>
QXcbMime::mimeAtomsForFormat(QXcbConnection *connection,
const QString &format)
99 QList<xcb_atom_t> atoms;
101 atoms.append(connection->internAtom(format.toLatin1()));
104 if (format ==
"text/plain"_L1) {
106 atoms.append(XCB_ATOM_STRING);
111 if (format ==
"text/uri-list"_L1) {
112 atoms.append(connection->internAtom(
"text/x-moz-url"));
113 atoms.append(connection->internAtom(
"text/plain"));
117 if (format ==
"image/ppm"_L1)
118 atoms.append(XCB_ATOM_PIXMAP);
119 if (format ==
"image/pbm"_L1)
120 atoms.append(XCB_ATOM_BITMAP);
125QVariant
QXcbMime::mimeConvertToFormat(QXcbConnection *connection, xcb_atom_t a,
const QByteArray &d,
const QString &format,
126 QMetaType requestedType,
bool hasUtf8)
129 QString atomName = mimeAtomToString(connection, a);
132 if (hasUtf8 && atomName == format +
";charset=utf-8"_L1) {
133 if (requestedType.id() == QMetaType::QString)
134 return QString::fromUtf8(data);
139 if (format ==
"text/plain"_L1) {
140 if (data.endsWith(
'\0'))
143 return QString::fromUtf8(data);
145 if (a == XCB_ATOM_STRING ||
146 a == connection->atom(QXcbAtom::AtomTEXT))
147 return QString::fromLatin1(data);
153 if ((format ==
"text/html"_L1 || format ==
"text/uri-list"_L1)
154 && data.size() > 1) {
155 const quint8 byte0 = data.at(0);
156 const quint8 byte1 = data.at(1);
157 if ((byte0 == 0xff && byte1 == 0xfe) || (byte0 == 0xfe && byte1 == 0xff)
158 || (byte0 != 0 && byte1 == 0) || (byte0 == 0 && byte1 != 0)) {
159 const QStringView str(
160 reinterpret_cast<
const char16_t *>(data.constData()), data.size() / 2);
162 if (format ==
"text/uri-list"_L1) {
163 const auto urls = QStringView{str}.split(u'\n');
164 QList<QVariant> list;
165 list.reserve(urls.size());
166 for (
const QStringView &s : urls) {
167 const QUrl url(s.trimmed().toString());
174 if (!list.isEmpty() && connection->atomName(a) ==
"text/x-moz-url")
175 return list.constFirst();
178 return str.toString();
183 if (data.endsWith(
'\0'))
187 if (atomName == format)
192 if (format ==
"image/ppm"_L1) {
193 if (a == XCB_ATOM_PIXMAP && data.size() ==
sizeof(Pixmap)) {
194 Pixmap xpm = *((Pixmap*)data.data());
205 XGetGeometry(display, xpm, &root, &x, &y, &width, &height, &border_width, &depth);
206 XImage *ximg = XGetImage(display,xpm,x,y,width,height,AllPlanes,depth==1 ? XYPixmap : ZPixmap);
207 QImage qimg = QXlibStatic::qimageFromXImage(ximg);
210 QImageWriter imageWriter;
211 imageWriter.setFormat(
"PPMRAW");
213 buf.open(QIODevice::WriteOnly);
214 imageWriter.setDevice(&buf);
215 imageWriter.write(qimg);
223xcb_atom_t
QXcbMime::mimeAtomForFormat(QXcbConnection *connection,
const QString &format, QMetaType requestedType,
224 const QList<xcb_atom_t> &atoms,
bool *hasUtf8)
229 if (format ==
"text/plain"_L1) {
232 if (atoms.contains(XCB_ATOM_STRING))
233 return XCB_ATOM_STRING;
239 if (format ==
"text/uri-list"_L1) {
240 xcb_atom_t a = connection->internAtom(format.toLatin1());
241 if (a && atoms.contains(a))
243 a = connection->internAtom(
"text/x-moz-url");
244 if (a && atoms.contains(a))
249 if (format ==
"image/ppm"_L1) {
250 if (atoms.contains(XCB_ATOM_PIXMAP))
251 return XCB_ATOM_PIXMAP;
256 if (requestedType.id() == QMetaType::QString
257 && format.startsWith(
"text/"_L1)
258 && !format.contains(
"charset="_L1)) {
260 QString formatWithCharset = format;
261 formatWithCharset.append(
";charset=utf-8"_L1);
263 xcb_atom_t a = connection->internAtom(
std::move(formatWithCharset).toLatin1());
264 if (a && atoms.contains(a)) {
270 xcb_atom_t a = connection->internAtom(format.toLatin1());
271 if (a && atoms.contains(a))