diff --git a/src/window.cpp b/src/window.cpp index d60ff3db32..be9ca43b2f 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -2625,20 +2625,32 @@ void Window::setDecoration(std::shared_ptr decoration) } if (decoration) { QMetaObject::invokeMethod(decoration.get(), QOverload<>::of(&KDecoration2::Decoration::update), Qt::QueuedConnection); - connect(decoration.get(), &KDecoration2::Decoration::shadowChanged, this, &Window::updateShadow); - connect(decoration.get(), &KDecoration2::Decoration::bordersChanged, - this, &Window::updateDecorationInputShape); - connect(decoration.get(), &KDecoration2::Decoration::resizeOnlyBordersChanged, - this, &Window::updateDecorationInputShape); + connect(decoration.get(), &KDecoration2::Decoration::shadowChanged, this, [this]() { + if (!isDeleted()) { + updateShadow(); + } + }); connect(decoration.get(), &KDecoration2::Decoration::bordersChanged, this, [this]() { + if (isDeleted()) { + return; + } GeometryUpdatesBlocker blocker(this); const QRectF oldGeometry = moveResizeGeometry(); if (!isShade()) { checkWorkspacePosition(oldGeometry); } + updateDecorationInputShape(); + }); + connect(decoration.get(), &KDecoration2::Decoration::resizeOnlyBordersChanged, this, [this]() { + if (!isDeleted()) { + updateDecorationInputShape(); + } + }); + connect(decoratedClient()->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, this, [this]() { + if (!isDeleted()) { + updateDecorationInputShape(); + } }); - connect(decoratedClient()->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, - this, &Window::updateDecorationInputShape); } m_decoration.decoration = decoration; updateDecorationInputShape(); @@ -3658,6 +3670,10 @@ void Window::sendToOutput(Output *newOutput) void Window::checkWorkspacePosition(QRectF oldGeometry, const VirtualDesktop *oldDesktop) { + if (isDeleted()) { + qCWarning(KWIN_CORE) << "Window::checkWorkspacePosition: called for a closed window. Consider this a bug"; + return; + } if (isDock() || isDesktop() || !isPlaceable()) { return; } diff --git a/src/x11window.cpp b/src/x11window.cpp index 724f49e096..8b2fce35f4 100644 --- a/src/x11window.cpp +++ b/src/x11window.cpp @@ -1340,9 +1340,21 @@ void X11Window::createDecoration() { std::shared_ptr decoration(Workspace::self()->decorationBridge()->createDecoration(this)); if (decoration) { - connect(decoration.get(), &KDecoration2::Decoration::resizeOnlyBordersChanged, this, &X11Window::updateInputWindow); - connect(decoration.get(), &KDecoration2::Decoration::bordersChanged, this, &X11Window::updateFrameExtents); - connect(decoratedClient()->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, this, &X11Window::updateInputWindow); + connect(decoration.get(), &KDecoration2::Decoration::resizeOnlyBordersChanged, this, [this]() { + if (!isDeleted()) { + updateInputWindow(); + } + }); + connect(decoration.get(), &KDecoration2::Decoration::bordersChanged, this, [this]() { + if (!isDeleted()) { + updateFrameExtents(); + } + }); + connect(decoratedClient()->decoratedClient(), &KDecoration2::DecoratedClient::sizeChanged, this, [this]() { + if (!isDeleted()) { + updateInputWindow(); + } + }); } setDecoration(decoration);