Merge lp:~smspillaz/unity/4.0.fix_881190_918360 into lp:unity/4.0

Proposed by Sam Spilsbury
Status: Rejected
Rejected by: Sam Spilsbury
Proposed branch: lp:~smspillaz/unity/4.0.fix_881190_918360
Merge into: lp:unity/4.0
Diff against target: 208 lines (+41/-38)
3 files modified
plugins/unityshell/src/compizminimizedwindowhandler.h (+35/-23)
plugins/unityshell/src/minimizedwindowhandler.h (+1/-0)
plugins/unityshell/src/unityshell.cpp (+5/-15)
To merge this branch: bzr merge lp:~smspillaz/unity/4.0.fix_881190_918360
Reviewer Review Type Date Requested Status
Sam Spilsbury (community) Disapprove
Review via email: mp+89183@code.launchpad.net

Description of the change

    Fix LP #881190 and a condition that could happen after: #918360 due to
    a incorrect refcounting.

    The transient for reader would report every window as a "transient" if it
    matched the w->transientFor () definition on the window - at destruction time
    this will be zero, so it will match every single window. That would cause
    all windows to be unminimized.

    However, it makes no sense to do the unminimize/minimize normally dance when
    the window has been destroyed.

    Additionaly, there was a cyclic reference in CompizMinimizedWindowHandler,
    which would cause those objects to never be destroyed. A condition could
    happen where CompizMinimizedWindowHandler could loop its own list and dereference
    a CompWindow that was gone.

To post a comment you must log in.
Revision history for this message
Sam Spilsbury (smspillaz) :
review: Disapprove
Revision history for this message
Sam Spilsbury (smspillaz) wrote :

Dropped for 4.0 while the fix is reworked again

Unmerged revisions

1733. By Sam Spilsbury

    Fix LP #881190 and a condition that could happen after: #918360 due to
    a incorrect refcounting.

    The transient for reader would report every window as a "transient" if it
    matched the w->transientFor () definition on the window - at destruction time
    this will be zero, so it will match every single window. That would cause
    all windows to be unminimized.

    However, it makes no sense to do the unminimize/minimize normally dance when
    the window has been destroyed.

    Additionaly, there was a cyclic reference in CompizMinimizedWindowHandler,
    which would cause those objects to never be destroyed. A condition could
    happen where CompizMinimizedWindowHandler could loop its own list and dereference
    a CompWindow that was gone.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'plugins/unityshell/src/compizminimizedwindowhandler.h'
