diff options
author | Johan Klokkhammer Helsing <johan.helsing@qt.io> | 2019-02-14 13:41:30 +0100 |
---|---|---|
committer | Johan Helsing <johan.helsing@qt.io> | 2019-02-20 14:13:05 +0000 |
commit | eb66211ea9b58537a21630893229c7d3c86a10b3 (patch) | |
tree | d3597596dbde8538727792b179453f9233a70725 /src/client/qwaylandwindow.cpp | |
parent | cf378b581009b80510cf54c8b56d4c2d950c1153 (diff) | |
download | qtwayland-eb66211ea9b58537a21630893229c7d3c86a10b3.tar.gz |
Client: Don't leak wl_data_offers
[ChangeLog][QPA plugin] Fixed a leak of wl_data_offers.
Data offers would previously leak when a surface with keyboard focus was
destroyed... or if it was hidden... or if it changed type, and so on.
Make keyboard focus follow a wl_surface instead of a QWaylandWindow.
This also fixes a couple of other minor issues, such as the mRepeatTimer not
stopping when a wl_surface was destroyed.
Ideally, we would have a QWaylandSurface class separate from the
QWaylandWindow, but that's out of scope for this fix.
Fixes: QTBUG-73825
Change-Id: I56e502512c3959e3fcdb63744adc4a7698e3d53d
Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
Diffstat (limited to 'src/client/qwaylandwindow.cpp')
-rw-r--r-- | src/client/qwaylandwindow.cpp | 23 |
1 files changed, 3 insertions, 20 deletions
diff --git a/src/client/qwaylandwindow.cpp b/src/client/qwaylandwindow.cpp index ae4fc577..ca4d176f 100644 --- a/src/client/qwaylandwindow.cpp +++ b/src/client/qwaylandwindow.cpp @@ -51,11 +51,6 @@ #include "qwaylanddecorationfactory_p.h" #include "qwaylandshmbackingstore_p.h" -#if QT_CONFIG(wayland_datadevice) -#include "qwaylanddatadevice_p.h" -#endif - - #include <QtCore/QFileInfo> #include <QtCore/QPointer> #include <QtCore/QRegularExpression> @@ -95,10 +90,6 @@ QWaylandWindow::~QWaylandWindow() if (isInitialized()) reset(false); - QList<QWaylandInputDevice *> inputDevices = mDisplay->inputDevices(); - for (int i = 0; i < inputDevices.size(); ++i) - inputDevices.at(i)->handleWindowDestroyed(this); - const QWindow *parent = window(); foreach (QWindow *w, QGuiApplication::topLevelWindows()) { if (w->transientParent() == parent) @@ -236,8 +227,10 @@ void QWaylandWindow::reset(bool sendDestroyEvent) mShellSurface = nullptr; delete mSubSurfaceWindow; mSubSurfaceWindow = nullptr; - if (isInitialized()) + if (isInitialized()) { + emit wlSurfaceDestroyed(); destroy(); + } mScreens.clear(); if (mFrameCallback) { @@ -972,16 +965,6 @@ void QWaylandWindow::requestActivateWindow() qCWarning(lcQpaWayland) << "Wayland does not support QWindow::requestActivate()"; } -void QWaylandWindow::unfocus() -{ -#if QT_CONFIG(clipboard) - QWaylandInputDevice *inputDevice = mDisplay->currentInputDevice(); - if (inputDevice && inputDevice->dataDevice()) { - inputDevice->dataDevice()->invalidateSelectionOffer(); - } -#endif -} - bool QWaylandWindow::isExposed() const { if (mShellSurface) |