← Back to team overview

compiz team mailing list archive

[Merge] lp:~smspillaz/compcomm-plugins-main/compcomm-plugins-main.SRU1 into lp:~compiz/compcomm-plugins-main/ubuntu

 

Sam Spilsbury has proposed merging lp:~smspillaz/compcomm-plugins-main/compcomm-plugins-main.SRU1 into lp:~compiz/compcomm-plugins-main/ubuntu.

Requested reviews:
  compiz packagers (compiz)

For more details, see:
https://code.launchpad.net/~smspillaz/compcomm-plugins-main/compcomm-plugins-main.SRU1/+merge/78630
-- 
https://code.launchpad.net/~smspillaz/compcomm-plugins-main/compcomm-plugins-main.SRU1/+merge/78630
Your team compiz packagers is requested to review the proposed merge of lp:~smspillaz/compcomm-plugins-main/compcomm-plugins-main.SRU1 into lp:~compiz/compcomm-plugins-main/ubuntu.
=== modified file 'debian/compiz-plugins-main-default.install'
--- debian/compiz-plugins-main-default.install	2011-08-23 19:21:20 +0000
+++ debian/compiz-plugins-main-default.install	2011-10-07 16:27:28 +0000
@@ -1,22 +1,33 @@
 debian/tmp/usr/*/compiz/*animation.*
 debian/tmp/usr/share/gconf/schemas/*animation.*
+debian/tmp/usr/share/glib-2.0/schemas/*animation.*
 debian/tmp/usr/*/compiz/*expo.*
 debian/tmp/usr/share/gconf/schemas/*expo.*
+debian/tmp/usr/share/glib-2.0/schemas/*expo.*
 debian/tmp/usr/*/compiz/*ezoom.*
 debian/tmp/usr/share/gconf/schemas/*ezoom.*
+debian/tmp/usr/share/glib-2.0/schemas/*ezoom.*
 debian/tmp/usr/*/compiz/*grid.*
 debian/tmp/usr/share/gconf/schemas/*grid.*
+debian/tmp/usr/share/glib-2.0/schemas/*grid.*
 debian/tmp/usr/*/compiz/*mousepoll.*
 debian/tmp/usr/share/gconf/schemas/*mousepoll.*
+debian/tmp/usr/share/glib-2.0/schemas/*mousepoll.*
 debian/tmp/usr/*/compiz/*session.*
 debian/tmp/usr/share/gconf/schemas/*session.*
+debian/tmp/usr/share/glib-2.0/schemas/*session.*
 debian/tmp/usr/*/compiz/*snap.*
 debian/tmp/usr/share/gconf/schemas/*snap.*
+debian/tmp/usr/share/glib-2.0/schemas/*snap.*
 debian/tmp/usr/*/compiz/*staticswitcher.*
 debian/tmp/usr/share/gconf/schemas/*staticswitcher.*
+debian/tmp/usr/share/glib-2.0/schemas/*staticswitcher.*
 debian/tmp/usr/*/compiz/*vpswitch.*
 debian/tmp/usr/share/gconf/schemas/*vpswitch.*
+debian/tmp/usr/share/glib-2.0/schemas/*vpswitch.*
 debian/tmp/usr/*/compiz/*wall.*
 debian/tmp/usr/share/gconf/schemas/*wall.*
+debian/tmp/usr/share/glib-2.0/schemas/*wall.*
 debian/tmp/usr/*/compiz/*workarounds.*
 debian/tmp/usr/share/gconf/schemas/*workarounds.*
+debian/tmp/usr/share/glib-2.0/schemas/*workarounds.*

=== modified file 'debian/compiz-plugins-main.install'
--- debian/compiz-plugins-main.install	2011-08-23 19:21:20 +0000
+++ debian/compiz-plugins-main.install	2011-10-07 16:27:28 +0000
@@ -1,30 +1,44 @@
 debian/tmp/usr/*/compiz/*colorfilter.*
 debian/tmp/usr/share/gconf/schemas/*colorfilter.*
+debian/tmp/usr/share/glib-2.0/schemas/*colorfilter.*
 debian/tmp/usr/share/compiz/colorfilter
 debian/tmp/usr/*/compiz/*imgjpeg.*
 debian/tmp/usr/share/gconf/schemas/*imgjpeg.*
+debian/tmp/usr/share/glib-2.0/schemas/*imgjpeg.*
 debian/tmp/usr/*/compiz/*kdecompat.*
 debian/tmp/usr/share/gconf/schemas/*kdecompat.*
+debian/tmp/usr/share/glib-2.0/schemas/*kdecompat.*
 debian/tmp/usr/*/compiz/*mag.*
 debian/tmp/usr/share/gconf/schemas/*mag.*
+debian/tmp/usr/share/glib-2.0/schemas/*mag.*
 debian/tmp/usr/share/compiz/mag
 debian/tmp/usr/*/compiz/*neg.*
 debian/tmp/usr/share/gconf/schemas/*neg.*
+debian/tmp/usr/share/glib-2.0/schemas/*neg.*
 debian/tmp/usr/*/compiz/*opacify.*
 debian/tmp/usr/share/gconf/schemas/*opacify.*
+debian/tmp/usr/share/glib-2.0/schemas/*opacify.*
 debian/tmp/usr/*/compiz/*put.*
 debian/tmp/usr/share/gconf/schemas/*put.*
+debian/tmp/usr/share/glib-2.0/schemas/*put.*
 debian/tmp/usr/*/compiz/*resizeinfo.*
 debian/tmp/usr/share/gconf/schemas/*resizeinfo.*
+debian/tmp/usr/share/glib-2.0/schemas/*resizeinfo.*
 debian/tmp/usr/*/compiz/*ring.*
 debian/tmp/usr/share/gconf/schemas/*ring.*
+debian/tmp/usr/share/glib-2.0/schemas/*ring.*
 debian/tmp/usr/*/compiz/*scaleaddon.*
 debian/tmp/usr/share/gconf/schemas/*scaleaddon.*
+debian/tmp/usr/share/glib-2.0/schemas/*scaleaddon.*
 debian/tmp/usr/*/compiz/*shift.*
 debian/tmp/usr/share/gconf/schemas/*shift.*
+debian/tmp/usr/share/glib-2.0/schemas/*shift.*
 debian/tmp/usr/*/compiz/*text.*
 debian/tmp/usr/share/gconf/schemas/*text.*
+debian/tmp/usr/share/glib-2.0/schemas/*text.*
 debian/tmp/usr/*/compiz/*thumbnail.*
 debian/tmp/usr/share/gconf/schemas/*thumbnail.*
+debian/tmp/usr/share/glib-2.0/schemas/*thumbnail.*
 debian/tmp/usr/*/compiz/*winrules.*
 debian/tmp/usr/share/gconf/schemas/*winrules.*
+debian/tmp/usr/share/glib-2.0/schemas/*winrules.*

=== added file 'debian/patches/fix-827560.patch'
--- debian/patches/fix-827560.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-827560.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,297 @@
+=== modified file 'src/grid.cpp'
+Index: compiz-plugins-main-0.9.6/grid/src/grid.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/grid/src/grid.cpp	2011-09-28 16:58:20.000000000 +0800
++++ compiz-plugins-main-0.9.6/grid/src/grid.cpp	2011-10-08 00:14:22.616441019 +0800
+@@ -24,6 +24,8 @@
+ 
+ #include "grid.h"
+ 
++using namespace GridWindowType;
++
+ static const GridProps gridProps[] =
+ {
+     {0,1, 1,1},
+@@ -145,12 +147,23 @@
+     xid = CompOption::getIntOptionNamed (option, "window");
+     cw  = screen->findWindow (xid);
+ 
+-    if (where == GridUnknown || screen->otherGrabExist ("move", NULL))
+-	return false;
+-
+     if (cw)
+     {
+ 	XWindowChanges xwc;
++	bool maximizeH = where & (GridBottom | GridTop | GridMaximize);
++	bool maximizeV = where & (GridLeft | GridRight | GridMaximize);
++
++	if (!(cw->actions () & CompWindowActionResizeMask))
++	    return false;
++
++	if (maximizeH && !(cw->actions () & CompWindowActionMaximizeHorzMask))
++	    return false;
++
++	if (maximizeV && !(cw->actions () & CompWindowActionMaximizeVertMask))
++	    return false;
++
++	if (where == GridUnknown)
++	    return false;
+ 
+ 	GRID_WINDOW (cw);
+ 
+@@ -339,13 +352,42 @@
+ 	/* TODO: animate move+resize */
+ 	if (resize)
+ 	{
+-	    cw->configureXWindow (CWX | CWY | CWWidth | CWHeight, &xwc);
+-	    gw->isGridResized = true;
+-	    gw->isGridMaximized = false;
+-		for (unsigned int i = 0; i < animations.size (); i++)
+-			animations.at (i).fadingOut = true;
++	    unsigned int valueMask = CWX | CWY | CWWidth | CWHeight;
+ 	    gw->lastTarget = where;
+ 	    gw->currentSize = CompRect (wc.x, wc.y, wc.width, wc.height);
++
++	    /* Special case for left and right, actually vertically maximize
++	     * the window */
++	    if (where == GridLeft || where == GridRight)
++	    {
++		/* First restore the window to its original size */
++		XWindowChanges rwc;
++
++		rwc.x = gw->originalSize.x ();
++		rwc.y = gw->originalSize.y ();
++		rwc.width = gw->originalSize.width ();
++		rwc.height = gw->originalSize.height ();
++
++		cw->configureXWindow (CWX | CWY | CWWidth | CWHeight, &rwc);
++
++		gw->isGridMaximized = true;
++		gw->isGridResized = false;
++
++		gw->lastBorder = cw->border ();
++		/* Maximize the window */
++		cw->maximize (CompWindowStateMaximizedVertMask);
++	    }
++	    else
++	    {
++	        gw->isGridResized = true;
++	        gw->isGridMaximized = false;
++	    }
++
++	    /* Make window the size that we want */
++	    cw->configureXWindow (valueMask, &xwc);
++
++	    for (unsigned int i = 0; i < animations.size (); i++)
++		animations.at (i).fadingOut = true;
+ 	}
+ 
+ 	/* This centers a window if it could not be resized to the desired
+@@ -621,20 +663,23 @@
+ 			if (edge != NoEdge && check)
+ 			{
+ 				CompWindow *cw = screen->findWindow (screen->activeWindow ());
+-				animations.push_back (Animation ());
+-				int current = animations.size () - 1;
+-				animations.at (current).fromRect	= cw->serverBorderRect ();
+-				animations.at (current).currentRect	= cw->serverBorderRect ();
+-				animations.at (current).timer = animations.at (current).duration;
+-				animations.at (current).targetRect = desiredSlot;
+-
+-				if (lastEdge == NoEdge || !animating)
++				if (cw)
+ 				{
++				    animations.push_back (Animation ());
++				    int current = animations.size () - 1;
++				    animations.at (current).fromRect	= cw->serverBorderRect ();
++				    animations.at (current).currentRect	= cw->serverBorderRect ();
++				    animations.at (current).timer = animations.at (current).duration;
++				    animations.at (current).targetRect = desiredSlot;
++
++				    if (lastEdge == NoEdge || !animating)
++				    {
+ 					/* Cursor has entered edge region from non-edge region */
+ 					animating = true;
+ 					glScreen->glPaintOutputSetEnabled (this, true);
+ 					cScreen->preparePaintSetEnabled (this, true);
+ 					cScreen->donePaintSetEnabled (this, true);
++				    }
+ 				}
+ 			}
+ 		}
+@@ -664,21 +709,22 @@
+ 			unsigned int state,
+ 			unsigned int mask)
+ {
+-    if (screen->grabExist ("move"))
++    if (mask & (CompWindowGrabMoveMask | CompWindowGrabButtonMask))
+     {
+ 	gScreen->o[0].value ().set ((int) window->id ());
+ 
+ 	screen->handleEventSetEnabled (gScreen, true);
+ 	gScreen->mGrabWindow = window;
+ 	pointerBufDx = pointerBufDy = 0;
++	grabMask = mask;
+ 
+-	if (!isGridResized && gScreen->optionGetSnapbackWindows ())
++	if (!isGridResized && !isGridMaximized && gScreen->optionGetSnapbackWindows ())
+ 	    /* Store size not including borders when grabbing with cursor */
+ 	    originalSize = gScreen->slotToRect(window,
+ 						    window->serverBorderRect ());
+     }
+ 
+-    if (screen->grabExist ("resize"))
++    if (mask & CompWindowGrabResizeMask)
+     {
+ 	isGridResized = false;
+ 	resizeCount = 0;
+@@ -697,6 +743,7 @@
+ 			 gScreen->edge != gScreen->lastResizeEdge);
+ 
+ 	screen->handleEventSetEnabled (gScreen, false);
++	grabMask = 0;
+ 	gScreen->mGrabWindow = NULL;
+ 	gScreen->o[0].value ().set (0);
+ 	gScreen->cScreen->damageRegion (gScreen->desiredSlot);
+@@ -715,7 +762,7 @@
+ 
+     if (isGridResized && !isGridMaximized && !GridScreen::get (screen)->mSwitchingVp)
+     {
+-	if (window->grabbed ())
++	if (window->grabbed () && (grabMask & CompWindowGrabMoveMask))
+ 	{
+ 	    pointerBufDx += dx;
+ 	    pointerBufDy += dy;
+@@ -738,11 +785,49 @@
+ 	lastTarget = GridUnknown;
+     else if (!(lastState & MAXIMIZE_STATE) &&
+ 	     window->state () & MAXIMIZE_STATE)
++    {
+ 	lastTarget = GridMaximize;
++	if (window->grabbed ())
++	{
++	    originalSize = gScreen->slotToRect (window,
++					        window->serverBorderRect ());
++	}
++    }
+ 
+     window->stateChangeNotify (lastState);
+-} 
++}
++
++void
++GridWindow::windowNotify (CompWindowNotify n)
++{
++    if (n == CompWindowNotifyFrameUpdate)
++    {
++	if (isGridMaximized && !((window->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE))
++	{
++	    unsigned int valueMask = 0;
++	    XWindowChanges xwc;
++
++	    int dw = (lastBorder.left + lastBorder.right) - 
++		      (window->border ().left + window->border ().right);
++			
++	    int dh = (lastBorder.top + lastBorder.bottom) - 
++			(window->border ().top + window->border ().bottom);
++
++	    if (dw != 0)
++		valueMask |= CWWidth;
++	    if (dh != 0)
++		valueMask |= CWHeight;
++	    xwc.width = window->serverGeometry ().width () + dw;
++	    xwc.height = window->serverGeometry ().height () + dh;
+ 
++	    window->configureXWindow (valueMask, &xwc);
++	}
++
++	lastBorder = window->border ();
++    }
++
++    window->windowNotify (n);
++}
+ bool
+ GridScreen::restoreWindow (CompAction         *action,
+ 			   CompAction::State  state,
+@@ -929,6 +1014,7 @@
+     gScreen (GridScreen::get (screen)),
+     isGridResized (false),
+     isGridMaximized (false),
++    grabMask (0),
+     pointerBufDx (0),
+     pointerBufDy (0),
+     resizeCount (0),
+Index: compiz-plugins-main-0.9.6/grid/src/grid.h
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/grid/src/grid.h	2011-09-28 16:58:20.000000000 +0800
++++ compiz-plugins-main-0.9.6/grid/src/grid.h	2011-10-08 00:14:22.616441019 +0800
+@@ -32,20 +32,22 @@
+ 
+ #define SNAPOFF_THRESHOLD 50
+ 
+-typedef enum
++namespace GridWindowType
+ {
+-    GridUnknown = 0,
+-    GridBottomLeft = 1,
+-    GridBottom = 2,
+-    GridBottomRight = 3,
+-    GridLeft = 4,
+-    GridCenter = 5,
+-    GridRight = 6,
+-    GridTopLeft = 7,
+-    GridTop = 8,
+-    GridTopRight = 9,
+-    GridMaximize = 10
+-} GridType;
++    static const unsigned int GridUnknown = (1 << 0);
++    static const unsigned int GridBottomLeft  = (1 << 1);
++    static const unsigned int GridBottom  = (1 << 2);
++    static const unsigned int GridBottomRight = (1 << 3);
++    static const unsigned int GridLeft  = (1 << 4);
++    static const unsigned int GridCenter  = (1 << 5);
++    static const unsigned int GridRight  = (1 << 6);
++    static const unsigned int GridTopLeft  = (1 << 7);
++    static const unsigned int GridTop  = (1 << 8);
++    static const unsigned int GridTopRight  = (1 << 9);
++    static const unsigned int GridMaximize  = (1 << 10);
++};
++
++typedef unsigned int GridType;
+ 
+ typedef struct _GridProps
+ {
+@@ -160,11 +162,13 @@
+ 
+ 	bool isGridResized;
+ 	bool isGridMaximized;
++	unsigned int grabMask;
+ 	int pointerBufDx;
+ 	int pointerBufDy;
+ 	int resizeCount;
+ 	CompRect currentSize;
+ 	CompRect originalSize;
++	CompWindowExtents lastBorder;
+ 	GridType lastTarget;
+ 
+ 	void grabNotify (int, int, unsigned int, unsigned int);
+@@ -174,6 +178,8 @@
+ 	void moveNotify (int, int, bool);
+ 
+ 	void stateChangeNotify (unsigned int);
++
++	void windowNotify (CompWindowNotify n);
+ };
+ 
+ #define GRID_WINDOW(w) \
+Index: compiz-plugins-main-0.9.6/grid/CMakeLists.txt
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/grid/CMakeLists.txt	2011-10-08 00:15:04.064646551 +0800
++++ compiz-plugins-main-0.9.6/grid/CMakeLists.txt	2011-10-08 00:15:24.224746544 +0800
+@@ -2,4 +2,6 @@
+ 
+ include (CompizPlugin)
+ 
++set (CMAKE_CXX_FLAGS --std=c++0x)
++
+ compiz_plugin(grid PLUGINDEPS composite opengl)

=== added file 'debian/patches/fix-834585.patch'
--- debian/patches/fix-834585.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-834585.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,37 @@
+=== modified file 'src/grid.cpp'
+Index: compiz-plugins-main-0.9.6/grid/src/grid.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/grid/src/grid.cpp	2011-10-08 00:03:01.301062568 +0800
++++ compiz-plugins-main-0.9.6/grid/src/grid.cpp	2011-10-08 00:03:28.497197395 +0800
+@@ -663,23 +663,20 @@
+ 			if (edge != NoEdge && check)
+ 			{
+ 				CompWindow *cw = screen->findWindow (screen->activeWindow ());
+-				if (cw)
+-				{
+-				    animations.push_back (Animation ());
+-				    int current = animations.size () - 1;
+-				    animations.at (current).fromRect	= cw->serverBorderRect ();
+-				    animations.at (current).currentRect	= cw->serverBorderRect ();
+-				    animations.at (current).timer = animations.at (current).duration;
+-				    animations.at (current).targetRect = desiredSlot;
++				animations.push_back (Animation ());
++				int current = animations.size () - 1;
++				animations.at (current).fromRect	= cw->serverBorderRect ();
++				animations.at (current).currentRect	= cw->serverBorderRect ();
++				animations.at (current).timer = animations.at (current).duration;
++				animations.at (current).targetRect = desiredSlot;
+ 
+-				    if (lastEdge == NoEdge || !animating)
+-				    {
++				if (lastEdge == NoEdge || !animating)
++				{
+ 					/* Cursor has entered edge region from non-edge region */
+ 					animating = true;
+ 					glScreen->glPaintOutputSetEnabled (this, true);
+ 					cScreen->preparePaintSetEnabled (this, true);
+ 					cScreen->donePaintSetEnabled (this, true);
+-				    }
+ 				}
+ 			}
+ 		}

=== added file 'debian/patches/fix-853951.patch'
--- debian/patches/fix-853951.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-853951.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,180 @@
+=== modified file 'src/expo.cpp'
+Index: compiz-plugins-main-0.9.6/expo/src/expo.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/expo/src/expo.cpp	2011-10-04 01:21:03.253549136 +0800
++++ compiz-plugins-main-0.9.6/expo/src/expo.cpp	2011-10-04 01:21:22.253643351 +0800
+@@ -274,7 +274,7 @@
+ 				  screen->vp ().y () - selectedVp.y (), true);
+ 
+ 	    /* update saved window attributes in case we moved the
+-    window to a new viewport */
++	       window to a new viewport */
+ 	    if (dndWindow->saveMask () & CWX)
+ 	    {
+ 		dndWindow->saveWc ().x = dndWindow->saveWc ().x % screen->width ();
+@@ -289,11 +289,13 @@
+ 	    }
+ 
+ 	    /* update window attibutes to make sure a moved maximized window
+-	   is properly snapped to the work area */
++	       is properly snapped to the work area */
+ 	    if (dndWindow->state () & MAXIMIZE_STATE)
+ 		dndWindow->updateAttributes (CompStackingUpdateModeNone);
+ 	}
+     }
++
++    dndWindows.clear ();
+ }
+ 
+ void
+@@ -394,29 +396,6 @@
+     else
+ 	expoCam = MAX (0.0, expoCam - val);
+ 
+-    if (dndState == DnDDuring)
+-    {
+-	foreach (CompWindow *w, dndWindows)
+-	    ExpoWindow::get (w)->dndOpacity = MIN (1.0, ExpoWindow::get (w)->dndOpacity + val);
+-    }
+-    else if (dndState == DnDNone)
+-    {
+-	CompWindowList::iterator it = dndWindows.begin ();
+-
+-	while (it != dndWindows.end ())
+-	{
+-	    ExpoWindow::get ((*it))->dndOpacity = MAX (0.0, ExpoWindow::get ((*it))->dndOpacity - val);
+-
+-	    if (ExpoWindow::get ((*it))->dndOpacity <= 0.0f)
+-	    {
+-		dndWindows.erase (it);
+-		it = dndWindows.begin ();
+-	    }
+-	    else
+-		it++;
+-	}
+-    }
+-
+     if (expoCam)
+     {
+ 	unsigned int i, j, vp;
+@@ -545,11 +524,6 @@
+ 	foreach (float& vp, vpActivity)
+ 	    if (vp != 0.0 && vp != 1.0)
+ 		cScreen->damageScreen ();
+-
+-	foreach (CompWindow *w, dndWindows)
+-	    if (ExpoWindow::get (w)->dndOpacity != 0.0f &&
+-		ExpoWindow::get (w)->dndOpacity != 1.0f)
+-		cScreen->damageScreen ();
+     }
+ 
+     if (grabIndex && expoCam <= 0.0f && !expoMode)
+@@ -557,6 +531,7 @@
+ 	screen->removeGrab (grabIndex, NULL);
+ 	grabIndex = 0;
+ 	updateWraps (false);
++	cScreen->damageScreen ();
+     }
+ 
+     cScreen->donePaint ();
+@@ -640,7 +615,9 @@
+ 		    break;
+ 
+ 		dndState  = DnDDuring;
+-		dndWindows.push_back (w);
++
++		if (std::find (dndWindows.begin (), dndWindows.end (), w) == dndWindows.end ())
++		    dndWindows.push_back (w);
+ 
+ 		w->grabNotify (nx, ny, 0,
+ 			       CompWindowGrabMoveMask |
+@@ -808,7 +785,6 @@
+     }
+ 
+     cScreen->getWindowPaintListSetEnabled (this, paintingDndWindow);
+-
+     gScreen->glPaintTransformedOutput (attrib, sTransform3,
+ 				       screen->region (), output,
+ 				       mask);
+@@ -1053,7 +1029,7 @@
+ 	while (vp.y () < 0)
+ 	    vp.setY (screen->vpSize ().height () + vp.y ());
+ 
+-	paintViewport (attrib, sTransform, infiniteRegion, output, mask, vp, vpCamPos, reflection);
++	paintViewport (attrib, sTransform, region, output, mask, vp, vpCamPos, reflection);
+     }
+ 
+     paintingDndWindow = false;
+@@ -1228,7 +1204,7 @@
+ 	    }
+ 	}
+ 
+-	if (vp == eScreen->paintingVp || window->onAllViewports ())
++	if ((vp == eScreen->paintingVp || window->onAllViewports ()) && !eScreen->paintingDndWindow)
+ 	{
+ 	    fA.setBrightness (fragment.getBrightness () * eScreen->vpBrightness);
+ 	    fA.setSaturation (fragment.getSaturation () * eScreen->vpSaturation);
+@@ -1316,7 +1292,6 @@
+ 	}
+ 
+   }
+-
+   return status;
+ 
+ }
+@@ -1463,6 +1438,7 @@
+     GLMatrix            wTransform (transform);
+     GLWindowPaintAttrib wAttrib (attrib);
+     CompPoint           vp;
++    CompRegion          clip (region);
+ 
+     screen->viewportForGeometry (window->geometry (), vp);
+ 
+@@ -1505,6 +1481,7 @@
+ 
+     /* Stretch maximized windows a little so that you don't
+      * have an awkward gap */
++
+     if (window->state () & MAXIMIZE_STATE)
+     {
+ 	CompOutput *o = &screen->outputDevs ()[screen->outputDeviceForGeometry(window->geometry())];
+@@ -1522,27 +1499,21 @@
+ 
+ 	mask |= PAINT_WINDOW_TRANSFORMED_MASK;
+     }
+-
++	
+     if (std::find (eScreen->dndWindows.begin(), eScreen->dndWindows.end (), window) != eScreen->dndWindows.end ())
+     {
+ 	if (!eScreen->paintingDndWindow)
+ 	{
+-	    if ((1.0f - dndOpacity) <= 0.0f || (eScreen->paintingVp == vp &&
+-						eScreen->dndState != ExpoScreen::DnDNone))
+-		mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
+-	    else if (!window->region ().subtracted (screen->region ()).isEmpty () &&
+-		     eScreen->paintingVp != vp)
+-		wAttrib.opacity = wAttrib.opacity * (1.0f - dndOpacity);
++	    mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
+ 	}
+ 	else
+ 	{
+ 	    mask |= PAINT_WINDOW_TRANSFORMED_MASK;
+-	    if (!window->region ().subtracted (screen->region ()).isEmpty ())
+-		wAttrib.opacity = wAttrib.opacity * dndOpacity;
++	    clip = infiniteRegion;
+ 	}
+     }
+ 
+-    bool status = gWindow->glPaint (wAttrib, wTransform, region, mask);
++    bool status = gWindow->glPaint (wAttrib, wTransform, clip, mask);
+ 
+     return status;
+ }
+@@ -1661,7 +1632,6 @@
+     cWindow (CompositeWindow::get (w)),
+     gWindow (GLWindow::get (w)),
+     eScreen (ExpoScreen::get (screen)),
+-    dndOpacity (0.0f),
+     mGlowQuads (NULL)
+ {
+     CompositeWindowInterface::setHandler (cWindow, false);

=== added file 'debian/patches/fix-856177-865179.patch'
--- debian/patches/fix-856177-865179.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-856177-865179.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,53 @@
+=== modified file 'src/grid.cpp'
+Index: compiz-plugins-main-0.9.6/grid/src/grid.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/grid/src/grid.cpp	2011-10-07 20:49:30.011485286 +0800
++++ compiz-plugins-main-0.9.6/grid/src/grid.cpp	2011-10-07 20:51:50.544182148 +0800
+@@ -239,7 +239,7 @@
+ 
+ 	if (desiredRect.y () == currentRect.y () &&
+ 	    desiredRect.height () == currentRect.height () &&
+-	    where != GridMaximize && gw->lastTarget == where)
++	    where & ~(GridMaximize | GridLeft | GridRight) && gw->lastTarget & where)
+ 	{
+ 	    int slotWidth25  = workarea.width () / 4;
+ 	    int slotWidth33  = (workarea.width () / 3) + cw->border ().left;
+@@ -376,6 +376,12 @@
+ 		gw->lastBorder = cw->border ();
+ 		/* Maximize the window */
+ 		cw->maximize (CompWindowStateMaximizedVertMask);
++		/* Be evil */
++		if (cw->sizeHints ().flags & PResizeInc)
++		{
++		    gw->sizeHintsFlags |= PResizeInc;
++		    gw->window->sizeHints ().flags &= ~(PResizeInc);
++		}
+ 	    }
+ 	    else
+ 	    {
+Index: compiz-plugins-main-0.9.6/grid/src/grid.h
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/grid/src/grid.h	2011-10-07 20:49:30.011485286 +0800
++++ compiz-plugins-main-0.9.6/grid/src/grid.h	2011-10-07 20:51:08.995976136 +0800
+@@ -168,8 +168,8 @@
+ 	int resizeCount;
+ 	CompRect currentSize;
+ 	CompRect originalSize;
+-	CompWindowExtents lastBorder;
+ 	GridType lastTarget;
++	unsigned int sizeHintsFlags;
+ 
+ 	void grabNotify (int, int, unsigned int, unsigned int);
+ 
+@@ -178,8 +178,9 @@
+ 	void moveNotify (int, int, bool);
+ 
+ 	void stateChangeNotify (unsigned int);
+-
+-	void windowNotify (CompWindowNotify n);
++	void validateResizeRequest (unsigned int &valueMask,
++				    XWindowChanges *xwc,
++				    unsigned int source);
+ };
+ 
+ #define GRID_WINDOW(w) \

