Description: Fix window edge behaviour Author: https://bugs.launchpad.net/bugs/103306 diff -Nur -x '*.orig' -x '*~' compiz-fusion-plugins-main-0.8.4/metadata/wall.xml.in compiz-fusion-plugins-main-0.8.4.new/metadata/wall.xml.in --- compiz-fusion-plugins-main-0.8.4/metadata/wall.xml.in 2009-10-14 16:33:23.390182291 -0500 +++ compiz-fusion-plugins-main-0.8.4.new/metadata/wall.xml.in 2009-10-14 16:34:50.592662841 -0500 @@ -280,6 +280,7 @@ <_short>Flip Left <_long>Flip left true + false @@ -289,6 +290,7 @@ <_short>Flip Right <_long>Flip right true + false @@ -298,6 +300,7 @@ <_short>Flip Up <_long>Flip up true + false @@ -307,6 +310,7 @@ <_short>Flip Down <_long>Flip down true + false diff -Nur -x '*.orig' -x '*~' compiz-fusion-plugins-main-0.8.4/src/wall/wall.c compiz-fusion-plugins-main-0.8.4.new/src/wall/wall.c --- compiz-fusion-plugins-main-0.8.4/src/wall/wall.c 2009-10-14 16:33:23.390182291 -0500 +++ compiz-fusion-plugins-main-0.8.4.new/src/wall/wall.c 2009-10-14 16:42:47.275026317 -0500 @@ -111,6 +111,8 @@ WindowUngrabNotifyProc windowUngrabNotify; ActivateWindowProc activateWindow; + int grabCount; + Bool moving; /* Used to track miniview movement */ Bool showPreview; @@ -178,6 +180,38 @@ static void +wallScreenOptionChangeNotify (CompScreen *s, CompOption *opt, + WallScreenOptions num) +{ + WALL_SCREEN (s); + + if (ws->grabCount == -1 || ws->grabCount > 0) + { + removeScreenAction (s, wallGetFlipLeftEdge(s->display)); + removeScreenAction (s, wallGetFlipRightEdge(s->display)); + removeScreenAction (s, wallGetFlipUpEdge(s->display)); + removeScreenAction (s, wallGetFlipDownEdge(s->display)); + } + + if (wallGetEdgeflipPointer (s) || wallGetEdgeflipMove (s) || + wallGetEdgeflipDnd (s)) + { + if (!wallGetEdgeflipPointer (s) && !wallGetEdgeflipDnd (s)) + ws->grabCount = 0; + else + { + ws->grabCount = -1; + addScreenAction (s, wallGetFlipLeftEdge(s->display)); + addScreenAction (s, wallGetFlipRightEdge(s->display)); + addScreenAction (s, wallGetFlipUpEdge(s->display)); + addScreenAction (s, wallGetFlipDownEdge(s->display)); + } + } + else + ws->grabCount = -2; +} + +static void wallClearCairoLayer (cairo_t *cr) { cairo_save (cr); @@ -1903,11 +1937,25 @@ unsigned int state, unsigned int mask) { - WALL_SCREEN (w->screen); + CompScreen *s = w->screen; + WALL_SCREEN (s); if (!ws->grabWindow) ws->grabWindow = w; + if (ws->grabCount >= 0) + { + if (!ws->grabCount) + { + addScreenAction (s, wallGetFlipLeftEdge(s->display)); + addScreenAction (s, wallGetFlipRightEdge(s->display)); + addScreenAction (s, wallGetFlipUpEdge(s->display)); + addScreenAction (s, wallGetFlipDownEdge(s->display)); + } + + ws->grabCount++; + } + UNWRAP (ws, w->screen, windowGrabNotify); (*w->screen->windowGrabNotify) (w, x, y, state, mask); WRAP (ws, w->screen, windowGrabNotify, wallWindowGrabNotify); @@ -1916,11 +1964,25 @@ static void wallWindowUngrabNotify (CompWindow *w) { - WALL_SCREEN (w->screen); + CompScreen *s = w->screen; + WALL_SCREEN (s); if (w == ws->grabWindow) ws->grabWindow = NULL; + if (ws->grabCount >= 0) + { + ws->grabCount--; + + if (!ws->grabCount) + { + removeScreenAction (s, wallGetFlipLeftEdge(s->display)); + removeScreenAction (s, wallGetFlipRightEdge(s->display)); + removeScreenAction (s, wallGetFlipUpEdge(s->display)); + removeScreenAction (s, wallGetFlipDownEdge(s->display)); + } + } + UNWRAP (ws, w->screen, windowUngrabNotify); (*w->screen->windowUngrabNotify) (w); WRAP (ws, w->screen, windowUngrabNotify, wallWindowUngrabNotify); @@ -2122,6 +2184,8 @@ ws->transform = NoTransformation; ws->direction = -1; + ws->grabCount = 0; + memset (&ws->switcherContext, 0, sizeof (WallCairoContext)); memset (&ws->thumbContext, 0, sizeof (WallCairoContext)); memset (&ws->highlightContext, 0, sizeof (WallCairoContext)); @@ -2137,6 +2201,27 @@ WRAP (ws, s, windowUngrabNotify, wallWindowUngrabNotify); WRAP (ws, s, activateWindow, wallActivateWindow); + wallSetEdgeflipPointerNotify (s, wallScreenOptionChangeNotify); + wallSetEdgeflipMoveNotify (s, wallScreenOptionChangeNotify); + wallSetEdgeflipDndNotify (s, wallScreenOptionChangeNotify); + + if (wallGetEdgeflipPointer (s) || wallGetEdgeflipMove (s) || + wallGetEdgeflipDnd (s)) + { + if (!wallGetEdgeflipPointer (s) && !wallGetEdgeflipDnd (s)) + ws->grabCount = 0; + else + { + ws->grabCount = -1; + addScreenAction (s, wallGetFlipLeftEdge(s->display)); + addScreenAction (s, wallGetFlipRightEdge(s->display)); + addScreenAction (s, wallGetFlipUpEdge(s->display)); + addScreenAction (s, wallGetFlipDownEdge(s->display)); + } + } + else + ws->grabCount = -2; + s->base.privates[wd->screenPrivateIndex].ptr = ws; wallCreateCairoContexts (s, TRUE); @@ -2170,6 +2255,14 @@ freeWindowPrivateIndex (s, ws->windowPrivateIndex); + if (ws->grabCount > 0 || ws->grabCount == -1) + { + removeScreenAction (s, wallGetFlipLeftEdge(s->display)); + removeScreenAction (s, wallGetFlipRightEdge(s->display)); + removeScreenAction (s, wallGetFlipUpEdge(s->display)); + removeScreenAction (s, wallGetFlipDownEdge(s->display)); + } + free(ws); }