예제 #1
0
파일: common.cpp 프로젝트: amosbird/CopyQ
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;
}
예제 #2
0
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;
    }
}
예제 #3
0
파일: common.cpp 프로젝트: amosbird/CopyQ
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;
}