[wayland] Destroy all ClientConnections on tear down
Ensures that all Wayland objects are destroyed and the cleanup handling is performed before tearing down the Compositor. This fixes for example a crash if a Surface with a Shadow is still around at tear down.
This commit is contained in:
parent
12b63e2aa7
commit
3be016fba4
4 changed files with 14 additions and 3 deletions
|
@ -73,7 +73,7 @@ WaylandTestApplication::~WaylandTestApplication()
|
||||||
}
|
}
|
||||||
waylandServer()->destroyXWaylandConnection();
|
waylandServer()->destroyXWaylandConnection();
|
||||||
}
|
}
|
||||||
waylandServer()->destroyInternalConnection();
|
waylandServer()->terminateClientConnections();
|
||||||
destroyCompositor();
|
destroyCompositor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ ApplicationWayland::~ApplicationWayland()
|
||||||
}
|
}
|
||||||
waylandServer()->destroyXWaylandConnection();
|
waylandServer()->destroyXWaylandConnection();
|
||||||
}
|
}
|
||||||
waylandServer()->destroyInternalConnection();
|
waylandServer()->terminateClientConnections();
|
||||||
destroyCompositor();
|
destroyCompositor();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -91,6 +91,16 @@ void WaylandServer::destroyInternalConnection()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void WaylandServer::terminateClientConnections()
|
||||||
|
{
|
||||||
|
destroyInternalConnection();
|
||||||
|
destroyInputMethodConnection();
|
||||||
|
const auto connections = m_display->connections();
|
||||||
|
for (auto it = connections.begin(); it != connections.end(); ++it) {
|
||||||
|
(*it)->destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void WaylandServer::init(const QByteArray &socketName, InitalizationFlags flags)
|
void WaylandServer::init(const QByteArray &socketName, InitalizationFlags flags)
|
||||||
{
|
{
|
||||||
m_initFlags = flags;
|
m_initFlags = flags;
|
||||||
|
|
|
@ -72,6 +72,7 @@ public:
|
||||||
virtual ~WaylandServer();
|
virtual ~WaylandServer();
|
||||||
void init(const QByteArray &socketName = QByteArray(), InitalizationFlags flags = InitalizationFlag::NoOptions);
|
void init(const QByteArray &socketName = QByteArray(), InitalizationFlags flags = InitalizationFlag::NoOptions);
|
||||||
void initOutputs();
|
void initOutputs();
|
||||||
|
void terminateClientConnections();
|
||||||
|
|
||||||
KWayland::Server::Display *display() {
|
KWayland::Server::Display *display() {
|
||||||
return m_display;
|
return m_display;
|
||||||
|
@ -123,7 +124,6 @@ public:
|
||||||
bool isScreenLocked() const;
|
bool isScreenLocked() const;
|
||||||
|
|
||||||
void createInternalConnection();
|
void createInternalConnection();
|
||||||
void destroyInternalConnection();
|
|
||||||
void initWorkspace();
|
void initWorkspace();
|
||||||
|
|
||||||
KWayland::Server::ClientConnection *xWaylandConnection() const {
|
KWayland::Server::ClientConnection *xWaylandConnection() const {
|
||||||
|
@ -156,6 +156,7 @@ Q_SIGNALS:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
quint16 createClientId(KWayland::Server::ClientConnection *c);
|
quint16 createClientId(KWayland::Server::ClientConnection *c);
|
||||||
|
void destroyInternalConnection();
|
||||||
KWayland::Server::Display *m_display = nullptr;
|
KWayland::Server::Display *m_display = nullptr;
|
||||||
KWayland::Server::CompositorInterface *m_compositor = nullptr;
|
KWayland::Server::CompositorInterface *m_compositor = nullptr;
|
||||||
KWayland::Server::SeatInterface *m_seat = nullptr;
|
KWayland::Server::SeatInterface *m_seat = nullptr;
|
||||||
|
|
Loading…
Reference in a new issue