~lbrulet-8/compiz-plugins-main/fix-876591

« back to all changes in this revision

Viewing changes to debian/patches/01_fix_ghost_windows.patch

  • Committer: Package Import Robot
  • Author(s): Didier Roche
  • Date: 2011-09-22 14:50:55 UTC
  • mfrom: (1.1.8 upstream)
  • Revision ID: package-import@ubuntu.com-20110922145055-h3j0es7pbks2sg7r
Tags: 1:0.9.5.94+bzr20110919-0ubuntu1
* Cherry-pick rev 27:
  - "crash when looping paint list in preparePaint (on closing windows)
    (LP: #853807)
* Add debian/patches/01_fix_ghost_windows.patch:
  - fix ghost transient windows.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
=== modified file 'animation/src/animation.cpp'
 
2
Index: compiz-plugins-main-0.9.5.94+bzr20110919/animation/src/animation.cpp
 
3
===================================================================
 
4
--- compiz-plugins-main-0.9.5.94+bzr20110919.orig/animation/src/animation.cpp   2011-09-16 02:36:40.000000000 +0200
 
5
+++ compiz-plugins-main-0.9.5.94+bzr20110919/animation/src/animation.cpp        2011-09-20 10:09:48.223997183 +0200
 
6
@@ -317,12 +317,15 @@
 
7
 
 
8
     if (shouldInitPersistentData)
 
9
     {
 
10
+       const CompWindowList &pl = pushLockedPaintList ();
 
11
        // Initialize persistent window data for the extension plugin
 
12
-       foreach (CompWindow *w, ::screen->windows ())
 
13
+       foreach (CompWindow *w, pl)
 
14
        {
 
15
            AnimWindow *aw = AnimWindow::get (w);
 
16
            extensionPluginInfo->initPersistentData (aw);
 
17
        }
 
18
+
 
19
+       popLockedPaintList ();
 
20
     }
 
21
 }
 
22
 
 
23
@@ -336,13 +339,17 @@
 
24
 PrivateAnimScreen::removeExtension (ExtensionPluginInfo *extensionPluginInfo)
 
25
 {
 
26
     // Stop all ongoing animations
 
27
-    foreach (CompWindow *w, ::screen->windows ())
 
28
+    const CompWindowList &pl = pushLockedPaintList ();
 
29
+
 
30
+    foreach (CompWindow *w, pl)
 
31
     {
 
32
        PrivateAnimWindow *aw = AnimWindow::get (w)->priv;
 
33
        if (aw->curAnimation ())
 
34
            aw->postAnimationCleanUp ();
 
35
     }
 
36
 
 
37
+    popLockedPaintList ();
 
38
+
 
39
     // Find the matching plugin and delete it
 
40
 
 
41
     ExtensionPluginVector::iterator it = find (mExtensionPlugins.begin (),
 
42
@@ -390,12 +397,16 @@
 
43
            updateEventEffects ((AnimEvent)e, true);
 
44
     }
 
45
 
 
46
+    const CompWindowList &cpl = pushLockedPaintList ();
 
47
+
 
48
     // Destroy persistent window data for the extension plugin
 
49
-    foreach (CompWindow *w, ::screen->windows ())
 
50
+    foreach (CompWindow *w, cpl)
 
51
     {
 
52
        AnimWindow *aw = AnimWindow::get (w);
 
53
        extensionPluginInfo->destroyPersistentData (aw);
 
54
     }
 
55
+
 
56
+    popLockedPaintList ();
 
57
 }
 
58
 
 
59
 ExtensionPluginInfo::ExtensionPluginInfo (const CompString &name,
 
60
@@ -1102,8 +1113,7 @@
 
61
        // Animations have finished for all windows
 
62
        // (Keep preparePaint enabled)
 
63
 
 
64
-       cScreen->getWindowPaintListSetEnabled (this, false);
 
65
-       enablePrePaintWindowsBackToFront (false);
 
66
+       aScreen->enableCustomPaintList (false);
 
67
     }
 
68
     cScreen->donePaintSetEnabled (this, activating);
 
69
     gScreen->glPaintOutputSetEnabled (this, activating);
 
70
@@ -1229,6 +1239,8 @@
 
71
     if (mAnimInProgress)
 
72
     {  
 
73
        int msSinceLastPaintActual;
 
74
+       const CompWindowList &pl = pushLockedPaintList ();
 
75
+       CompWindowList       windowsFinishedAnimations;
 
76
 
 
77
        struct timeval curTime;
 
78
        gettimeofday (&curTime, 0);
 
79
@@ -1248,8 +1260,11 @@
 
80
 
 
81
        bool animStillInProgress = false;
 
82
 
 
83
-       foreach (CompWindow *w, ::screen->windows ())
 
84
+       /* Paint list includes destroyed windows */
 
85
+       for (CompWindowList::const_reverse_iterator rit = pl.rbegin ();
 
86
+            rit != pl.rend (); rit++)
 
87
        {
 
88
+           CompWindow *w = (*rit);
 
89
            AnimWindow *animWin = AnimWindow::get (w);
 
90
            PrivateAnimWindow *aw = animWin->priv;
 
91
            Animation *curAnim = aw->curAnimation ();
 
92
@@ -1322,16 +1337,24 @@
 
93
 
 
94
                bool finished = (curAnim->remainingTime () <= 0);
 
95
                if (finished) // Animation is done
 
96
-               {
 
97
-                   aw->notifyAnimation (false);
 
98
-                   aw->postAnimationCleanUp ();
 
99
-               }
 
100
+                   windowsFinishedAnimations.push_back (w);
 
101
                else
 
102
                    animStillInProgress = true;
 
103
            }
 
104
        }
 
105
 
 
106
-       foreach (CompWindow *w, ::screen->windows ())
 
107
+       popLockedPaintList ();
 
108
+
 
109
+       foreach (CompWindow *w, windowsFinishedAnimations)
 
110
+       {
 
111
+           AnimWindow *aw = AnimWindow::get (w);
 
112
+           aw->priv->notifyAnimation (false);
 
113
+           aw->priv->postAnimationCleanUp ();
 
114
+       }
 
115
+
 
116
+       const CompWindowList &ppl = pushLockedPaintList ();
 
117
+
 
118
+       foreach (CompWindow *w, ppl)
 
119
        {
 
120
            PrivateAnimWindow *aw = AnimWindow::get (w)->priv;
 
121
            if (aw->curAnimation ())
 
122
@@ -1348,6 +1371,8 @@
 
123
                static_cast<ExtensionPluginAnimation *> (mExtensionPlugins[0]);
 
124
            extPlugin->resetStackingInfo ();
 
125
        }
 
126
+
 
127
+       popLockedPaintList ();
 
128
     }
 
129
 
 
130
     foreach (ExtensionPluginInfo *extPlugin, mExtensionPlugins)
 
131
@@ -1572,10 +1597,48 @@
 
132
     return status;
 
133
 }
 
134
 
 
135
+const CompWindowList &
 
136
+PrivateAnimScreen::pushLockedPaintList ()
 
137
+{
 
138
+    if (!mLockedPaintListCnt)
 
139
+    {
 
140
+       mLockedPaintList = &cScreen->getWindowPaintList ();
 
141
+
 
142
+       if (!mGetWindowPaintListEnableCnt)
 
143
+       {
 
144
+           mGetWindowPaintListEnableCnt++;
 
145
+           cScreen->getWindowPaintListSetEnabled (this, true);
 
146
+       }
 
147
+    }
 
148
+
 
149
+    mLockedPaintListCnt++;
 
150
+    return *mLockedPaintList;
 
151
+}
 
152
+
 
153
+void
 
154
+PrivateAnimScreen::popLockedPaintList ()
 
155
+{
 
156
+    mLockedPaintListCnt--;
 
157
+
 
158
+    if (!mLockedPaintListCnt)
 
159
+    {
 
160
+       mLockedPaintList = NULL;
 
161
+
 
162
+       mGetWindowPaintListEnableCnt--;
 
163
+
 
164
+       if (!mGetWindowPaintListEnableCnt)
 
165
+           cScreen->getWindowPaintListSetEnabled (this, false);
 
166
+    }
 
167
+}
 
168
+
 
169
 /// This is enabled only during restack animations.
 
170
+/// or when we need to lock it
 
171
 const CompWindowList &
 
172
 PrivateAnimScreen::getWindowPaintList ()
 
173
 {
 
174
+    if (mLockedPaintList)
 
175
+       return *mLockedPaintList;
 
176
+
 
177
     ExtensionPluginAnimation *extPlugin =
 
178
        static_cast<ExtensionPluginAnimation *> (mExtensionPlugins[0]);
 
179
     return extPlugin->getWindowPaintList ();
 
180
@@ -1599,9 +1662,28 @@
 
181
 }
 
182
 
 
183
 void
 
184
+PrivateAnimScreen::pushPaintList ()
 
185
+{
 
186
+    if (!mGetWindowPaintListEnableCnt)
 
187
+       cScreen->getWindowPaintListSetEnabled (this, true);
 
188
+
 
189
+    mGetWindowPaintListEnableCnt++;
 
190
+}
 
191
+
 
192
+void
 
193
+PrivateAnimScreen::popPaintList ()
 
194
+{
 
195
+    mGetWindowPaintListEnableCnt--;
 
196
+
 
197
+    if (!mGetWindowPaintListEnableCnt)
 
198
+       cScreen->getWindowPaintListSetEnabled (this, false);
 
199
+}
 
200
+
 
201
+void
 
202
 AnimScreen::enableCustomPaintList (bool enabled)
 
203
 {
 
204
-    priv->cScreen->getWindowPaintListSetEnabled (priv, enabled);
 
205
+    enabled ? priv->pushPaintList () : priv->popPaintList ();
 
206
+
 
207
     priv->enablePrePaintWindowsBackToFront (enabled);
 
208
 }
 
209
 
 
210
@@ -2258,7 +2340,9 @@
 
211
 PrivateAnimScreen::updateAnimStillInProgress ()
 
212
 {
 
213
     bool animStillInProgress = false;
 
214
-    foreach (CompWindow *w, ::screen->windows ())
 
215
+    const CompWindowList &pl = pushLockedPaintList ();
 
216
+
 
217
+    foreach (CompWindow *w, pl)
 
218
     {
 
219
        PrivateAnimWindow *aw = AnimWindow::get (w)->priv;
 
220
        if (aw->curAnimation () &&
 
221
@@ -2273,6 +2357,8 @@
 
222
        }
 
223
     }
 
224
 
 
225
+    popLockedPaintList ();
 
226
+
 
227
     if (!animStillInProgress)
 
228
        activateEvent (false);
 
229
 }
 
230
@@ -2400,7 +2486,10 @@
 
231
     mAnimInProgress (false),
 
232
     mStartingNewPaintRound (false),
 
233
     mPrePaintWindowsBackToFrontEnabled (false),
 
234
-    mOutput (0)
 
235
+    mOutput (0),
 
236
+    mLockedPaintList (NULL),
 
237
+    mLockedPaintListCnt (0),
 
238
+    mGetWindowPaintListEnableCnt (0)
 
239
 {
 
240
     for (int i = 0; i < WatchedScreenPluginNum; i++)
 
241
        mPluginActive[i] = false;
 
242
Index: compiz-plugins-main-0.9.5.94+bzr20110919/animation/src/extensionplugin.cpp
 
243
===================================================================
 
244
--- compiz-plugins-main-0.9.5.94+bzr20110919.orig/animation/src/extensionplugin.cpp     2011-09-16 02:36:40.000000000 +0200
 
245
+++ compiz-plugins-main-0.9.5.94+bzr20110919/animation/src/extensionplugin.cpp  2011-09-20 10:10:57.504340729 +0200
 
246
@@ -412,7 +412,7 @@
 
247
                onlyTwo = true;
 
248
            }
 
249
            // Clear all mConfigureNotified's
 
250
-           foreach (CompWindow *w2, ::screen->windows ())
 
251
+           foreach (CompWindow *w2, CompositeScreen::get (::screen)->getWindowPaintList ())
 
252
            {
 
253
                RestackPersistentData *data =
 
254
                    static_cast<RestackPersistentData *>
 
255
@@ -514,7 +514,7 @@
 
256
            // was not possible.
 
257
            updateLastClientList ();
 
258
 
 
259
-           foreach (CompWindow *w, ::screen->windows ())
 
260
+           foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ())
 
