Git commit 1b40feca3a119f8d7098bff299cb8be4032fedda by Martin Gr=C3=A4=C3= =9Flin. Committed on 13/06/2016 at 13:29. Pushed by graesslin into branch 'master'. SceneXRender::Window uses a static XRenderPicture which it didn't clean up Summary: Using a static XRenderPicture results in a crash on exit as for cleanup the already destroyed xcb_connection_t* is required. This change ensures that the static XRenderPicture gets destroyed in the static cleanup handler for SceneXRender::Window. CCBUG: 363251 Reviewers: #plasma Subscribers: plasma-devel Tags: #plasma Differential Revision: https://phabricator.kde.org/D1733 M +8 -5 scene_xrender.cpp M +1 -0 scene_xrender.h http://commits.kde.org/kwin/1b40feca3a119f8d7098bff299cb8be4032fedda diff --git a/scene_xrender.cpp b/scene_xrender.cpp index e8cfc13..3a3bb1e 100644 --- a/scene_xrender.cpp +++ b/scene_xrender.cpp @@ -213,6 +213,7 @@ bool X11XRenderBackend::usesOverlayWindow() const //**************************************** // SceneXrender //**************************************** + SceneXrender* SceneXrender::createScene(QObject *parent) { QScopedPointer backend; @@ -308,6 +309,7 @@ Decoration::Renderer *SceneXrender::createDecorationRen= derer(Decoration::Decorat = XRenderPicture *SceneXrender::Window::s_tempPicture =3D 0; QRect SceneXrender::Window::temp_visibleRect; +XRenderPicture *SceneXrender::Window::s_fadeAlphaPicture =3D nullptr; = SceneXrender::Window::Window(Toplevel* c, SceneXrender *scene) : Scene::Window(c) @@ -326,6 +328,8 @@ void SceneXrender::Window::cleanup() { delete s_tempPicture; s_tempPicture =3D NULL; + delete s_fadeAlphaPicture; + s_fadeAlphaPicture =3D nullptr; } = // Maps window coordinates to screen coordinates @@ -655,14 +659,13 @@ xcb_render_composite(connection(), XCB_RENDER_PICT_OP= _OVER, m_xrenderShadow->pic if (data.crossFadeProgress() < 1.0 && data.crossFadeProgress()= > 0.0) { XRenderWindowPixmap *previous =3D previousWindowPixmap(); if (previous && previous !=3D pixmap) { - static XRenderPicture cFadeAlpha(XCB_RENDER_PICTURE_NO= NE); static xcb_render_color_t cFadeColor =3D {0, 0, 0, 0}; cFadeColor.alpha =3D uint16_t((1.0 - data.crossFadePro= gress()) * 0xffff); - if (cFadeAlpha =3D=3D XCB_RENDER_PICTURE_NONE) { - cFadeAlpha =3D xRenderFill(cFadeColor); + if (!s_fadeAlphaPicture) { + s_fadeAlphaPicture =3D new XRenderPicture(xRenderF= ill(cFadeColor)); } else { xcb_rectangle_t rect =3D {0, 0, 1, 1}; - xcb_render_fill_rectangles(connection(), XCB_RENDE= R_PICT_OP_SRC, cFadeAlpha, cFadeColor , 1, &rect); + xcb_render_fill_rectangles(connection(), XCB_RENDE= R_PICT_OP_SRC, *s_fadeAlphaPicture, cFadeColor , 1, &rect); } if (previous->size() !=3D pixmap->size()) { xcb_render_transform_t xform2 =3D { @@ -674,7 +677,7 @@ xcb_render_composite(connection(), XCB_RENDER_PICT_OP_O= VER, m_xrenderShadow->pic } = xcb_render_composite(connection(), opaque ? XCB_RENDER= _PICT_OP_OVER : XCB_RENDER_PICT_OP_ATOP, - previous->picture(), cFadeAlpha, = renderTarget, + previous->picture(), *s_fadeAlpha= Picture, renderTarget, cr.x(), cr.y(), 0, 0, dr.x(), dr.= y(), dr.width(), dr.height()); = if (previous->size() !=3D pixmap->size()) { diff --git a/scene_xrender.h b/scene_xrender.h index 8accca2..ba96f95 100644 --- a/scene_xrender.h +++ b/scene_xrender.h @@ -205,6 +205,7 @@ private: QRegion transformed_shape; static QRect temp_visibleRect; static XRenderPicture *s_tempPicture; + static XRenderPicture *s_fadeAlphaPicture; }; = class XRenderWindowPixmap : public WindowPixmap