xwl: Do not refresh the x11 Clipboard while fetching

At the moment there was a race condition when putting something into the
keyboard from XWayland apps. The clipboard manager would announce a new
thing before we'd submitted it all resulting in a broken state.

This change detects when it's fetching and will only refresh the source
after everything has been sent.

BUG: 424754
CCBUG: 412350
(cherry picked from commit d335070b80)
icc-effect-5.20.5
Aleix Pol 2020-10-20 02:29:01 +02:00 committed by Nate Graham
parent 9854f40333
commit 99b29195b4
2 changed files with 11 additions and 0 deletions

View File

@ -66,6 +66,10 @@ Clipboard::Clipboard(xcb_atom_t atom, QObject *parent)
void Clipboard::wlSelectionChanged(KWaylandServer::AbstractDataSource *dsi) void Clipboard::wlSelectionChanged(KWaylandServer::AbstractDataSource *dsi)
{ {
if (m_waitingForTargets) {
return;
}
if (dsi && !ownsSelection(dsi)) { if (dsi && !ownsSelection(dsi)) {
// Wayland native client provides new selection // Wayland native client provides new selection
if (!m_checkConnection) { if (!m_checkConnection) {
@ -88,6 +92,10 @@ bool Clipboard::ownsSelection(KWaylandServer::AbstractDataSource *dsi) const
void Clipboard::checkWlSource() void Clipboard::checkWlSource()
{ {
if (m_waitingForTargets) {
return;
}
auto dsi = waylandServer()->seat()->selection(); auto dsi = waylandServer()->seat()->selection();
auto removeSource = [this] { auto removeSource = [this] {
if (wlSource()) { if (wlSource()) {
@ -145,6 +153,7 @@ void Clipboard::doHandleXfixesNotify(xcb_xfixes_selection_notify_event_t *event)
if (X11Source *source = x11Source()) { if (X11Source *source = x11Source()) {
source->getTargets(); source->getTargets();
m_waitingForTargets = true;
} else { } else {
qCWarning(KWIN_XWL) << "Could not create a source from" << event << Qt::hex << (event ? event->owner : -1); qCWarning(KWIN_XWL) << "Could not create a source from" << event << Qt::hex << (event ? event->owner : -1);
} }
@ -152,6 +161,7 @@ void Clipboard::doHandleXfixesNotify(xcb_xfixes_selection_notify_event_t *event)
void Clipboard::x11OffersChanged(const QStringList &added, const QStringList &removed) void Clipboard::x11OffersChanged(const QStringList &added, const QStringList &removed)
{ {
m_waitingForTargets = false;
X11Source *source = x11Source(); X11Source *source = x11Source();
if (!source) { if (!source) {
qCWarning(KWIN_XWL) << "offers changed when not having an X11Source!?"; qCWarning(KWIN_XWL) << "offers changed when not having an X11Source!?";

View File

@ -53,6 +53,7 @@ private:
QMetaObject::Connection m_checkConnection; QMetaObject::Connection m_checkConnection;
Q_DISABLE_COPY(Clipboard) Q_DISABLE_COPY(Clipboard)
bool m_waitingForTargets = false;
}; };
} // namespace Xwl } // namespace Xwl