~ubuntu-branches/ubuntu/oneiric/unity/oneiric

« back to all changes in this revision

Viewing changes to debian/patches/debian-changes-4.14.2-0ubuntu2

  • Committer: Package Import Robot
  • Author(s): Didier Roche
  • Date: 2011-09-12 08:12:54 UTC
  • Revision ID: package-import@ubuntu.com-20110912081254-qtz600pc32fva88o
Tags: 4.14.2-0ubuntu2
* Cherry-pick a fix for remapping minimized window correctly (LP: #840285)
* debian/control:
  - bump build-dep for latest compiz-dev ABI break

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
Description: Upstream changes introduced in version 4.14.2-0ubuntu2
 
2
 This patch has been created by dpkg-source during the package build.
 
3
 Here's the last changelog entry, hopefully it gives details on why
 
4
 those changes were made:
 
5
 .
 
6
 unity (4.14.2-0ubuntu2) oneiric; urgency=low
 
7
 .
 
8
   * Cherry-pick a fix for remapping minimized window correctly (LP: #840285)
 
9
   * debian/control:
 
10
     - bump build-dep for latest compiz-dev ABI break
 
11
 .
 
12
 The person named in the Author field signed this changelog entry.
 
13
Author: Didier Roche <didrocks@ubuntu.com>
 
14
Bug-Ubuntu: https://bugs.launchpad.net/bugs/840285
 
15
 
 
16
---
 
17
The information above should follow the Patch Tagging Guidelines, please
 
18
checkout http://dep.debian.net/deps/dep3/ to learn about the format. Here
 
19
are templates for supplementary fields that you might want to add:
 
20
 
 
21
Origin: <vendor|upstream|other>, <url of original patch>
 
22
Bug: <url in upstream bugtracker>
 
23
Bug-Debian: http://bugs.debian.org/<bugnumber>
 
24
Bug-Ubuntu: https://launchpad.net/bugs/<bugnumber>
 
25
Forwarded: <no|not-needed|url proving that it has been forwarded>
 
26
Reviewed-By: <name and email of someone who approved the patch>
 
27
Last-Update: <YYYY-MM-DD>
 
28
 
 
29
--- unity-4.14.2.orig/services/CMakeLists.txt
 
30
+++ unity-4.14.2/services/CMakeLists.txt
 
31
@@ -39,7 +39,7 @@ set(CFLAGS
 
32
     "-DGETTEXT_PACKAGE=\"unity\""
 
33
     "-DINDICATORDIR=\"${_indicatordir}\""
 
34
     "-DINDICATORICONDIR=\"${_iconsdir}\""
 
35
-    "-Werror -Wall"
 
36
+    "-Wall"
 
37
     )
 
38
 add_definitions(${CFLAGS})
 
39
 
 
40
--- unity-4.14.2.orig/plugins/unityshell/src/inputremover.h
 
41
+++ unity-4.14.2/plugins/unityshell/src/inputremover.h
 
42
@@ -41,6 +41,9 @@ public:
 
43
   bool restore ();
 
44
 
 
45
 private:
 
46
+
 
47
+  void sendShapeNotify ();
 
48
+
 
49
   Display       *mDpy;
 
50
   Window        mShapeWindow;
 
51
   unsigned long mShapeMask;
 
52
@@ -52,7 +55,7 @@ private:
 
53
   XRectangle    *mBoundingRects;
 
54
   int           mNBoundingRects;
 
55
   int           mBoundingRectOrdering;
 
56
-  bool   mRemoved;
 
57
+  bool          mRemoved;
 
58
 
 
59
 };
 
60
 }
 
61
--- unity-4.14.2.orig/plugins/unityshell/src/compizminimizedwindowhandler.h
 
62
+++ unity-4.14.2/plugins/unityshell/src/compizminimizedwindowhandler.h
 
63
@@ -37,7 +37,6 @@ public:
 
64
   PrivateCompizMinimizedWindowHandler () {};
 
