Client: Remove windows from keyboard focus list when destroyed
This fixes the undefined behavior in tst_WaylandClient::touchDrag and mouseDrag Note: The test still fails if run twice in a row, but it appears to be deterministic. Task-number: QTBUG-56187 Change-Id: Ib45d82224f004d1324f2ce4d6b7df05ee36c04f5 Reviewed-by: Paul Olav Tvete <paul.tvete@qt.io>
This commit is contained in:
parent
174b7a9a30
commit
a33cc54705
@ -422,6 +422,12 @@ void QWaylandDisplay::handleKeyboardFocusChanged(QWaylandInputDevice *inputDevic
|
|||||||
mLastKeyboardFocus = keyboardFocus;
|
mLastKeyboardFocus = keyboardFocus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QWaylandDisplay::handleWindowDestroyed(QWaylandWindow *window)
|
||||||
|
{
|
||||||
|
if (mActiveWindows.contains(window))
|
||||||
|
handleWindowDeactivated(window);
|
||||||
|
}
|
||||||
|
|
||||||
void QWaylandDisplay::handleWaylandSync()
|
void QWaylandDisplay::handleWaylandSync()
|
||||||
{
|
{
|
||||||
// This callback is used to set the window activation because we may get an activate/deactivate
|
// This callback is used to set the window activation because we may get an activate/deactivate
|
||||||
|
@ -176,6 +176,7 @@ public:
|
|||||||
void handleWindowActivated(QWaylandWindow *window);
|
void handleWindowActivated(QWaylandWindow *window);
|
||||||
void handleWindowDeactivated(QWaylandWindow *window);
|
void handleWindowDeactivated(QWaylandWindow *window);
|
||||||
void handleKeyboardFocusChanged(QWaylandInputDevice *inputDevice);
|
void handleKeyboardFocusChanged(QWaylandInputDevice *inputDevice);
|
||||||
|
void handleWindowDestroyed(QWaylandWindow *window);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void blockingReadEvents();
|
void blockingReadEvents();
|
||||||
@ -217,7 +218,7 @@ private:
|
|||||||
uint32_t mLastInputSerial;
|
uint32_t mLastInputSerial;
|
||||||
QWaylandInputDevice *mLastInputDevice;
|
QWaylandInputDevice *mLastInputDevice;
|
||||||
QPointer<QWaylandWindow> mLastInputWindow;
|
QPointer<QWaylandWindow> mLastInputWindow;
|
||||||
QWaylandWindow *mLastKeyboardFocus;
|
QPointer<QWaylandWindow> mLastKeyboardFocus;
|
||||||
QVector<QWaylandWindow *> mActiveWindows;
|
QVector<QWaylandWindow *> mActiveWindows;
|
||||||
struct wl_callback *mSyncCallback;
|
struct wl_callback *mSyncCallback;
|
||||||
static const wl_callback_listener syncCallbackListener;
|
static const wl_callback_listener syncCallbackListener;
|
||||||
|
@ -102,6 +102,8 @@ QWaylandWindow::QWaylandWindow(QWindow *window)
|
|||||||
|
|
||||||
QWaylandWindow::~QWaylandWindow()
|
QWaylandWindow::~QWaylandWindow()
|
||||||
{
|
{
|
||||||
|
mDisplay->handleWindowDestroyed(this);
|
||||||
|
|
||||||
delete mWindowDecoration;
|
delete mWindowDecoration;
|
||||||
|
|
||||||
if (isInitialized())
|
if (isInitialized())
|
||||||
|
Loading…
x
Reference in New Issue
Block a user