[wayland] Use an event thread for the internal Wayland connection

icc-effect-5.14.5
Martin Gräßlin 2015-08-17 09:42:12 +02:00
parent 6294961ba4
commit a9e5343eb6
2 changed files with 22 additions and 4 deletions

View File

@ -27,6 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// Client
#include <KWayland/Client/connection_thread.h>
#include <KWayland/Client/event_queue.h>
#include <KWayland/Client/registry.h>
#include <KWayland/Client/surface.h>
// Server
@ -43,6 +44,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <KWayland/Server/shell_interface.h>
// Qt
#include <QThread>
#include <QWindow>
// system
@ -61,7 +63,14 @@ WaylandServer::WaylandServer(QObject *parent)
{
}
WaylandServer::~WaylandServer() = default;
WaylandServer::~WaylandServer()
{
if (m_internalConnection.client) {
m_internalConnection.client->deleteLater();
m_internalConnection.clientThread->quit();
m_internalConnection.clientThread->wait();
}
}
void WaylandServer::init(const QByteArray &socketName)
{
@ -268,16 +277,23 @@ void WaylandServer::createInternalConnection()
}
m_internalConnection.server = m_display->createClient(sx[0]);
using namespace KWayland::Client;
m_internalConnection.client = new ConnectionThread(this);
m_internalConnection.client = new ConnectionThread();
m_internalConnection.client->setSocketFd(sx[1]);
m_internalConnection.clientThread = new QThread;
m_internalConnection.client->moveToThread(m_internalConnection.clientThread);
m_internalConnection.clientThread->start();
connect(m_internalConnection.client, &ConnectionThread::connected, this,
[this] {
Registry *registry = new Registry(m_internalConnection.client);
Registry *registry = new Registry(this);
EventQueue *eventQueue = new EventQueue(this);
eventQueue->setup(m_internalConnection.client);
registry->setEventQueue(eventQueue);
registry->create(m_internalConnection.client);
m_internalConnection.registry = registry;
connect(registry, &Registry::shmAnnounced, this,
[this] (quint32 name, quint32 version) {
m_internalConnection.shm = m_internalConnection.registry->createShmPool(name, version, m_internalConnection.client);
m_internalConnection.shm = m_internalConnection.registry->createShmPool(name, version, this);
}
);
registry->setup();

View File

@ -24,6 +24,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <QObject>
class QThread;
class QWindow;
namespace KWayland
@ -159,6 +160,7 @@ private:
struct {
KWayland::Server::ClientConnection *server = nullptr;
KWayland::Client::ConnectionThread *client = nullptr;
QThread *clientThread = nullptr;
KWayland::Client::Registry *registry = nullptr;
KWayland::Client::ShmPool *shm = nullptr;