Client: do not empty clipboard when a new popup/window is opened

If we open a new popup or a window within the same app we have to avoid
invalidating selection offer when losing focus, because it's still the
same client who has the focus and we might not get a new selection offer
by the compositor and therefore we would lose clipboard content.

Fixes: QTBUG-93474
Change-Id: Ia2ef826c2967b1daf1cdeb085e8dae66d090dbcf
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: David Edmundson <davidedmundson@kde.org>
This commit is contained in:
Jan Grulich 2021-07-16 13:00:03 +02:00
parent 4be0cbb5b3
commit 5c9a38e768
2 changed files with 13 additions and 8 deletions

View File

@ -600,6 +600,19 @@ void QWaylandDisplay::handleWaylandSync()
QWindow *activeWindow = mActiveWindows.empty() ? nullptr : mActiveWindows.last()->window();
if (activeWindow != QGuiApplication::focusWindow())
QWindowSystemInterface::handleWindowActivated(activeWindow);
if (!activeWindow) {
if (lastInputDevice()) {
#if QT_CONFIG(clipboard)
if (auto *dataDevice = lastInputDevice()->dataDevice())
dataDevice->invalidateSelectionOffer();
#endif
#if QT_CONFIG(wayland_client_primary_selection)
if (auto *device = lastInputDevice()->primarySelectionDevice())
device->invalidateSelectionOffer();
#endif
}
}
}
const wl_callback_listener QWaylandDisplay::syncCallbackListener = {

View File

@ -1337,14 +1337,6 @@ void QWaylandInputDevice::Keyboard::handleFocusDestroyed()
void QWaylandInputDevice::Keyboard::handleFocusLost()
{
mFocus = nullptr;
#if QT_CONFIG(clipboard)
if (auto *dataDevice = mParent->dataDevice())
dataDevice->invalidateSelectionOffer();
#endif
#if QT_CONFIG(wayland_client_primary_selection)
if (auto *device = mParent->primarySelectionDevice())
device->invalidateSelectionOffer();
#endif
mParent->mQDisplay->handleKeyboardFocusChanged(mParent);
mRepeatTimer.stop();
}