2--- plugins/unityshell/src/compizminimizedwindowhandler.h 2011-10-05 12:20:19 +0000
3+++ plugins/unityshell/src/compizminimizedwindowhandler.h 2012-01-19 03:38:23 +0000
4@@ -45,9 +45,12 @@
5 {
6 public:
7
8- CompizMinimizedWindowHandler (CompWindow *w);
9 ~CompizMinimizedWindowHandler ();
10
11+ typedef CompizMinimizedWindowHandler<Screen, Window> CompizMinimizedWindowHandler_complete;
12+ typedef boost::shared_ptr<CompizMinimizedWindowHandler_complete> Ptr;
13+ typedef std::list <CompizMinimizedWindowHandler *> List;
14+
15 void setVisibility (bool visible);
16 unsigned int getPaintMask ();
17
18@@ -58,23 +61,23 @@
19
20 void windowNotify (CompWindowNotify n);
21
22+ static MinimizedWindowHandler::Ptr create (CompWindow *w);
23+
24 static void setFunctions (bool keepMinimized);
25 static void handleCompizEvent (const char *, const char *, CompOption::Vector &);
26 static void handleEvent (XEvent *event);
27 static std::list<CompWindow *> minimizingWindows;
28-
29- typedef CompizMinimizedWindowHandler<Screen, Window> CompizMinimizedWindowHandler_complete;
30- typedef boost::shared_ptr<CompizMinimizedWindowHandler_complete> Ptr;
31- typedef std::list <Ptr> List;
32 protected:
33
34- virtual std::vector<unsigned int> getTransients ();
35+ std::vector<unsigned int> getTransients ();
36
37 private:
38
39+ CompizMinimizedWindowHandler (CompWindow *w);
40+
41 PrivateCompizMinimizedWindowHandler *priv;
42 static bool handleEvents;
43- static std::list<Ptr> minimizedWindows;
44+ static std::list<CompizMinimizedWindowHandler *> minimizedWindows;
45 };
46 }
47
48@@ -88,6 +91,14 @@
49 bool compiz::CompizMinimizedWindowHandler<Screen, Window>::handleEvents = true;
50
51 template <typename Screen, typename Window>
52+compiz::MinimizedWindowHandler::Ptr
53+compiz::CompizMinimizedWindowHandler<Screen, Window>::create(CompWindow *w)
54+{
55+ Ptr p (new compiz::CompizMinimizedWindowHandler<Screen, Window> (w));
56+ return boost::static_pointer_cast <MinimizedWindowHandler> (p);
57+}
58+
59+template <typename Screen, typename Window>
60 compiz::CompizMinimizedWindowHandler<Screen, Window>::CompizMinimizedWindowHandler(CompWindow *w) :
61 MinimizedWindowHandler (screen->dpy (), w->id ())
62 {
63@@ -100,12 +111,19 @@
64 template <typename Screen, typename Window>
65 compiz::CompizMinimizedWindowHandler<Screen, Window>::~CompizMinimizedWindowHandler ()
66 {
67- typedef compiz::CompizMinimizedWindowHandler<Screen, Window> minimized_window_handler_full;
68-
69- compiz::CompizMinimizedWindowHandler<Screen, Window>::Ptr compizMinimizeHandler =
70- boost::dynamic_pointer_cast <minimized_window_handler_full> (Window::get (priv->mWindow)->mMinimizeHandler);
71-
72- minimizedWindows.remove (compizMinimizeHandler);
73+ if (!priv->mWindow->destroyed ())
74+ {
75+ priv->mWindow->unminimize ();
76+ priv->mWindow->focusSetEnabled (Window::get (priv->mWindow), false);
77+ priv->mWindow->minimizeSetEnabled (Window::get (priv->mWindow), false);
78+ priv->mWindow->unminimizeSetEnabled (Window::get (priv->mWindow), false);
79+ priv->mWindow->minimizedSetEnabled (Window::get (priv->mWindow), false);
80+ priv->mWindow->minimize ();
81+ }
82+ else
83+ {
84+ minimizedWindows.remove (this);
85+ }
86 }
87
88 template <typename Screen, typename Window>
89@@ -152,10 +170,7 @@
90 priv->mWindow->windowNotify (CompWindowNotifyMinimize);
91 priv->mWindow->changeState (priv->mWindow->state () | CompWindowStateHiddenMask);
92
93- compiz::CompizMinimizedWindowHandler<Screen, Window>::Ptr compizMinimizeHandler =
94- boost::dynamic_pointer_cast <minimized_window_handler_full> (Window::get (priv->mWindow)->mMinimizeHandler);
95-
96- minimizedWindows.push_back (compizMinimizeHandler);
97+ minimizedWindows.push_back (this);
98
99 for (unsigned int &w : transients)
100 {
101@@ -163,7 +178,7 @@
102
103 if (win)
104 {
105- Window::get (win)->mMinimizeHandler = MinimizedWindowHandler::Ptr (new CompizMinimizedWindowHandler (win));
106+ Window::get (win)->mMinimizeHandler = CompizMinimizedWindowHandler::create (win);
107 Window::get (win)->mMinimizeHandler->minimize ();
108 }
109 }
110@@ -230,10 +245,7 @@
111
112 std::vector<unsigned int> transients = getTransients ();
113
114- compiz::CompizMinimizedWindowHandler<Screen, Window>::Ptr compizMinimizeHandler =
115- boost::dynamic_pointer_cast <minimized_window_handler_full> (Window::get (priv->mWindow)->mMinimizeHandler);
116-
117- minimizedWindows.remove (compizMinimizeHandler);
118+ minimizedWindows.remove (this);
119
120 priv->mWindow->focusSetEnabled (Window::get (priv->mWindow), true);
121
122@@ -333,7 +345,7 @@
123 typedef compiz::CompizMinimizedWindowHandler<Screen, Window> plugin_handler;
124 Window *pw = Window::get (w);
125 plugin_handler::Ptr compizMinimizeHandler =
126- boost::dynamic_pointer_cast <plugin_handler> (pw->mMinimizeHandler);
127+ boost::static_pointer_cast <plugin_handler> (pw->mMinimizeHandler);
128 /* Restore and re-save input shape and remove */
129 if (compizMinimizeHandler)
130 {
131
132=== modified file 'plugins/unityshell/src/minimizedwindowhandler.h'
133--- plugins/unityshell/src/minimizedwindowhandler.h 2011-10-05 12:20:19 +0000
134+++ plugins/unityshell/src/minimizedwindowhandler.h 2012-01-19 03:38:23 +0000
135@@ -27,6 +27,7 @@
136 #include "transientfor.h"
137 #include "inputremover.h"
138 #include <boost/shared_ptr.hpp>
139+#include <boost/weak_ptr.hpp>
140 #include <boost/bind.hpp>
141
142 // Will be merged back into compiz
143
144=== modified file 'plugins/unityshell/src/unityshell.cpp'
145--- plugins/unityshell/src/unityshell.cpp 2012-01-05 11:36:23 +0000
146+++ plugins/unityshell/src/unityshell.cpp 2012-01-19 03:38:23 +0000
147@@ -1640,7 +1640,7 @@
148 typedef compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow> minimized_window_handler_unity;
149
150 compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow>::Ptr compizMinimizeHandler =
151- boost::dynamic_pointer_cast <minimized_window_handler_unity> (mMinimizeHandler);
152+ boost::static_pointer_cast <minimized_window_handler_unity> (mMinimizeHandler);
153 mask |= compizMinimizeHandler->getPaintMask ();
154 }
155 else if (mShowdesktopHandler)
156@@ -1710,7 +1710,7 @@
157
158 if (!mMinimizeHandler)
159 {
160- mMinimizeHandler = compiz::MinimizedWindowHandler::Ptr (new compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow> (window));
161+ mMinimizeHandler = compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow>::create (window);
162 mMinimizeHandler->minimize ();
163 }
164 }
165@@ -1831,7 +1831,7 @@
166 typedef compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow> minimized_window_handler_unity;
167
168 compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow>::Ptr compizMinimizeHandler =
169- boost::dynamic_pointer_cast <minimized_window_handler_unity> (mMinimizeHandler);
170+ boost::static_pointer_cast <minimized_window_handler_unity> (mMinimizeHandler);
171 compizMinimizeHandler->windowNotify (n);
172 }
173 else if (mShowdesktopHandler)
174@@ -1874,7 +1874,7 @@
175 typedef compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow> minimized_window_handler_unity;
176
177 compiz::CompizMinimizedWindowHandler<UnityScreen, UnityWindow>::Ptr compizMinimizeHandler =
178- boost::dynamic_pointer_cast <minimized_window_handler_unity> (mMinimizeHandler);
179+ boost::static_pointer_cast <minimized_window_handler_unity> (mMinimizeHandler);
180
181 if (compizMinimizeHandler)
182 compizMinimizeHandler->updateFrameRegion (region);
183@@ -2307,7 +2307,7 @@
184
185 /* Window init */
186 UnityWindow::UnityWindow(CompWindow* window)
187- : BaseSwitchWindow (dynamic_cast<BaseSwitchScreen *> (UnityScreen::get (screen)), window)
188+ : BaseSwitchWindow (static_cast<BaseSwitchScreen *> (UnityScreen::get (screen)), window)
189 , PluginClassHandler<UnityWindow, CompWindow>(window)
190 , window(window)
191 , gWindow(GLWindow::get(window))
192@@ -2368,16 +2368,6 @@
193
194 UnityShowdesktopHandler::animating_windows.remove (window);
195
196- if (mMinimizeHandler && !window->destroyed ())
197- {
198- unminimize ();
199- window->focusSetEnabled (this, false);
200- window->minimizeSetEnabled (this, false);
201- window->unminimizeSetEnabled (this, false);
202- window->minimizedSetEnabled (this, false);
203- window->minimize ();
204- }
205-
206 mMinimizeHandler.reset ();
207
208 if (mShowdesktopHandler)

Subscribers

People subscribed via source and target branches

to all changes: