kwin: fixing high cpu usage bugs
In some unfortunate situations it is possible that a window is deleted before it is marked ready_for_painting=true. The last point is especially troublesome for effects that reference the deleted window. Many thanks to Elias Probst for all the testing. CCBUG: 290025 CCBUG: 288948 REVIEW: 103733
This commit is contained in:
parent
87745d696d
commit
d6e7ebcb26
2 changed files with 11 additions and 1 deletions
|
@ -66,6 +66,15 @@ void Deleted::copyToDeleted(Toplevel* c)
|
||||||
{
|
{
|
||||||
assert(dynamic_cast< Deleted* >(c) == NULL);
|
assert(dynamic_cast< Deleted* >(c) == NULL);
|
||||||
Toplevel::copyToDeleted(c);
|
Toplevel::copyToDeleted(c);
|
||||||
|
// In some cases the window has been deleted before the sync request which marks
|
||||||
|
// the window ready for painting has finished. This is especially troublesome
|
||||||
|
// when effects reference the deleted window and the unreferencing is part of
|
||||||
|
// the rendering pass (e.g. Effect::postPaintScreen/postPaintWindow), which will
|
||||||
|
// never be executed because we remove it every time from the stacking list in
|
||||||
|
// Workspace::performCompositing.
|
||||||
|
if (!c->readyForPainting()) {
|
||||||
|
QTimer::singleShot(0, this, SLOT(discard()));
|
||||||
|
}
|
||||||
desk = c->desktop();
|
desk = c->desktop();
|
||||||
activityList = c->activities();
|
activityList = c->activities();
|
||||||
contentsRect = QRect(c->clientPos(), c->clientSize());
|
contentsRect = QRect(c->clientPos(), c->clientSize());
|
||||||
|
|
|
@ -35,7 +35,6 @@ public:
|
||||||
// used by effects to keep the window around for e.g. fadeout effects when it's destroyed
|
// used by effects to keep the window around for e.g. fadeout effects when it's destroyed
|
||||||
void refWindow();
|
void refWindow();
|
||||||
void unrefWindow(bool delay = false);
|
void unrefWindow(bool delay = false);
|
||||||
void discard(allowed_t);
|
|
||||||
virtual int desktop() const;
|
virtual int desktop() const;
|
||||||
virtual QStringList activities() const;
|
virtual QStringList activities() const;
|
||||||
virtual QPoint clientPos() const;
|
virtual QPoint clientPos() const;
|
||||||
|
@ -58,6 +57,8 @@ public:
|
||||||
}
|
}
|
||||||
void layoutDecorationRects(QRect &left, QRect &top, QRect &right, QRect &bottom) const;
|
void layoutDecorationRects(QRect &left, QRect &top, QRect &right, QRect &bottom) const;
|
||||||
QRect decorationRect() const;
|
QRect decorationRect() const;
|
||||||
|
public slots:
|
||||||
|
void discard(allowed_t = Allowed);
|
||||||
protected:
|
protected:
|
||||||
virtual void debug(QDebug& stream) const;
|
virtual void debug(QDebug& stream) const;
|
||||||
virtual bool shouldUnredirect() const;
|
virtual bool shouldUnredirect() const;
|
||||||
|
|
Loading…
Reference in a new issue