=== added file 'debian/patches/fix-862260.patch'
--- debian/patches/fix-862260.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-862260.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,270 @@
+=== modified file 'CMakeLists.txt'
+Index: compiz-plugins-main-0.9.6/grid/src/grid.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/grid/src/grid.cpp	2011-10-07 20:51:50.544182148 +0800
++++ compiz-plugins-main-0.9.6/grid/src/grid.cpp	2011-10-07 20:52:34.088398081 +0800
+@@ -26,24 +26,7 @@
+ 
+ using namespace GridWindowType;
+ 
+-static const GridProps gridProps[] =
+-{
+-    {0,1, 1,1},
+-
+-    {0,1, 2,2},
+-    {0,1, 1,2},
+-    {1,1, 2,2},
+-
+-    {0,0, 2,1},
+-    {0,0, 1,1},
+-    {1,0, 2,1},
+-
+-    {0,0, 2,2},
+-    {0,0, 1,2},
+-    {1,0, 2,2},
+-
+-    {0,0, 1,1},
+-};
++static std::map <unsigned int, GridProps> gridProps;
+ 
+ void
+ GridScreen::handleCompizEvent(const char*    plugin,
+@@ -102,7 +85,7 @@
+ void
+ GridScreen::getPaintRectangle (CompRect &cRect)
+ {
+-    if (edgeToGridType () != GridUnknown && optionGetDrawIndicator ())
++    if (typeToMask (edgeToGridType ()) != GridUnknown && optionGetDrawIndicator ())
+ 	cRect = desiredSlot;
+     else
+ 	cRect.setGeometry (0, 0, 0, 0);
+@@ -137,7 +120,7 @@
+ GridScreen::initiateCommon (CompAction         *action,
+ 			    CompAction::State  state,
+ 			    CompOption::Vector &option,
+-			    GridType           where,
++			    unsigned int                where,
+ 			    bool               resize,
+ 			    bool	       key)
+ {
+@@ -162,12 +145,12 @@
+ 	if (maximizeV && !(cw->actions () & CompWindowActionMaximizeVertMask))
+ 	    return false;
+ 
+-	if (where == GridUnknown)
++	if (where & GridUnknown)
+ 	    return false;
+ 
+ 	GRID_WINDOW (cw);
+ 
+-	if (gw->lastTarget != where)
++	if (gw->lastTarget & ~(where))
+ 	    gw->resizeCount = 0;
+ 	else if (!key)
+ 	    return false;
+@@ -197,7 +180,7 @@
+ 	    cw->maximize (0);
+ 	}
+ 
+-	if (where == GridMaximize && resize)
++	if ((where & GridMaximize) && resize)
+ 	{
+ 	    /* move the window to the correct output */
+ 	    if (cw == mGrabWindow)
+@@ -358,7 +341,7 @@
+ 
+ 	    /* Special case for left and right, actually vertically maximize
+ 	     * the window */
+-	    if (where == GridLeft || where == GridRight)
++	    if (where & GridLeft || where & GridRight)
+ 	    {
+ 		/* First restore the window to its original size */
+ 		XWindowChanges rwc;
+@@ -539,39 +522,72 @@
+     return status;
+ }
+ 
+-GridType
++unsigned int
++GridScreen::typeToMask (int t)
++{
++    typedef struct {
++	unsigned int mask;
++	int type;
++    } GridTypeMask;
++
++    std::vector <GridTypeMask> type =
++    {
++	{ GridWindowType::GridUnknown, 0 },
++	{ GridWindowType::GridBottomLeft, 1 },
++	{ GridWindowType::GridBottom, 2 },
++	{ GridWindowType::GridBottomRight, 3 },
++	{ GridWindowType::GridLeft, 4 },
++	{ GridWindowType::GridCenter, 5 },
++	{ GridWindowType::GridRight, 6 },
++	{ GridWindowType::GridTopLeft, 7 },
++	{ GridWindowType::GridTop, 8 },
++	{ GridWindowType::GridTopRight, 9 },
++	{ GridWindowType::GridMaximize, 10 }
++    };
++
++    for (unsigned int i = 0; i < type.size (); i++)
++    {
++	GridTypeMask &tm = type[i];
++	if (tm.type == t)
++	    return tm.mask;
++    }
++
++    return GridWindowType::GridUnknown;
++}
++
++int
+ GridScreen::edgeToGridType ()
+ {
+-    GridType ret;
++    int ret;
+ 
+     switch (edge) {
+     case Left:
+-	ret = (GridType) optionGetLeftEdgeAction ();
++	ret = (int) optionGetLeftEdgeAction ();
+ 	break;
+     case Right:
+-	ret = (GridType) optionGetRightEdgeAction ();
++	ret = (int) optionGetRightEdgeAction ();
+ 	break;
+     case Top:
+-	ret = (GridType) optionGetTopEdgeAction ();
++	ret = (int) optionGetTopEdgeAction ();
+ 	break;
+     case Bottom:
+-	ret = (GridType) optionGetBottomEdgeAction ();
++	ret = (int) optionGetBottomEdgeAction ();
+ 	break;
+     case TopLeft:
+-	ret = (GridType) optionGetTopLeftCornerAction ();
++	ret = (int) optionGetTopLeftCornerAction ();
+ 	break;
+     case TopRight:
+-	ret = (GridType) optionGetTopRightCornerAction ();
++	ret = (int) optionGetTopRightCornerAction ();
+ 	break;
+     case BottomLeft:
+-	ret = (GridType) optionGetBottomLeftCornerAction ();
++	ret = (int) optionGetBottomLeftCornerAction ();
+ 	break;
+     case BottomRight:
+-	ret = (GridType) optionGetBottomRightCornerAction ();
++	ret = (int) optionGetBottomRightCornerAction ();
+ 	break;
+     case NoEdge:
+     default:
+-	ret = GridUnknown;
++	ret = -1;
+ 	break;
+     }
+ 
+@@ -637,7 +653,7 @@
+ 	if (cScreen)
+ 	    cScreen->damageRegion (desiredSlot);
+ 
+-	initiateCommon (0, 0, o, edgeToGridType (), false, false);
++	initiateCommon (0, 0, o, typeToMask (edgeToGridType ()), false, false);
+ 
+ 	if (cScreen)
+ 	    cScreen->damageRegion (desiredSlot);
+@@ -655,7 +671,7 @@
+ 		if (cScreen)
+ 			cScreen->damageRegion (desiredSlot);
+ 
+-		check = initiateCommon (0, 0, o, edgeToGridType (), false, false);
++		check = initiateCommon (NULL, 0, o, typeToMask (edgeToGridType ()), false, false);
+ 
+ 		if (cScreen)
+ 			cScreen->damageRegion (desiredSlot);
+@@ -742,7 +758,7 @@
+     if (window == gScreen->mGrabWindow)
+     {
+ 	gScreen->initiateCommon
+-			(0, 0, gScreen->o, gScreen->edgeToGridType (), true,
++			(NULL, 0, gScreen->o, gScreen->typeToMask (gScreen->edgeToGridType ()), true,
+ 			 gScreen->edge != gScreen->lastResizeEdge);
+ 
+ 	screen->handleEventSetEnabled (gScreen, false);
+@@ -776,6 +792,8 @@
+ 	dx = currentSize.x () - window->geometry ().x ();
+ 	dy = currentSize.y () - window->geometry ().y ();
+ 
++	printf ("offset move\n");
++
+ 	window->move (dx, dy);
+     }
+ }
+@@ -983,6 +1001,17 @@
+     edge = lastEdge = lastResizeEdge = NoEdge;
+     currentWorkarea = lastWorkarea = screen->getWorkareaForOutput
+ 			    (screen->outputDeviceForPoint (pointerX, pointerY));
++    gridProps[GridUnknown] = GridProps {0,1, 1,1};
++    gridProps[GridBottomLeft]  = GridProps {0,1, 2,2};
++    gridProps[GridBottom]  = GridProps {0,1, 1,2};
++    gridProps[GridBottomRight] = GridProps {1,1, 2,2};
++    gridProps[GridLeft]  = GridProps {0,0, 2,1};
++    gridProps[GridCenter]  = GridProps{0,0, 1,1};
++    gridProps[GridRight]  = GridProps {1,0, 2,1};
++    gridProps[GridTopLeft]  = GridProps{0,0, 2,2};
++    gridProps[GridTop]  = GridProps {0,0, 1,2};
++    gridProps[GridTopRight]  = GridProps {0,0, 1,2};
++    gridProps[GridMaximize]  = GridProps {0,0, 1,1};
+ 
+ 	animations.clear ();
+ 
+@@ -990,16 +1019,16 @@
+     optionSet##opt##Initiate (boost::bind (&GridScreen::initiateCommon, this,  \
+ 					   _1, _2, _3, where, resize, key))
+ 
+-    GRIDSET (PutCenterKey, GridCenter, true, true);
+-    GRIDSET (PutLeftKey, GridLeft, true, true);
+-    GRIDSET (PutRightKey, GridRight, true, true);
+-    GRIDSET (PutTopKey, GridTop, true, true);
+-    GRIDSET (PutBottomKey, GridBottom, true, true);
+-    GRIDSET (PutTopleftKey, GridTopLeft, true, true);
+-    GRIDSET (PutToprightKey, GridTopRight, true, true);
+-    GRIDSET (PutBottomleftKey, GridBottomLeft, true, true);
+-    GRIDSET (PutBottomrightKey, GridBottomRight, true, true);
+-    GRIDSET (PutMaximizeKey, GridMaximize, true, true);
++    GRIDSET (PutCenterKey, GridWindowType::GridCenter, true, true);
++    GRIDSET (PutLeftKey, GridWindowType::GridLeft, true, true);
++    GRIDSET (PutRightKey, GridWindowType::GridRight, true, true);
++    GRIDSET (PutTopKey, GridWindowType::GridTop, true, true);
++    GRIDSET (PutBottomKey, GridWindowType::GridBottom, true, true);
++    GRIDSET (PutTopleftKey, GridWindowType::GridTopLeft, true, true);
++    GRIDSET (PutToprightKey, GridWindowType::GridTopRight, true, true);
++    GRIDSET (PutBottomleftKey, GridWindowType::GridBottomLeft, true, true);
++    GRIDSET (PutBottomrightKey, GridWindowType::GridBottomRight, true, true);
++    GRIDSET (PutMaximizeKey, GridWindowType::GridMaximize, true, true);
+ 
+ #undef GRIDSET
+ 
+Index: compiz-plugins-main-0.9.6/grid/src/grid.h
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/grid/src/grid.h	2011-10-07 20:51:08.995976136 +0800
++++ compiz-plugins-main-0.9.6/grid/src/grid.h	2011-10-07 20:52:00.372230883 +0800
+@@ -114,7 +114,7 @@
+ 	void setCurrentRect (Animation&);
+ 
+ 	bool initiateCommon (CompAction*, CompAction::State,
+-			     CompOption::Vector&, GridType, bool, bool);
++			     CompOption::Vector&, unsigned int, bool, bool);
+ 
+ 	void glPaintRectangle (const GLScreenPaintAttrib&,
+ 			       const GLMatrix&, CompOutput *);
+@@ -128,7 +128,8 @@
+ 
+ 	std::vector <Animation> animations;
+ 
+-	GridType edgeToGridType ();
++	int edgeToGridType ();
++	unsigned int typeToMask (int);
+ 
+ 	void handleEvent (XEvent *event);
+ 	void handleCompizEvent (const char *plugin, const char *event, CompOption::Vector &options);

=== added file 'debian/patches/fix-862261-860646.patch'
--- debian/patches/fix-862261-860646.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-862261-860646.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,142 @@
+=== modified file 'src/snap.cpp'
+Index: compiz-plugins-main-0.9.6/snap/src/snap.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/snap/src/snap.cpp	2011-10-04 01:27:48.107556695 +0800
++++ compiz-plugins-main-0.9.6/snap/src/snap.cpp	2011-10-04 01:29:25.420039241 +0800
+@@ -396,7 +396,7 @@
+ 	// Update snapping data
+ 	if (ss->optionGetSnapTypeMask () & SnapTypeEdgeResistanceMask)
+ 	{
+-	    snapped = true;
++	    snapGeometry = window->serverGeometry ();
+ 	    this->snapDirection |= snapDirection;
+ 	}
+ 	// Attract the window if needed, moving it of the correct dist
+@@ -487,7 +487,7 @@
+ 	// Update snapping data
+ 	if (ss->optionGetSnapTypeMask () & SnapTypeEdgeResistanceMask)
+ 	{
+-	    snapped = true;
++	    snapGeometry = window->serverGeometry ();
+ 	    this->snapDirection |= snapDirection;
+ 	}
+ 	// FIXME : this needs resize-specific code.
+@@ -591,7 +591,7 @@
+ 	// If there's horizontal snapping, add dx to current buffered
+ 	// dx and resist (move by -dx) or release the window and move
+ 	// by buffered dx - dx, same for dh
+-	if (snapped && snapDirection & HorizontalSnap)
++	if (!snapGeometry.isEmpty () && snapDirection & HorizontalSnap)
+ 	{
+ 	    m_dx += dx;
+ 	    if (m_dx < ss->optionGetResistanceDistance ()
+@@ -622,7 +622,7 @@
+ 	}
+ 
+ 	// Same for vertical snapping and dy/dh
+-	if (snapped && snapDirection & VerticalSnap)
++	if (snapGeometry.isEmpty () && snapDirection & VerticalSnap)
+ 	{
+ 	    m_dy += dy;
+ 	    if (m_dy < ss->optionGetResistanceDistance ()
+@@ -652,8 +652,8 @@
+ 	    }
+ 	}
+ 	// If we are no longer snapping in any direction, reset snapped
+-	if (snapped && !snapDirection)
+-	    snapped = false;
++	if (!snapGeometry.isEmpty () && !snapDirection)
++	    snapGeometry = CompWindow::Geometry ();
+     }
+ 
+     // If we don't already snap vertically and horizontally,
+@@ -681,6 +681,13 @@
+ 	return;
+     }
+ 
++    // don't snap maximized windows
++    if (window->state () & CompWindowStateMaximizedHorzMask)
++	dx = 0;
++
++    if (window->state () & CompWindowStateMaximizedVertMask)
++	dy = 0;
++
+     // avoiding snap, nothing buffered
+     if (!ss->snapping)
+ 	return;
+@@ -691,13 +698,14 @@
+ 	// If there's horizontal snapping, add dx to current buffered
+ 	// dx and resist (move by -dx) or release the window and move
+ 	// by buffered dx - dx
+-	if (snapped && snapDirection & HorizontalSnap)
++	if (!snapGeometry.isEmpty () && snapDirection & HorizontalSnap)
+ 	{
+ 	    m_dx += dx;
+ 	    if (m_dx < ss->optionGetResistanceDistance ()
+ 		&& m_dx > -ss->optionGetResistanceDistance ())
+ 	    {
+-		move (-dx, 0);
++		dx = snapGeometry.x () - window->geometry ().x ();
++		move (dx, 0);
+ 	    }
+ 	    else
+ 	    {
+@@ -707,13 +715,14 @@
+ 	    }
+ 	}
+ 	// Same for vertical snapping and dy
+-	if (snapped && snapDirection & VerticalSnap)
++	if (!snapGeometry.isEmpty () && snapDirection & VerticalSnap)
+ 	{
+ 	    m_dy += dy;
+ 	    if (m_dy < ss->optionGetResistanceDistance ()
+ 		&& m_dy > -ss->optionGetResistanceDistance ())
+ 	    {
+-		move (0, -dy);
++		dy = snapGeometry.y () - window->geometry ().y ();
++		move (0, dy);
+ 	    }
+ 	    else
+ 	    {
+@@ -723,8 +732,8 @@
+ 	    }
+ 	}
+ 	// If we are no longer snapping in any direction, reset snapped
+-	if (snapped && !snapDirection)
+-	    snapped = false;
++	if (!snapGeometry.isEmpty () && !snapDirection)
++	    snapGeometry = CompWindow::Geometry ();
+     }
+     // If we don't already snap vertically and horizontally,
+     // check edges status
+@@ -753,7 +762,7 @@
+ {
+     edges.clear ();
+ 
+-    snapped = false;
++    snapGeometry = CompWindow::Geometry ();
+     snapDirection = 0;
+     grabbed = 0;
+     m_dx = m_dy = m_dwidth = m_dheight = 0;
+@@ -809,7 +818,7 @@
+     m_dy (0),
+     m_dwidth (0),
+     m_dheight (0),
+-    snapped (false),
++    snapGeometry (0, 0, 0, 0, 0),
+     grabbed (0),
+     skipNotify (false)
+ {
+Index: compiz-plugins-main-0.9.6/snap/src/snap.h
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/snap/src/snap.h	2011-10-04 01:27:48.119556749 +0800
++++ compiz-plugins-main-0.9.6/snap/src/snap.h	2011-10-04 01:29:28.364053840 +0800
+@@ -127,7 +127,7 @@
+ 	int m_dheight;
+ 
+ 	// internals
+-	bool snapped;
++	CompWindow::Geometry snapGeometry;
+ 	int grabbed;
+ 
+ 	// internal, avoids infinite notify loops

=== added file 'debian/patches/fix-862261.patch'
--- debian/patches/fix-862261.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-862261.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,19 @@
+=== modified file 'src/snap.cpp'
+Index: compiz-plugins-main-0.9.6/snap/src/snap.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/snap/src/snap.cpp	2011-10-08 00:03:55.037329027 +0800
++++ compiz-plugins-main-0.9.6/snap/src/snap.cpp	2011-10-08 00:04:10.165404044 +0800
+@@ -581,6 +581,13 @@
+ 	return;
+     }
+ 
++    // don't snap maximized windows
++    if (window->state () & CompWindowStateMaximizedHorzMask)
++	dx = 0;
++
++    if (window->state () & CompWindowStateMaximizedVertMask)
++	dy = 0;
++
+     // avoiding snap, nothing buffered
+     if (!ss->snapping)
+ 	return;

=== added file 'debian/patches/fix-864476.patch'
--- debian/patches/fix-864476.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-864476.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,93 @@
+=== modified file 'src/animation.cpp'
+Index: compiz-plugins-main-0.9.6/animation/src/animation.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/animation/src/animation.cpp	2011-10-04 01:29:40.068111883 +0800
++++ compiz-plugins-main-0.9.6/animation/src/animation.cpp	2011-10-04 01:29:57.396197802 +0800
+@@ -1343,35 +1343,13 @@
+ 	    }
+ 	}
+ 
+-	popLockedPaintList ();
+-
+-	foreach (CompWindow *w, windowsFinishedAnimations)
+-	{
+-	    AnimWindow *aw = AnimWindow::get (w);
+-	    aw->priv->notifyAnimation (false);
+-	    aw->priv->postAnimationCleanUp ();
+-	}
+-
+-	const CompWindowList &ppl = pushLockedPaintList ();
+-
+-	foreach (CompWindow *w, ppl)
++	foreach (CompWindow *w, pl)
+ 	{
+ 	    PrivateAnimWindow *aw = AnimWindow::get (w)->priv;
+ 	    if (aw->curAnimation ())
+ 		aw->curAnimation ()->postPreparePaint ();
+ 	}
+ 
+-	if (!animStillInProgress)
+-	{
+-	    activateEvent (false);
+-	    mLastRedrawTimeFresh = false;
+-
+-	    // Reset stacking related info after all animations are done.
+-	    ExtensionPluginAnimation *extPlugin =
+-		static_cast<ExtensionPluginAnimation *> (mExtensionPlugins[0]);
+-	    extPlugin->resetStackingInfo ();
+-	}
+-
+ 	popLockedPaintList ();
+     }
+ 
+@@ -1396,6 +1374,50 @@
+ {
+     assert (mAnimInProgress);
+ 
++    const CompWindowList &pl = pushLockedPaintList ();
++    CompWindowList       windowsFinishedAnimations;
++
++    bool animStillInProgress = false;
++
++    /* Paint list includes destroyed windows */
++    for (CompWindowList::const_reverse_iterator rit = pl.rbegin ();
++	 rit != pl.rend (); rit++)
++    {
++	CompWindow *w = (*rit);
++	AnimWindow *animWin = AnimWindow::get (w);
++	PrivateAnimWindow *aw = animWin->priv;
++	Animation *curAnim = aw->curAnimation ();
++
++	if (curAnim)
++	{
++	    bool finished = (curAnim->remainingTime () <= 0);
++	    if (finished) // Animation is done
++		windowsFinishedAnimations.push_back (w);
++	    else
++		animStillInProgress = true;
++	}
++    }
++
++    popLockedPaintList ();
++
++    foreach (CompWindow *w, windowsFinishedAnimations)
++    {
++	AnimWindow *aw = AnimWindow::get (w);
++	aw->priv->notifyAnimation (false);
++	aw->priv->postAnimationCleanUp ();
++    }
++
++    if (!animStillInProgress)
++    {
++	activateEvent (false);
++	mLastRedrawTimeFresh = false;
++
++	// Reset stacking related info after all animations are done.
++	ExtensionPluginAnimation *extPlugin =
++		static_cast<ExtensionPluginAnimation *> (mExtensionPlugins[0]);
++	extPlugin->resetStackingInfo ();
++    }
++
+     cScreen->damagePending ();
+ 
+     cScreen->donePaint ();

=== added file 'debian/patches/fix-865177-865179.patch'
--- debian/patches/fix-865177-865179.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-865177-865179.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,146 @@
+=== modified file 'src/grid.cpp'
+Index: compiz-plugins-main-0.9.6/grid/src/grid.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/grid/src/grid.cpp	2011-10-08 00:04:28.801496451 +0800
++++ compiz-plugins-main-0.9.6/grid/src/grid.cpp	2011-10-08 00:06:13.290014587 +0800
+@@ -214,7 +214,13 @@
+ 	desiredSlot.setWidth (workarea.width () / props.numCellsX);
+ 
+ 	/* Adjust for constraints and decorations */
+-	desiredRect = constrainSize (cw, desiredSlot);
++	if (where & ~(GridMaximize | GridLeft | GridRight))
++	{
++	    desiredRect = constrainSize (cw, desiredSlot);
++	}
++	else
++	    desiredRect = slotToRect (cw, desiredSlot);
++
+ 	/* Get current rect not including decorations */
+ 	currentRect.setGeometry (cw->serverX (), cw->serverY (),
+ 				 cw->serverWidth (),
+@@ -338,6 +344,9 @@
+ 	    unsigned int valueMask = CWX | CWY | CWWidth | CWHeight;
+ 	    gw->lastTarget = where;
+ 	    gw->currentSize = CompRect (wc.x, wc.y, wc.width, wc.height);
++	    CompWindowExtents lastBorder = gw->window->border ();
++
++	    gw->sizeHintsFlags = 0;
+ 
+ 	    /* Special case for left and right, actually vertically maximize
+ 	     * the window */
+@@ -356,7 +365,6 @@
+ 		gw->isGridMaximized = true;
+ 		gw->isGridResized = false;
+ 
+-		gw->lastBorder = cw->border ();
+ 		/* Maximize the window */
+ 		cw->maximize (CompWindowStateMaximizedVertMask);
+ 		/* Be evil */
+@@ -372,6 +380,17 @@
+ 	        gw->isGridMaximized = false;
+ 	    }
+ 
++	    int dw = (lastBorder.left + lastBorder.right) - 
++		      (gw->window->border ().left +
++		       gw->window->border ().right);
++			
++	    int dh = (lastBorder.top + lastBorder.bottom) - 
++			(gw->window->border ().top +
++			 gw->window->border ().bottom);
++
++	    xwc.width += dw;
++	    xwc.height += dh;
++
+ 	    /* Make window the size that we want */
+ 	    cw->configureXWindow (valueMask, &xwc);
+ 
+@@ -723,6 +742,21 @@
+ }
+ 
+ void
++GridWindow::validateResizeRequest (unsigned int &xwcm,
++				   XWindowChanges *xwc,
++				   unsigned int source)
++{
++    window->validateResizeRequest (xwcm, xwc, source);
++
++    /* Don't allow non-pagers to change
++     * the size of the window, the user
++     * specified this size, thank-you */
++    if (isGridMaximized)
++	if (source != ClientTypePager)
++	    xwcm = 0;
++}
++
++void
+ GridWindow::grabNotify (int          x,
+ 			int          y,
+ 			unsigned int state,
+@@ -792,8 +826,6 @@
+ 	dx = currentSize.x () - window->geometry ().x ();
+ 	dy = currentSize.y () - window->geometry ().y ();
+ 
+-	printf ("offset move\n");
+-
+ 	window->move (dx, dy);
+     }
+ }
+@@ -818,37 +850,6 @@
+     window->stateChangeNotify (lastState);
+ }
+ 
+-void
+-GridWindow::windowNotify (CompWindowNotify n)
+-{
+-    if (n == CompWindowNotifyFrameUpdate)
+-    {
+-	if (isGridMaximized && !((window->state () & MAXIMIZE_STATE) == MAXIMIZE_STATE))
+-	{
+-	    unsigned int valueMask = 0;
+-	    XWindowChanges xwc;
+-
+-	    int dw = (lastBorder.left + lastBorder.right) - 
+-		      (window->border ().left + window->border ().right);
+-			
+-	    int dh = (lastBorder.top + lastBorder.bottom) - 
+-			(window->border ().top + window->border ().bottom);
+-
+-	    if (dw != 0)
+-		valueMask |= CWWidth;
+-	    if (dh != 0)
+-		valueMask |= CWHeight;
+-	    xwc.width = window->serverGeometry ().width () + dw;
+-	    xwc.height = window->serverGeometry ().height () + dh;
+-
+-	    window->configureXWindow (valueMask, &xwc);
+-	}
+-
+-	lastBorder = window->border ();
+-    }
+-
+-    window->windowNotify (n);
+-}
+ bool
+ GridScreen::restoreWindow (CompAction         *action,
+ 			   CompAction::State  state,
+@@ -866,7 +867,10 @@
+ 	return false;
+ 
+     if (gw->isGridMaximized & !(cw->state () & MAXIMIZE_STATE))
+-	    gw->isGridMaximized = false;
++    {
++	gw->window->sizeHints ().flags |= gw->sizeHintsFlags;
++	gw->isGridMaximized = false;
++    }
+     else
+     {
+         if (cw == mGrabWindow)
+@@ -1049,7 +1053,7 @@
+     grabMask (0),
+     pointerBufDx (0),
+     pointerBufDy (0),
+-    resizeCount (0),
++    resizeCount (0),	
+     lastTarget (GridUnknown)
+ {
+     WindowInterface::setHandler (window);

=== added file 'debian/patches/fix-868121.patch'
--- debian/patches/fix-868121.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-868121.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,138 @@
+=== modified file 'src/expo.cpp'
+Index: compiz-plugins-main-0.9.6/expo/src/expo.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/expo/src/expo.cpp	2011-10-08 00:06:59.998246191 +0800
++++ compiz-plugins-main-0.9.6/expo/src/expo.cpp	2011-10-08 00:07:17.022330628 +0800
+@@ -444,7 +444,6 @@
+     screen->handleEventSetEnabled (this, enable);
+     cScreen->preparePaintSetEnabled (this, enable);
+     cScreen->paintSetEnabled (this, enable);
+-    cScreen->getWindowPaintListSetEnabled (this, false);
+     cScreen->donePaintSetEnabled (this, enable);
+     gScreen->glPaintOutputSetEnabled (this, enable);
+     gScreen->glPaintTransformedOutputSetEnabled (this, enable);
+@@ -784,12 +783,14 @@
+ 			       DEFAULT_Z_CAMERA - curveDistance);
+     }
+ 
+-    cScreen->getWindowPaintListSetEnabled (this, paintingDndWindow);
++    if (paintingDndWindow)
++	cScreen->getWindowPaintListSetEnabled (this, true);
+     gScreen->glPaintTransformedOutput (attrib, sTransform3,
+ 				       screen->region (), output,
+ 				       mask);
+ 
+-    cScreen->getWindowPaintListSetEnabled (this, !paintingDndWindow);
++    if (paintingDndWindow)
++	cScreen->getWindowPaintListSetEnabled (this, false);
+ 
+     if (!reflection && !paintingDndWindow)
+     {
+@@ -821,6 +822,8 @@
+     invertTransformedVertex (attrib, sTransform3, output, br);
+ 
+     viewport_size = CompSize (br[0] - tl[0], br[1] - tl[1]);
++
++    cScreen->setWindowPaintOffset (0, 0);
+ }
+ 
+ void
+@@ -1105,8 +1108,6 @@
+ 
+     expoActive = false;
+ 
+-    cScreen->setWindowPaintOffset (0, 0);
+-
+     gScreen->glPaintTransformedOutputSetCurrentIndex (glPaintTransformedOutputIndex);
+     gScreen->setTextureFilter (oldFilter);
+ }
+@@ -1437,16 +1438,15 @@
+ {
+     GLMatrix            wTransform (transform);
+     GLWindowPaintAttrib wAttrib (attrib);
+-    CompPoint           vp;
+     CompRegion          clip (region);
+ 
+-    screen->viewportForGeometry (window->geometry (), vp);
+-
+     if (eScreen->expoActive)
+     {
+-	float opacity = 1.0;
+-	bool  hide;
+-	bool  zoomAnim;
++	float     opacity = 1.0;
++	bool      hide;
++	bool      zoomAnim;
++	CompPoint vp;
++	screen->viewportForGeometry (window->geometry (), vp);
+ 
+ 	zoomAnim = eScreen->optionGetExpoAnimation () ==
+ 	           ExpoScreen::ExpoAnimationZoom;
+@@ -1477,39 +1477,40 @@
+ 	    mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
+ 	else
+ 	    wAttrib.opacity = wAttrib.opacity * opacity;
+-    }
+ 
+-    /* Stretch maximized windows a little so that you don't
+-     * have an awkward gap */
++	/* Stretch maximized windows a little so that you don't
++	 * have an awkward gap */
+ 
+-    if (window->state () & MAXIMIZE_STATE)
+-    {
+-	CompOutput *o = &screen->outputDevs ()[screen->outputDeviceForGeometry(window->geometry())];
+-	float yS = 1.0 + ((o->height () / (float) window->height ()) - 1.0f) * sigmoidProgress (eScreen->expoCam);
+-	wTransform.translate (window->x () + window->width () / 2,
+-			      window->y () + window->height (),
+-			      0.0f);
+-	wTransform.scale (1.0f, yS, 1.0f);
+-	wTransform.translate (-(window->x () + window->width () / 2),
+-			      -(window->y () + window->height ()),
+-			      0.0f);
++	if (window->state () & MAXIMIZE_STATE &&
++		!window->border ().top)
++	{
++	    CompOutput *o = &screen->outputDevs ()[screen->outputDeviceForGeometry(window->geometry())];
++	    float yS = 1.0 + ((o->height () / (float) window->height ()) - 1.0f) * sigmoidProgress (eScreen->expoCam);
++	    wTransform.translate (window->x () + window->width () / 2,
++				  window->y () + window->height (),
++				  0.0f);
++	    wTransform.scale (1.0f, yS, 1.0f);
++	    wTransform.translate (-(window->x () + window->width () / 2),
++				  -(window->y () + window->height ()),
++				  0.0f);
+ 
+-	if (eScreen->paintingVp != vp)
+-	    mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
++	    if (eScreen->paintingVp != vp)
++		mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
+ 
+-	mask |= PAINT_WINDOW_TRANSFORMED_MASK;
+-    }
+-	
+-    if (std::find (eScreen->dndWindows.begin(), eScreen->dndWindows.end (), window) != eScreen->dndWindows.end ())
+-    {
+-	if (!eScreen->paintingDndWindow)
+-	{
+-	    mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
++	    mask |= PAINT_WINDOW_TRANSFORMED_MASK;
+ 	}
+-	else
++	
++	if (std::find (eScreen->dndWindows.begin(), eScreen->dndWindows.end (), window) != eScreen->dndWindows.end ())
+ 	{
+-	    mask |= PAINT_WINDOW_TRANSFORMED_MASK;
+-	    clip = infiniteRegion;
++	    if (!eScreen->paintingDndWindow)
++	    {
++		mask |= PAINT_WINDOW_NO_CORE_INSTANCE_MASK;
++	    }
++	    else
++	    {
++		mask |= PAINT_WINDOW_TRANSFORMED_MASK;
++		clip = infiniteRegion;
++	    }
+ 	}
+     }
+ 

=== added file 'debian/patches/fix-868392.patch'
--- debian/patches/fix-868392.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix-868392.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,14 @@
+=== modified file 'src/snap.cpp'
+Index: compiz-plugins-main-0.9.6/snap/src/snap.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/snap/src/snap.cpp	2011-10-08 00:07:30.750398687 +0800
++++ compiz-plugins-main-0.9.6/snap/src/snap.cpp	2011-10-08 00:07:49.882493524 +0800
+@@ -396,7 +396,7 @@
+ 	// Update snapping data
+ 	if (ss->optionGetSnapTypeMask () & SnapTypeEdgeResistanceMask)
+ 	{
+-	    snapGeometry = window->serverGeometry ();
++	    snapGeometry = window->geometry ();
+ 	    this->snapDirection |= snapDirection;
+ 	}
+ 	// Attract the window if needed, moving it of the correct dist

=== added file 'debian/patches/fix_clipping_issues_in_expo.patch'
--- debian/patches/fix_clipping_issues_in_expo.patch	1970-01-01 00:00:00 +0000
+++ debian/patches/fix_clipping_issues_in_expo.patch	2011-10-07 16:27:28 +0000
@@ -0,0 +1,124 @@
+=== modified file 'src/expo.cpp'
+Index: compiz-plugins-main-0.9.6/expo/src/expo.cpp
+===================================================================
+--- compiz-plugins-main-0.9.6.orig/expo/src/expo.cpp	2011-10-08 00:08:11.678601665 +0800
++++ compiz-plugins-main-0.9.6/expo/src/expo.cpp	2011-10-08 00:08:36.906726737 +0800
+@@ -274,7 +274,7 @@
+ 				  screen->vp ().y () - selectedVp.y (), true);
+ 
+ 	    /* update saved window attributes in case we moved the
+-	       window to a new viewport */
++    window to a new viewport */
+ 	    if (dndWindow->saveMask () & CWX)
+ 	    {
+ 		dndWindow->saveWc ().x = dndWindow->saveWc ().x % screen->width ();
+@@ -289,13 +289,11 @@
+ 	    }
+ 
+ 	    /* update window attibutes to make sure a moved maximized window
+-	       is properly snapped to the work area */
++	   is properly snapped to the work area */
+ 	    if (dndWindow->state () & MAXIMIZE_STATE)
+ 		dndWindow->updateAttributes (CompStackingUpdateModeNone);
+ 	}
+     }
+-
+-    dndWindows.clear ();
+ }
+ 
+ void
+@@ -396,6 +394,29 @@
+     else
+ 	expoCam = MAX (0.0, expoCam - val);
+ 
++    if (dndState == DnDDuring)
++    {
++	foreach (CompWindow *w, dndWindows)
++	    ExpoWindow::get (w)->dndOpacity = MIN (1.0, ExpoWindow::get (w)->dndOpacity + val);
++    }
++    else if (dndState == DnDNone)
++    {
++	CompWindowList::iterator it = dndWindows.begin ();
++
++	while (it != dndWindows.end ())
++	{
++	    ExpoWindow::get ((*it))->dndOpacity = MAX (0.0, ExpoWindow::get ((*it))->dndOpacity - val);
++
++	    if (ExpoWindow::get ((*it))->dndOpacity <= 0.0f)
++	    {
++		dndWindows.erase (it);
++		it = dndWindows.begin ();
++	    }
++	    else
++		it++;
++	}
++    }
++
+     if (expoCam)
+     {
+ 	unsigned int i, j, vp;
+@@ -523,6 +544,11 @@
+ 	foreach (float& vp, vpActivity)
+ 	    if (vp != 0.0 && vp != 1.0)
+ 		cScreen->damageScreen ();
++
++	foreach (CompWindow *w, dndWindows)
++	    if (ExpoWindow::get (w)->dndOpacity != 0.0f &&
++		ExpoWindow::get (w)->dndOpacity != 1.0f)
++		cScreen->damageScreen ();
+     }
+ 
+     if (grabIndex && expoCam <= 0.0f && !expoMode)
+@@ -530,7 +556,6 @@
+ 	screen->removeGrab (grabIndex, NULL);
+ 	grabIndex = 0;
+ 	updateWraps (false);
+-	cScreen->damageScreen ();
+     }
+ 
+     cScreen->donePaint ();
+@@ -614,9 +639,7 @@
+ 		    break;
+ 
+ 		dndState  = DnDDuring;
+-
+-		if (std::find (dndWindows.begin (), dndWindows.end (), w) == dndWindows.end ())
+-		    dndWindows.push_back (w);
++		dndWindows.push_back (w);
+ 
+ 		w->grabNotify (nx, ny, 0,
+ 			       CompWindowGrabMoveMask |
+@@ -1032,7 +1055,7 @@
+ 	while (vp.y () < 0)
+ 	    vp.setY (screen->vpSize ().height () + vp.y ());
+ 
+-	paintViewport (attrib, sTransform, region, output, mask, vp, vpCamPos, reflection);
++	paintViewport (attrib, sTransform, infiniteRegion, output, mask, vp, vpCamPos, reflection);
+     }
+ 
+     paintingDndWindow = false;
+@@ -1205,7 +1228,7 @@
+ 	    }
+ 	}
+ 
+-	if ((vp == eScreen->paintingVp || window->onAllViewports ()) && !eScreen->paintingDndWindow)
++	if (vp == eScreen->paintingVp || window->onAllViewports ())
+ 	{
+ 	    fA.setBrightness (fragment.getBrightness () * eScreen->vpBrightness);
+ 	    fA.setSaturation (fragment.getSaturation () * eScreen->vpSaturation);
+@@ -1293,6 +1316,7 @@
+ 	}
+ 
+   }
++
+   return status;
+ 
+ }
+@@ -1633,6 +1657,7 @@
+     cWindow (CompositeWindow::get (w)),
+     gWindow (GLWindow::get (w)),
+     eScreen (ExpoScreen::get (screen)),
++    dndOpacity (0.0f),
+     mGlowQuads (NULL)
+ {
+     CompositeWindowInterface::setHandler (cWindow, false);

=== added file 'debian/patches/series'
--- debian/patches/series	1970-01-01 00:00:00 +0000
+++ debian/patches/series	2011-10-07 16:27:28 +0000
@@ -0,0 +1,12 @@
+fix-827560.patch
+fix-834585.patch
+fix-853951.patch
+fix-856177-865179.patch
+fix-862260.patch
+fix-862261-860646.patch
+fix-862261.patch
+fix-864476.patch
+fix-865177-865179.patch
+fix-868121.patch
+fix-868392.patch
+fix_clipping_issues_in_expo.patch


Follow ups