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)
{
if (m_waitingForTargets) {
return;
}
if (dsi && !ownsSelection(dsi)) {
// Wayland native client provides new selection
if (!m_checkConnection) {
@ -88,6 +92,10 @@ bool Clipboard::ownsSelection(KWaylandServer::AbstractDataSource *dsi) const
void Clipboard::checkWlSource()
{
if (m_waitingForTargets) {
return;
}
auto dsi = waylandServer()->seat()->selection();
auto removeSource = [this] {
if (wlSource()) {
@ -145,6 +153,7 @@ void Clipboard::doHandleXfixesNotify(xcb_xfixes_selection_notify_event_t *event)
if (X11Source *source = x11Source()) {
source->getTargets();
m_waitingForTargets = true;
} else {
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)
{
m_waitingForTargets = false;
X11Source *source = x11Source();
if (!source) {
qCWarning(KWIN_XWL) << "offers changed when not having an X11Source!?";

View File

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