Skip to content

Commit 8308246

Browse files
committed
Wayland: Fix setting clipboard if data control protocol is unsupported
1 parent 008f868 commit 8308246

File tree

4 files changed

+23
-44
lines changed

4 files changed

+23
-44
lines changed

src/platform/x11/systemclipboard/waylandclipboard.cpp

Lines changed: 12 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -623,7 +623,7 @@ WaylandClipboard *WaylandClipboard::createInstance()
623623

624624
void WaylandClipboard::setMimeData(QMimeData *mime, QClipboard::Mode mode)
625625
{
626-
if (!m_device) {
626+
if (!waitForDevice(1000)) {
627627
return;
628628
}
629629
std::unique_ptr<DataControlSource> source(new DataControlSource(m_manager->create_data_source(), mime));
@@ -634,23 +634,9 @@ void WaylandClipboard::setMimeData(QMimeData *mime, QClipboard::Mode mode)
634634
}
635635
}
636636

637-
void WaylandClipboard::clear(QClipboard::Mode mode)
638-
{
639-
if (!m_device) {
640-
return;
641-
}
642-
if (mode == QClipboard::Clipboard) {
643-
m_device->set_selection(nullptr);
644-
} else if (mode == QClipboard::Selection) {
645-
if (zwlr_data_control_device_v1_get_version(m_device->object()) >= ZWLR_DATA_CONTROL_DEVICE_V1_SET_PRIMARY_SELECTION_SINCE_VERSION) {
646-
m_device->set_primary_selection(nullptr);
647-
}
648-
}
649-
}
650-
651637
const QMimeData *WaylandClipboard::mimeData(QClipboard::Mode mode) const
652638
{
653-
if (!m_device) {
639+
if (!waitForDevice(1000)) {
654640
return nullptr;
655641
}
656642

@@ -669,15 +655,18 @@ const QMimeData *WaylandClipboard::mimeData(QClipboard::Mode mode) const
669655
return nullptr;
670656
}
671657

672-
DataControlDevice *WaylandClipboard::device() const
658+
bool WaylandClipboard::waitForDevice(int timeoutMs) const
673659
{
674660
if (m_device)
675-
return m_device.get();
661+
return true;
676662

677-
if (m_deviceRequestedTimer.elapsed() > 5000)
678-
return nullptr;
663+
if (m_deviceRequestedTimer.elapsed() > timeoutMs)
664+
return false;
665+
666+
qWarning() << "Waiting for Wayland clipboard for"
667+
<< timeoutMs - m_deviceRequestedTimer.elapsed() << "ms";
679668

680-
while (!m_device && m_deviceRequestedTimer.elapsed() < 5000) {
669+
while (!m_device && m_deviceRequestedTimer.elapsed() < timeoutMs) {
681670
QCoreApplication::processEvents();
682671
}
683672

@@ -686,17 +675,11 @@ DataControlDevice *WaylandClipboard::device() const
686675
qWarning() << "Activating Wayland clipboard took"
687676
<< m_deviceRequestedTimer.elapsed() << "ms";
688677
}
689-
return m_device.get();
678+
return true;
690679
}
691680

692681
qCritical() << "Failed to activate Wayland clipboard";
693-
return nullptr;
694-
}
695-
696-
bool WaylandClipboard::isSelectionSupported() const
697-
{
698-
return m_device && zwlr_data_control_device_v1_get_version(m_device->object())
699-
>= ZWLR_DATA_CONTROL_DEVICE_V1_SET_PRIMARY_SELECTION_SINCE_VERSION;
682+
return false;
700683
}
701684

702685
WaylandClipboard *WaylandClipboard::instance()

src/platform/x11/systemclipboard/waylandclipboard.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,8 @@ class WaylandClipboard final : public QObject
2424
~WaylandClipboard();
2525

2626
void setMimeData(QMimeData *mime, QClipboard::Mode mode);
27-
void clear(QClipboard::Mode mode);
2827
const QMimeData *mimeData(QClipboard::Mode mode) const;
29-
DataControlDevice *device() const;
30-
bool isSelectionSupported() const;
28+
bool waitForDevice(int timeoutMs = 5000) const;
3129

3230
signals:
3331
void changed(QClipboard::Mode mode);

src/platform/x11/x11platformclipboard.cpp

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ X11PlatformClipboard::X11PlatformClipboard()
6565

6666
// Create Wayland clipboard instance so it can start receiving new data.
6767
if ( !X11Info::isPlatformX11() ) {
68-
m_selectionSupported = WaylandClipboard::instance()->isSelectionSupported();
68+
WaylandClipboard::instance();
6969
}
7070
}
7171

@@ -150,23 +150,22 @@ void X11PlatformClipboard::setData(ClipboardMode mode, const QVariantMap &dataMa
150150
// WORKAROUND: Avoid getting X11 warning "QXcbClipboard: SelectionRequest too old".
151151
QCoreApplication::processEvents();
152152
DummyClipboard::setData(mode, dataMap);
153-
} else if (qobject_cast<QApplication*>(qApp) == nullptr) {
154-
// WORKAROUND: QClipboard::setMimeData() with a simple windowless
155-
// QGuiAplication on Wayland does not work.
153+
} else {
154+
DummyClipboard::setData(mode, dataMap);
156155
const auto data = createMimeData(dataMap);
157156
const auto qmode = modeToQClipboardMode(mode);
158157
WaylandClipboard::instance()->setMimeData(data, qmode);
159-
} else {
160-
DummyClipboard::setData(mode, dataMap);
161158
}
162159
}
163160

164161
const QMimeData *X11PlatformClipboard::rawMimeData(ClipboardMode mode) const
165162
{
166-
if ( X11Info::isPlatformX11() )
167-
return DummyClipboard::rawMimeData(mode);
168-
169-
return WaylandClipboard::instance()->mimeData( modeToQClipboardMode(mode) );
163+
if ( !X11Info::isPlatformX11() ) {
164+
const auto data = WaylandClipboard::instance()->mimeData( modeToQClipboardMode(mode) );
165+
if (data != nullptr)
166+
return data;
167+
}
168+
return DummyClipboard::rawMimeData(mode);
170169
}
171170

172171
void X11PlatformClipboard::onChanged(int mode)

src/platform/x11/x11platformclipboard.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ class X11PlatformClipboard final : public DummyClipboard
2222

2323
void setData(ClipboardMode mode, const QVariantMap &dataMap) override;
2424

25-
bool isSelectionSupported() const override { return m_selectionSupported; }
25+
bool isSelectionSupported() const override { return true; }
2626

2727
void setClipboardOwner(const QString &owner) override { m_clipboardOwner = owner; }
2828

@@ -63,7 +63,6 @@ class X11PlatformClipboard final : public DummyClipboard
6363
ClipboardData m_selectionData;
6464

6565
bool m_monitoring = false;
66-
bool m_selectionSupported = true;
6766

6867
QString m_clipboardOwner;
6968
};

0 commit comments

Comments
 (0)