[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [kwin] /: SceneXRender::Window uses a static XRenderPicture which it didn't clean up
From: Martin_Gräßlin <mgraesslin () kde ! org>
Date: 2016-06-13 13:32:36
Message-ID: E1bCRym-0005Wb-HN () scm ! kde ! org
[Download RAW message or body]
Git commit 1b40feca3a119f8d7098bff299cb8be4032fedda by Martin Gräßlin.
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<XRenderBackend> backend;
@@ -308,6 +309,7 @@ Decoration::Renderer \
*SceneXrender::createDecorationRenderer(Decoration::Decorat
XRenderPicture *SceneXrender::Window::s_tempPicture = 0;
QRect SceneXrender::Window::temp_visibleRect;
+XRenderPicture *SceneXrender::Window::s_fadeAlphaPicture = nullptr;
SceneXrender::Window::Window(Toplevel* c, SceneXrender *scene)
: Scene::Window(c)
@@ -326,6 +328,8 @@ void SceneXrender::Window::cleanup()
{
delete s_tempPicture;
s_tempPicture = NULL;
+ delete s_fadeAlphaPicture;
+ s_fadeAlphaPicture = 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 = \
previousWindowPixmap<XRenderWindowPixmap>(); if (previous && previous != pixmap) {
- static XRenderPicture cFadeAlpha(XCB_RENDER_PICTURE_NONE);
static xcb_render_color_t cFadeColor = {0, 0, 0, 0};
cFadeColor.alpha = uint16_t((1.0 - data.crossFadeProgress()) * \
0xffff);
- if (cFadeAlpha == XCB_RENDER_PICTURE_NONE) {
- cFadeAlpha = xRenderFill(cFadeColor);
+ if (!s_fadeAlphaPicture) {
+ s_fadeAlphaPicture = new \
XRenderPicture(xRenderFill(cFadeColor)); } else {
xcb_rectangle_t rect = {0, 0, 1, 1};
- xcb_render_fill_rectangles(connection(), \
XCB_RENDER_PICT_OP_SRC, cFadeAlpha, cFadeColor , 1, &rect); + \
xcb_render_fill_rectangles(connection(), XCB_RENDER_PICT_OP_SRC, *s_fadeAlphaPicture, \
cFadeColor , 1, &rect); }
if (previous->size() != pixmap->size()) {
xcb_render_transform_t xform2 = {
@@ -674,7 +677,7 @@ xcb_render_composite(connection(), XCB_RENDER_PICT_OP_OVER, \
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_fadeAlphaPicture, renderTarget,
cr.x(), cr.y(), 0, 0, dr.x(), dr.y(), \
dr.width(), dr.height());
if (previous->size() != 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
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic