[wayland] Ensure we can tear down ShellClient after Workspace is destroyed

This can happen during tear down of the internal shell clients.
icc-effect-5.14.5
Martin Gräßlin 2015-11-10 14:27:03 +01:00
parent affcbac7e7
commit 3f4e733468
1 changed files with 19 additions and 12 deletions

View File

@ -155,24 +155,31 @@ ShellClient::~ShellClient() = default;
void ShellClient::destroyClient()
{
m_closing = true;
Deleted *del = Deleted::create(this);
Deleted *del = nullptr;
if (workspace()) {
del = Deleted::create(this);
}
emit windowClosed(this, del);
StackingUpdatesBlocker blocker(workspace());
if (transientFor()) {
transientFor()->removeTransient(this);
}
for (auto it = transients().constBegin(); it != transients().constEnd();) {
if ((*it)->transientFor() == this) {
removeTransient(*it);
it = transients().constBegin(); // restart, just in case something more has changed with the list
} else {
++it;
if (workspace()) {
StackingUpdatesBlocker blocker(workspace());
if (transientFor()) {
transientFor()->removeTransient(this);
}
for (auto it = transients().constBegin(); it != transients().constEnd();) {
if ((*it)->transientFor() == this) {
removeTransient(*it);
it = transients().constBegin(); // restart, just in case something more has changed with the list
} else {
++it;
}
}
}
waylandServer()->removeClient(this);
del->unrefWindow();
if (del) {
del->unrefWindow();
}
m_shellSurface = nullptr;
deleteClient(this);
}