Commit affcbac7 authored by Martin Flöser's avatar Martin Flöser

[wayland] Destroy Xwayland's ClientConnection on tear down

We need to destroy the ClientConnections we create. Also we need
to disconnect our Xwayland error handling before destroying it, otherwise
it would trigger the abort for crashing Xwayland.
parent f75e53af
......@@ -61,6 +61,7 @@ WaylandTestApplication::~WaylandTestApplication()
if (m_xwaylandProcess) {
m_xwaylandProcess->terminate();
m_xwaylandProcess->waitForFinished();
waylandServer()->destroyXWaylandConnection();
}
waylandServer()->destroyInternalConnection();
destroyCompositor();
......
......@@ -85,6 +85,7 @@ ApplicationWayland::~ApplicationWayland()
if (m_xwaylandProcess) {
m_xwaylandProcess->terminate();
m_xwaylandProcess->waitForFinished();
waylandServer()->destroyXWaylandConnection();
}
waylandServer()->destroyInternalConnection();
destroyCompositor();
......
......@@ -125,7 +125,7 @@ void WaylandServer::init(const QByteArray &socketName, InitalizationFlags flags)
// it's possible that a Surface gets created before Workspace is created
return;
}
if (surface->client() == m_xwaylandConnection) {
if (surface->client() == m_xwayland.client) {
// skip Xwayland clients, those are created using standard X11 way
return;
}
......@@ -261,8 +261,8 @@ int WaylandServer::createXWaylandConnection()
qCWarning(KWIN_CORE) << "Could not create socket";
return -1;
}
m_xwaylandConnection = m_display->createClient(sx[0]);
connect(m_xwaylandConnection, &KWayland::Server::ClientConnection::disconnected, this,
m_xwayland.client = m_display->createClient(sx[0]);
m_xwayland.destroyConnection = connect(m_xwayland.client, &KWayland::Server::ClientConnection::disconnected, this,
[] {
qFatal("Xwayland Connection died");
}
......@@ -270,6 +270,16 @@ int WaylandServer::createXWaylandConnection()
return sx[1];
}
void WaylandServer::destroyXWaylandConnection()
{
if (!m_xwayland.client) {
return;
}
disconnect(m_xwayland.destroyConnection);
m_xwayland.client->destroy();
m_xwayland.client = nullptr;
}
int WaylandServer::createInputMethodConnection()
{
int sx[2];
......
......@@ -109,6 +109,7 @@ public:
* @returns file descriptor for Xwayland to connect to.
**/
int createXWaylandConnection();
void destroyXWaylandConnection();
/**
* @returns file descriptor to the input method server's socket.
......@@ -120,7 +121,7 @@ public:
void initWorkspace();
KWayland::Server::ClientConnection *xWaylandConnection() const {
return m_xwaylandConnection;
return m_xwayland.client;
}
KWayland::Server::ClientConnection *inputMethodConnection() const {
return m_inputMethodServerConnection;
......@@ -156,7 +157,10 @@ private:
KWayland::Server::PlasmaShellInterface *m_plasmaShell = nullptr;
KWayland::Server::PlasmaWindowManagementInterface *m_windowManagement = nullptr;
KWayland::Server::QtSurfaceExtensionInterface *m_qtExtendedSurface = nullptr;
KWayland::Server::ClientConnection *m_xwaylandConnection = nullptr;
struct {
KWayland::Server::ClientConnection *client = nullptr;
QMetaObject::Connection destroyConnection;
} m_xwayland;
KWayland::Server::ClientConnection *m_inputMethodServerConnection = nullptr;
KWayland::Server::ClientConnection *m_screenLockerClientConnection = nullptr;
struct {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment