~smspillaz/compiz-plugins-main/compiz-plugins-main.fix_939228

« back to all changes in this revision

Viewing changes to animation/src/animation.cpp

  • Committer: Daniel van Vugt
  • Author(s): Sam Spilsbury
  • Date: 2012-04-10 07:54:37 UTC
  • Revision ID: daniel.van.vugt@canonical.com-20120410075437-d4dp24dlbt6offae
Don't increment the destroy ref count of a window unless an animation is
active. (LP: #940603)

It doesn't make any sense to increase the destroy reference count of a window
on CompWindowNotifyBeforeDestroy based on whether or not an an animation for
that window "could" be allowed - CompWindowNotifyBeforeDestroyed is called
on CompWindow::destroy (which under sane circumstances, should only ever be
called when the window is either reparented away from its parent or the root
window or when the window is destroyed).

In this case, we deregister all events on the window so it isn't possible to
determine through any normal means that a close animation is going to activate
on the window. And in any event, the unmap which causes close animations
always comes before the DestroyNotify or ReparentNotify anyways.

Even if the CompWindowNotifyClose were to somehow come after the window
received a ReparentNotify or DestroyNotify, the tradeoff then comes between
not playing animations for those corner case windows or keeping ghost windows
on screen because we kept a destroy reference and never got rid of it. In this
case, it is more sane to do the former.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1626
1626
{
1627
1627
    if (!mLockedPaintListCnt)
1628
1628
    {
1629
 
        mLockedPaintList = &cScreen->getWindowPaintList ();
 
1629
        const CompWindowList &pl = cScreen->getWindowPaintList ();
 
1630
        mLockedPaintList = &pl;
1630
1631
 
1631
1632
        if (!mGetWindowPaintListEnableCnt)
1632
1633
        {
2771
2772
                if (mPAScreen->shouldIgnoreWindowForAnim (mWindow, true))
2772
2773
                    break;
2773
2774
 
2774
 
                if (AnimEffectNone ==
2775
 
                    mPAScreen->getMatchingAnimSelection (mWindow,
2776
 
                                                         AnimEventClose,
2777
 
                                                         &duration))
 
2775
                /* Don't increment the destroy reference count unless
 
2776
                 * the window is already animated */
 
2777
                if (!mCurAnimation)
2778
2778
                    break;
2779
2779
 
2780
2780
                mDestroyCnt++;