65
 
 
66
   CompWindow         *mWindow;
 
67
-  WindowInputRemover *clientInputRemover;
 
68
 };
 
69
 
 
70
 template <typename Screen, typename Window>
 
71
@@ -87,7 +86,6 @@ compiz::CompizMinimizedWindowHandler<Scr
 
72
   priv = new PrivateCompizMinimizedWindowHandler ();
 
73
 
 
74
   priv->mWindow = w;
 
75
-  priv->clientInputRemover = NULL;
 
76
 
 
77
 }
 
78
 
 
79
@@ -115,33 +113,7 @@ template <typename Screen, typename Wind
 
80
 void
 
81
 compiz::CompizMinimizedWindowHandler<Screen, Window>::setVisibility (bool visible)
 
82
 {
 
83
-  CompWindow::Geometry gm = priv->mWindow->geometry ();
 
84
-  MinimizedWindowHandler::setVisibility (visible, ROOTPARENT (priv->mWindow));
 
85
-
 
86
-  if (!visible && !priv->clientInputRemover)
 
87
-  {
 
88
-    priv->clientInputRemover = new compiz::WindowInputRemover (screen->dpy (), priv->mWindow->id ());
 
89
-    if (!priv->clientInputRemover)
 
90
-      return;
 
91
-
 
92
-    if (priv->clientInputRemover->save ())
 
93
-      priv->clientInputRemover->remove ();
 
94
-  }
 
95
-  else if (visible && priv->clientInputRemover)
 
96
-  {
 
97
-    priv->clientInputRemover->restore ();
 
98
-
 
99
-    delete priv->clientInputRemover;
 
100
-    priv->clientInputRemover = NULL;
 
101
-  }
 
102
-
 
103
-  /* This is a little hack to ensure that the window region gets updated,
 
104
-   * because there's no API in core to do that */
 
105
-
 
106
-  gm.setBorder (gm.border () + 1);
 
107
-  priv->mWindow->resize (gm);
 
108
-  gm.setBorder (gm.border () - 1);
 
109
-  priv->mWindow->resize (gm);
 
110
+  MinimizedWindowHandler::setVisibility (visible, priv->mWindow->id ());
 
111
 
 
112
   CompositeWindow::get (priv->mWindow)->addDamage ();
 
113
   GLWindow::get (priv->mWindow)->glPaintSetEnabled (Window::get (priv->mWindow), !visible);
 
114
@@ -285,8 +257,10 @@ template <typename Screen, typename Wind
 
115
 void
 
116
 compiz::CompizMinimizedWindowHandler<Screen, Window>::handleEvent (XEvent *event)
 
117
 {
 
118
+  /* Ignore sent events from the InputRemover */
 
119
   if (screen->XShape () && event->type ==
 
120
-      screen->shapeEvent () + ShapeNotify)
 
121
+      screen->shapeEvent () + ShapeNotify &&
 
122
+      !event->xany.send_event)
 
123
   {
 
124
     CompWindow *w = screen->findWindow (((XShapeEvent *) event)->window);
 
125
 
 
126
--- unity-4.14.2.orig/plugins/unityshell/src/inputremover.cpp
 
127
+++ unity-4.14.2/plugins/unityshell/src/inputremover.cpp
 
128
@@ -20,6 +20,7 @@
 
129
  */
 
130
 
 
131
 #include "inputremover.h"
 
132
+#include <X11/Xregion.h>
 
133
 #include <cstdio>
 
134
 
 
135
 compiz::WindowInputRemover::WindowInputRemover (Display *dpy,
 
136
@@ -43,6 +44,132 @@ compiz::WindowInputRemover::~WindowInput
 
137
     restore ();
 
138
 }
 
139
 
 
140
+void
 
141
+compiz::WindowInputRemover::sendShapeNotify ()
 
142
+{
 
143
+  /* Send a synthetic ShapeNotify event to the root window
 
144
+   * since we ignored shape events when setting visibility
 
145
+   * in order to avoid cycling in the shape handling code -
 
146
+   * ignore the sent shape notify event since that will
 
147
+   * be send_event = true */
 
148
+
 
149
+  XShapeEvent  xsev;
 
150
+  XEvent       *xev = (XEvent *) &xsev;
 
151
+  Window       rootReturn, parentReturn;
 
152
+  Window       childReturn;
 
153
+  Window       *children;
 
154
+  int          x, y, xOffset, yOffset;
 
155
+  unsigned int width, height, depth, border, nchildren;
 
156
+  int          shapeEvent, shapeError, shapeMask;
 
157
+
 
158
+  /* FIXME: roundtrip */
 
159
+  XShapeQueryExtension (mDpy, &shapeEvent, &shapeError);
 
160
+  shapeMask = XShapeInputSelected (mDpy, mShapeWindow);
 
161
+
 
162
+  xev->type   = shapeEvent + ShapeNotify;
 
163
+  xsev.window = mShapeWindow;
 
164
+
 
165
+  if (!mRemoved)
 
166
+  {
 
167
+    /* FIXME: these roundtrips suck */
 
168
+    XGetGeometry (mDpy, mShapeWindow, &rootReturn, &x, &y, &width, &height, &depth, &border);
 
169
+    XQueryTree (mDpy, mShapeWindow, &rootReturn, &parentReturn, &children, &nchildren);
 
170
+
 
171
+    /* We need to translate the co-ordinates of the origin to the
 
172
+     * client window to its parent to find out the offset of its
 
173
+     * position so that we can subtract that from the final bounding
 
174
+     * rect of the window shape according to the Shape extension
 
175
+     * specification */
 
176
+
 
177
+    XTranslateCoordinates (mDpy, mShapeWindow, parentReturn, 0, 0, &xOffset, &yOffset, &childReturn);
 
178
+
 
179
+    xev->type = ShapeBounding;
 
180
+
 
181
+    /* Calculate extents of the bounding shape */
 
182
+    if (!mNBoundingRects)
 
183
+    {
 
184
+      /* No set input shape, we must use the client geometry */
 
185
+      xsev.x = x - xOffset;
 
186
+      xsev.y = y - yOffset;
 
187
+      xsev.width = width; 
 
188
+      xsev.height = height;
 
189
+      xsev.shaped = false;
 
190
+    }
 
191
+    else
 
192
+    {
 
193
+      Region      boundingRegion = XCreateRegion ();
 
194
+
 
195
+      for (int i = 0; i < mNBoundingRects; i++)
 
196
+       XUnionRectWithRegion (&(mBoundingRects[i]), boundingRegion, boundingRegion);
 
197
+
 
198
+      xsev.x = boundingRegion->extents.x1 - xOffset;
 
199
+      xsev.y = boundingRegion->extents.y1 - yOffset;
 
200
+      xsev.width = boundingRegion->extents.x2 - boundingRegion->extents.x1;
 
201
+      xsev.height = boundingRegion->extents.y2 - boundingRegion->extents.y1;
 
202
+      xsev.shaped = true;
 
203
+
 
204
+      XDestroyRegion (boundingRegion);
 
205
+    }
 
206
+
 
207
+    xsev.time = CurrentTime;
 
208
+    XSendEvent (mDpy, DefaultRootWindow (mDpy), false, shapeMask, xev);
 
209
+
 
210
+    xev->type = ShapeInput;
 
211
+
 
212
+    /* Calculate extents of the bounding shape */
 
213
+    if (!mNInputRects)
 
214
+    {
 
215
+      /* No set input shape, we must use the client geometry */
 
216
+      xsev.x = x - xOffset;
 
217
+      xsev.y = y - yOffset;
 
218
+      xsev.width = width; 
 
219
+      xsev.height = height;
 
220
+      xsev.shaped = false;
 
221
+    }
 
222
+    else
 
223
+    {
 
224
+      Region      inputRegion = XCreateRegion ();
 
225
+
 
226
+      for (int i = 0; i < mNInputRects; i++)
 
227
+       XUnionRectWithRegion (&(mInputRects[i]), inputRegion, inputRegion);
 
228
+
 
229
+      xsev.x = inputRegion->extents.x1 - xOffset;
 
230
+      xsev.y = inputRegion->extents.y1 - yOffset;
 
231
+      xsev.width = inputRegion->extents.x2 - inputRegion->extents.x1;
 
232
+      xsev.height = inputRegion->extents.y2 - inputRegion->extents.y1;
 
233
+      xsev.shaped = true;
 
234
+
 
235
+      XDestroyRegion (inputRegion);
 
236
+    }
 
237
+
 
238
+    xsev.time = CurrentTime;
 
239
+    XSendEvent (mDpy, DefaultRootWindow (mDpy), false, shapeMask, xev);
 
240
+
 
241
+    if (children)
 
242
+      XFree (children);
 
243
+  }
 
244
+  else
 
245
+  {
 
246
+    xev->type = ShapeBounding;
 
247
+
 
248
+    xsev.x = 0;
 
249
+    xsev.y = 0;
 
250
+    xsev.width = 0;
 
251
+    xsev.height = 0;
 
252
+    xsev.shaped = true;
 
253
+
 
254
+    xsev.time = CurrentTime;
 
255
+    XSendEvent (mDpy, DefaultRootWindow (mDpy), false, shapeMask, xev);
 
256
+
 
257
+    xev->type = ShapeInput;
 
258
+
 
259
+    /* Both ShapeBounding and ShapeInput are null */
 
260
+
 
261
+    xsev.time = CurrentTime;
 
262
+    XSendEvent (mDpy, DefaultRootWindow (mDpy), false, shapeMask, xev);
 
263
+  }
 
264
+}
 
265
+
 
266
 bool
 
267
 compiz::WindowInputRemover::save ()
 
268
 {
 
269
@@ -111,6 +238,8 @@ compiz::WindowInputRemover::remove ()
 
270
 
 
271
   XShapeSelectInput (mDpy, mShapeWindow, ShapeNotify);
 
272
 
 
273
+  sendShapeNotify ();
 
274
+
 
275
   mRemoved = true;
 
276
   return true;
 
277
 }
 
278
@@ -125,6 +254,7 @@ compiz::WindowInputRemover::restore ()
 
279
       XShapeCombineRectangles (mDpy, mShapeWindow, ShapeInput, 0, 0,
 
280
                               mInputRects, mNInputRects,
 
281
                               ShapeSet, mInputRectOrdering);
 
282
+
 
283
     }
 
284
     else
 
285
     {
 
286
@@ -153,6 +283,8 @@ compiz::WindowInputRemover::restore ()
 
287
 
 
288
   XShapeSelectInput (mDpy, mShapeWindow, mShapeMask);
 
289
 
 
290
+  sendShapeNotify ();
 
291
+
 
292
   mRemoved = false;
 
293
   mNInputRects  = 0;
 
294
   mInputRects = NULL;
 
295
--- unity-4.14.2.orig/plugins/unityshell/src/minimizedwindowhandler.cpp
 
296
+++ unity-4.14.2/plugins/unityshell/src/minimizedwindowhandler.cpp
 
297
@@ -58,10 +58,10 @@ compiz::MinimizedWindowHandler::setVisib
 
298
   {
 
299
     priv->mRemover = new compiz::WindowInputRemover (priv->mDpy, shapeWin);
 
300
     if (!priv->mRemover)
 
301
-           return;
 
302
+      return;
 
303
 
 
304
     if (priv->mRemover->save ())
 
305
-           priv->mRemover->remove ();
 
306
+      priv->mRemover->remove ();
 
307
   }
 
308
   else if (visible && priv->mRemover)
 
309
   {