diff --git a/src/systemclipboard/waylandclipboard.cpp b/src/systemclipboard/waylandclipboard.cpp index b90bc3c..e05a558 100644 --- a/src/systemclipboard/waylandclipboard.cpp +++ b/src/systemclipboard/waylandclipboard.cpp @@ -311,6 +311,7 @@ public: Q_SIGNALS: void cancelled(); + void dataSendingCompleted(); protected: void ext_data_control_source_v1_send(const QString &mime_type, int32_t fd) override; @@ -393,6 +394,8 @@ void DataControlSource::ext_data_control_source_v1_send(const QString &mime_type if (written != ba.size()) { qWarning() << "Failed to send all clipobard data; sent" << written << "bytes out of" << ba.size(); } + + Q_EMIT dataSendingCompleted(); } void DataControlSource::ext_data_control_source_v1_cancelled() @@ -646,15 +649,40 @@ void WaylandClipboard::setMimeData(QMimeData *mime, QClipboard::Mode mode) return; } + auto waylandApp = qGuiApp->nativeInterface(); + auto display = waylandApp->display(); + + QEventLoop waitLoop; + QTimer requestTimer; + requestTimer.setInterval(200); + + QTimer timeoutTimer; + timeoutTimer.setSingleShot(true); + auto source = std::make_unique(m_manager->create_data_source(), mime); source->moveToThread(m_thread.get()); + connect(source.get(), &DataControlSource::dataSendingCompleted, &waitLoop, &QEventLoop::quit); + if (mode == QClipboard::Clipboard) { m_device->setSelection(std::move(source)); } else if (mode == QClipboard::Selection) { m_device->setPrimarySelection(std::move(source)); } -} + connect(&requestTimer, &QTimer::timeout, [display]{ + wl_display_dispatch_pending(display); + wl_display_flush(display); + }); + + connect(&timeoutTimer, &QTimer::timeout, [&waitLoop]{ + waitLoop.quit(); + }); + + timeoutTimer.start(5000); + requestTimer.start(); + waitLoop.exec(); + requestTimer.stop(); +} void WaylandClipboard::clear(QClipboard::Mode mode) { if (!m_device) {