#ifndef CLIPBOARDRESULTDIALOG_H #define CLIPBOARDRESULTDIALOG_H #include #include #include #include #include #include #include #ifndef QT_NO_DEBUG #include #endif // Keep the result window focused while taking ownership of the clipboard. class ClipboardResultDialog : public QDialog { public: ClipboardResultDialog (const QUrl &url, bool requiresFocus, QWidget *parent = nullptr) : QDialog (parent), m_text (url.toString (QUrl::FullyEncoded)), m_requiresFocus (requiresFocus), m_status (new QLabel (this)) { m_status->setText (QStringLiteral ("Activate this window to copy the short URL.")); m_status->setWordWrap (true); } QLabel *copyStatusLabel() const { return m_status; } bool copyShortUrl() { if (m_requiresFocus && !isActiveWindow()) return false; auto *clipboard = QGuiApplication::clipboard(); clipboard->setText (m_text, QClipboard::Clipboard); const bool copied = clipboard->text (QClipboard::Clipboard) == m_text && (!QGuiApplication::platformName().startsWith (QStringLiteral ("wayland")) || clipboard->ownsClipboard()); m_status->setText (copied ? QStringLiteral ("Short URL copied to clipboard.") : QStringLiteral ("Could not copy the short URL. Click OK to retry.")); #ifndef QT_NO_DEBUG qDebug() << "[clipboard] short URL write, active:" << isActiveWindow() << "owns clipboard:" << clipboard->ownsClipboard() << "verified:" << copied; #endif return copied; } protected: void changeEvent (QEvent *event) override { QDialog::changeEvent (event); if (event->type() == QEvent::ActivationChange && isActiveWindow()) { // Let Qt finish processing the focus event and its Wayland input serial. QTimer::singleShot (0, this, [this]() { if (isActiveWindow()) copyShortUrl(); }); } } private: QString m_text; bool m_requiresFocus; QLabel *m_status; }; #endif // CLIPBOARDRESULTDIALOG_H