261
            {
 
262
                AnimWindow *aw = AnimWindow::get (w);
 
263
                // Allocate persistent restack data if it doesn't already exist
 
264
@@ -526,7 +526,7 @@
 
265
        }
 
266
        if (as->isAnimEffectPossible (AnimEffectDodge))
 
267
        {
 
268
-           foreach (CompWindow *w, ::screen->windows ())
 
269
+           foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ())
 
270
            {
 
271
                AnimWindow *aw = AnimWindow::get (w);
 
272
                // Allocate persistent dodge data if it doesn't already exist
 
273
@@ -600,7 +600,7 @@
 
274
     bool wOldAboveGood = false;
 
275
     bool wRestackedGood = false;
 
276
 
 
277
-    foreach (CompWindow *w, ::screen->windows ())
 
278
+    foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ())
 
279
     {
 
280
        AnimWindow *aw = AnimWindow::get (w);
 
281
 
 
282
@@ -623,7 +623,7 @@
 
283
 void
 
284
 ExtensionPluginAnimation::resetStackingInfo ()
 
285
 {
 
286
-    foreach (CompWindow *w, ::screen->windows ())
 
287
+    foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ())
 
288
     {
 
289
        AnimWindow *aw = AnimWindow::get (w);
 
290
        PersistentDataMap::iterator itData =
 
291
@@ -737,7 +737,7 @@
 
292
 void
 
293
 ExtensionPluginAnimation::resetMarks ()
 
294
 {
 
295
-    foreach (CompWindow *w, ::screen->windows ())
 
296
+    foreach (CompWindow *w, CompositeScreen::get (::screen)->getWindowPaintList ())
 
297
     {
 
298
        RestackPersistentData *data = static_cast<RestackPersistentData *>
 
299
            (AnimWindow::get (w)->persistentData["restack"]);
 
300
@@ -758,7 +758,7 @@
 
301
     resetMarks ();
 
302
 
 
303
     CompWindow *w =
 
304
-       getBottommostInExtendedFocusChain (*::screen->windows ().begin ());
 
305
+       getBottommostInExtendedFocusChain (*CompositeScreen::get (::screen)->getWindowPaintList ().begin ());
 
306
     if (w)
 
307
     {
 
308
        RestackPersistentData *data = static_cast<RestackPersistentData *>
 
309
Index: compiz-plugins-main-0.9.5.94+bzr20110919/animation/src/private.h
 
310
===================================================================
 
311
--- compiz-plugins-main-0.9.5.94+bzr20110919.orig/animation/src/private.h       2011-09-16 02:36:40.000000000 +0200
 
312
+++ compiz-plugins-main-0.9.5.94+bzr20110919/animation/src/private.h    2011-09-20 10:09:48.227997204 +0200
 
313
@@ -235,6 +235,10 @@
 
314
     Window mActiveWindow;
 
315
     CompMatch mNeverAnimateMatch;
 
316
 
 
317
+    const CompWindowList *mLockedPaintList;
 
318
+    unsigned int         mLockedPaintListCnt;
 
319
+    unsigned int         mGetWindowPaintListEnableCnt;
 
320
+
 
321
     void updateEventEffects (AnimEvent e,
 
322
                             bool forRandom,
 
323
                             bool callPost = true);
 
324
@@ -263,6 +267,16 @@
 
325
     PrivateAnimScreen (CompScreen *s, AnimScreen *);
 
326
     ~PrivateAnimScreen ();
 
327
 
 
328
+    // In order to prevent other plugins from modifying
 
329
+    // the paint lists as we use it we need to lock the
 
330
+    // list
 
331
+
 
332
+    const CompWindowList & pushLockedPaintList ();
 
333
+    void  popLockedPaintList ();
 
334
+
 
335
+    void pushPaintList ();
 
336
+    void popPaintList ();
 
337
+
 
338
     // Utility methods
 
339
     void initiateOpenAnim (PrivateAnimWindow *aw);
 
340
     void initiateCloseAnim (PrivateAnimWindow *aw);