const QMimeData *clipboardData(ClipboardMode mode) { Q_ASSERT( isMainThread() ); const auto modeText = mode == ClipboardMode::Clipboard ? "clipboard" : "selection"; COPYQ_LOG_VERBOSE( QString("Getting %1 data.").arg(modeText) ); const auto qtmode = mode == ClipboardMode::Clipboard ? QClipboard::Clipboard : QClipboard::Selection; const QMimeData *data = QGuiApplication::clipboard()->mimeData(qtmode); if (data) COPYQ_LOG_VERBOSE( QString("Got %1 data.").arg(modeText) ); else log( QString("Null data in %1.").arg(modeText), LogError ); return data; }
void ClipboardClient::onMessageReceived(const QByteArray &data, int messageCode) { COPYQ_LOG_VERBOSE( "Message received: " + messageCodeToString(messageCode) ); switch (messageCode) { case CommandFunctionCallReturnValue: emit functionCallResultReceived(data); break; case CommandInputDialogFinished: { emit inputDialogFinished(data); break; } case CommandStop: { exit(0); break; } default: log( "Unhandled message: " + messageCodeToString(messageCode), LogError ); break; } }
QVariantMap cloneData(const QMimeData &rawData, QStringList formats) { ClipboardDataGuard data(rawData); const auto internalMimeTypes = {mimeOwner, mimeWindowTitle, mimeItemNotes, mimeHidden}; QVariantMap newdata; /* Some apps provide images even when copying huge spreadsheet, this can block those apps while generating and providing the data. This code removes ignores any image data if text is available. Images in SVG and other XML formats are expected to be relatively small so these doesn't have to be ignored. */ if ( formats.contains(mimeText) && data.hasFormat(mimeText) ) { const QString mimeImagePrefix = "image/"; const auto first = std::remove_if( std::begin(formats), std::end(formats), [&mimeImagePrefix](const QString &format) { return format.startsWith(mimeImagePrefix) && !format.contains("xml") && !format.contains("svg"); }); formats.erase(first, std::end(formats)); } QStringList imageFormats; for (const auto &mime : formats) { const QByteArray bytes = data.getUtf8Data(mime); if ( bytes.isEmpty() ) imageFormats.append(mime); else newdata.insert(mime, bytes); } for (const auto &internalMime : internalMimeTypes) { if ( data.hasFormat(internalMime) ) newdata.insert( internalMime, data.data(internalMime) ); } // Retrieve images last since this can take a while. if ( !imageFormats.isEmpty() ) { const QImage image = data.getImageData(); if ( !image.isNull() ) { for (const auto &mime : imageFormats) { const QString format = getImageFormatFromMime(mime); if ( !format.isEmpty() ) cloneImageData(image, format, mime, &newdata); } } } if ( hasLogLevel(LogTrace) ) { for (const auto &format : data.formats()) { if ( !formats.contains(format) ) COPYQ_LOG_VERBOSE(QString("Skipping format: %1").arg(format)); } } return newdata; }