diff --git a/kde/window-decorator/decorator.cpp b/kde/window-decorator/decorator.cpp index 937038e..51238f0 100644 --- a/kde/window-decorator/decorator.cpp +++ b/kde/window-decorator/decorator.cpp @@ -978,6 +978,7 @@ KWD::Decorator::handleWindowRemoved (WId id) mWindows.remove (window->winId ()); mFrames.remove (window->frameId ()); + window->destroyDecoration (); delete window; } } diff --git a/kde/window-decorator/window.cpp b/kde/window-decorator/window.cpp index 7e07eab..e8ac25c 100644 --- a/kde/window-decorator/window.cpp +++ b/kde/window-decorator/window.cpp @@ -146,9 +146,6 @@ KWD::Window::~Window (void) if (mDecorationPicture) XRenderFreePicture (qt_xdisplay (), mDecorationPicture); - if (mDecor) - delete mDecor; - if (mPopup) delete mPopup; @@ -900,6 +897,7 @@ KWD::Window::updateShadow (void) Screen *xscreen = ScreenOfDisplay (xdisplay, qt_xscreen ()); XRenderPictFormat *xformat; int leftCorner, rightCorner, topCorner, bottomCorner; + bool canUseDefaultShadow; if (mShadow) { @@ -929,8 +927,13 @@ KWD::Window::updateShadow (void) bottomCorner = mBorder.bottom; } - /* use default shadow if such exist */ - if (!mUniqueHorzShape && !mUniqueVertShape) + /* use default shadow if such exist - don't use it for maximized + windows as the default shadow uses decoration extents for + non-maximized windows */ + canUseDefaultShadow = !mUniqueHorzShape && !mUniqueVertShape && + (mState & (NET::MaxVert | NET::MaxHoriz)) == 0; + + if (canUseDefaultShadow) { mShadow = Decorator::defaultWindowShadow (&mContext); if (mShadow) diff --git a/kde/window-decorator/window.h b/kde/window-decorator/window.h index ef7b79f..0038c93 100644 --- a/kde/window-decorator/window.h +++ b/kde/window-decorator/window.h @@ -117,6 +117,14 @@ class Window:public QWidget, public KDecorationBridge { { return mDecor; } + void destroyDecoration (void) + { + if (mDecor) + { + delete mDecor; + mDecor = NULL; + } + } QWidget *activeChild (void) const { return mActiveChild;