Index: include/beryl.h =================================================================== --- include/beryl.h (Revision 3425) +++ include/beryl.h (Arbeitskopie) @@ -26,7 +26,7 @@ #ifndef _BERYL_H #define _BERYL_H -#define BERYL_VERSION 49 +#define BERYL_VERSION 50 #define BERYL_ABI_INFO \ BERYL_VERSION, \ @@ -2243,6 +2243,8 @@ Bool shaded; Bool hidden; + Bool grabbed; + int texCoordSize; int indexCount; Index: src/window.c =================================================================== --- src/window.c (Revision 3425) +++ src/window.c (Arbeitskopie) @@ -1844,6 +1844,7 @@ w->inShowDesktopMode = FALSE; w->shaded = FALSE; w->hidden = FALSE; + w->grabbed = FALSE; // optional variables w->texCoordSize = 2; // default: only S and T (no R or Q coordinate) @@ -2511,10 +2512,14 @@ updateFrameWindow(w); } - else if (w->attrib.x != x || w->attrib.y != y) + else if ((w->attrib.x != x || w->attrib.y != y) && !w->grabbed) { int dx, dy; + /* only update the position of non-grabbed windows - it's in the + responsibility of a grabbing plugin to sync the window position + after ungrab */ + dx = x - w->attrib.x; dy = y - w->attrib.y; @@ -2808,15 +2813,17 @@ windowGrabNotify(CompWindow * w, int x, int y, unsigned int state, unsigned int mask) { + w->grabbed = TRUE; } void windowUngrabNotify(CompWindow * w) { + w->grabbed = FALSE; } void windowStateChangeNotify(CompWindow * w) { - w->lastState=w->state; + w->lastState = w->state; } static Bool isGroupTransient(CompWindow * w, Window clientLeader)