From eea79bddd86003f006da085d787162ec106c157f Mon Sep 17 00:00:00 2001 From: Vlad Zahorodnii Date: Mon, 3 Jun 2024 18:15:34 +0300 Subject: [PATCH] backends/libinput: Destroy Connection in correct thread --- src/backends/libinput/connection.cpp | 4 ++-- src/backends/libinput/connection.h | 2 +- src/backends/libinput/libinputbackend.cpp | 12 +++++++----- src/backends/libinput/libinputbackend.h | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/backends/libinput/connection.cpp b/src/backends/libinput/connection.cpp index 8d3c223369..e161212164 100644 --- a/src/backends/libinput/connection.cpp +++ b/src/backends/libinput/connection.cpp @@ -80,7 +80,7 @@ Q_SIGNALS: void deviceRemoved(QString sysName); }; -std::unique_ptr Connection::create(Session *session) +Connection *Connection::create(Session *session) { std::unique_ptr udev = std::make_unique(); if (!udev->isValid()) { @@ -96,7 +96,7 @@ std::unique_ptr Connection::create(Session *session) qCWarning(KWIN_LIBINPUT) << "Failed to initialize context"; return nullptr; } - return std::unique_ptr(new Connection(std::move(context))); + return new Connection(std::move(context)); } Connection::Connection(std::unique_ptr &&input) diff --git a/src/backends/libinput/connection.h b/src/backends/libinput/connection.h index 20b07d7b72..bca6dab05b 100644 --- a/src/backends/libinput/connection.h +++ b/src/backends/libinput/connection.h @@ -56,7 +56,7 @@ public: QStringList devicesSysNames() const; - static std::unique_ptr create(Session *session); + static Connection *create(Session *session); Q_SIGNALS: void deviceAdded(KWin::LibInput::Device *); diff --git a/src/backends/libinput/libinputbackend.cpp b/src/backends/libinput/libinputbackend.cpp index f925012277..2e3a187f50 100644 --- a/src/backends/libinput/libinputbackend.cpp +++ b/src/backends/libinput/libinputbackend.cpp @@ -21,21 +21,23 @@ LibinputBackend::LibinputBackend(Session *session, QObject *parent) m_connection->moveToThread(&m_thread); connect( - m_connection.get(), &LibInput::Connection::eventsRead, this, [this]() { - m_connection->processEvents(); - }, + m_connection, &LibInput::Connection::eventsRead, this, [this]() { + m_connection->processEvents(); + }, Qt::QueuedConnection); // Direct connection because the deviceAdded() and the deviceRemoved() signals are emitted // from the main thread. - connect(m_connection.get(), &LibInput::Connection::deviceAdded, + connect(m_connection, &LibInput::Connection::deviceAdded, this, &InputBackend::deviceAdded, Qt::DirectConnection); - connect(m_connection.get(), &LibInput::Connection::deviceRemoved, + connect(m_connection, &LibInput::Connection::deviceRemoved, this, &InputBackend::deviceRemoved, Qt::DirectConnection); } LibinputBackend::~LibinputBackend() { + m_connection->deleteLater(); + m_thread.quit(); m_thread.wait(); } diff --git a/src/backends/libinput/libinputbackend.h b/src/backends/libinput/libinputbackend.h index 3e406fc3de..5f00d2542d 100644 --- a/src/backends/libinput/libinputbackend.h +++ b/src/backends/libinput/libinputbackend.h @@ -33,7 +33,7 @@ public: private: QThread m_thread; - std::unique_ptr m_connection; + LibInput::Connection *m_connection = nullptr; }; } // namespace KWin