All pastes #283488 Raw Edit

Unnamed

public text v1 · immutable
#283488 ·published 2006-12-18 11:24 UTC
rendered paste body
Index: group.h
===================================================================
--- group.h	(Revision 1861)
+++ group.h	(Arbeitskopie)
@@ -98,8 +98,8 @@
 
 #define WIN_X(w) (w->attrib.x)
 #define WIN_Y(w) (w->attrib.y)
-#define WIN_WIDTH(w) (w->attrib.width)
-#define WIN_HEIGHT(w) (w->attrib.height)
+#define WIN_WIDTH(w) (w->width + 2 * w->attrib.border_width)
+#define WIN_HEIGHT(w) (w->height + 2 * w->attrib.border_width)
 #define WIN_BORDER(w) (w->attrib.border_width)
 
 #define NUM_OPTIONS(s) (sizeof ( (s)->opt) / sizeof (CompOption))
@@ -231,6 +231,25 @@
 } GroupTabBar;
 
 /*
+ * GroupGlow
+ */
+
+typedef struct _GlowQuad {
+	BoxRec box;
+	CompMatrix matrix;
+} GlowQuad;
+
+#define GLOWQUAD_TOPLEFT	0
+#define GLOWQUAD_TOPRIGHT	1
+#define GLOWQUAD_BOTTOMLEFT	2
+#define GLOWQUAD_BOTTOMRIGHT	3
+#define GLOWQUAD_TOP		4
+#define GLOWQUAD_BOTTOM		5
+#define GLOWQUAD_LEFT		6
+#define GLOWQUAD_RIGHT		7
+#define NUM_GLOWQUADS		8
+
+/*
  * GroupSelection
  */
 typedef struct _GroupSelection GroupSelection;
@@ -334,7 +353,8 @@
 	int oldX;
 	int oldY;
 
-	GLushort	oldOpacity;
+	GlowQuad *glowQuads;
+	GLushort oldOpacity;
 
 	// for tab animation
 	Bool animate;
@@ -400,6 +420,8 @@
 /*
  * paint.c
  */
+void groupRecomputeGlow(CompScreen *s);
+void groupComputeGlowQuads(CompWindow *w, CompMatrix *matrix);
 void groupHandleChanges(CompScreen* s);
 void groupDrawTabAnimation(CompScreen * s);
 void groupTabBarVertices(CompScreen *s, int x, int y, int width, int height);
Index: init.c
===================================================================
--- init.c	(Revision 1861)
+++ init.c	(Arbeitskopie)
@@ -177,7 +177,6 @@
 Bool groupInitWindow(CompPlugin * p, CompWindow * w)
 {
 	GroupWindow *gw;
-
 	GROUP_SCREEN(w->screen);
 
 	gw = malloc(sizeof(GroupWindow));
@@ -201,9 +200,11 @@
 	gw->destinationY = 0;
 
 	//gw->offscreen = FALSE;
-
 	w->privates[gs->windowPrivateIndex].ptr = gw;
 
+	gw->glowQuads = NULL;
+	groupComputeGlowQuads (w, &gs->glowTexture.matrix);
+
 	return TRUE;
 }
 
@@ -215,6 +216,9 @@
 {
 	GROUP_WINDOW(w);
 
+	if (gw->glowQuads)
+		free (gw->glowQuads);
+
 	free(gw);
 }
 
Index: option.c
===================================================================
--- option.c	(Revision 1861)
+++ option.c	(Arbeitskopie)
@@ -482,8 +482,11 @@
 							glowTextureProperties[gs->glowType].textureData,
 							glowTextureProperties[gs->glowType].textureSize,
 							glowTextureProperties[gs->glowType].textureSize);
-						if (gs->opt[GROUP_SCREEN_OPTION_GLOW].value.b && gd->groups)
+
+						if (gs->opt[GROUP_SCREEN_OPTION_GLOW].value.b && gd->groups) {
+							groupRecomputeGlow (s);
 							damageScreen (s);
+						}
 					}
 					return TRUE;
 				}
@@ -506,14 +509,18 @@
 
 	case GROUP_SCREEN_OPTION_GLOW_SIZE:
 		if (compSetIntOption(o, value)) {
-			if (gs->opt[GROUP_SCREEN_OPTION_GLOW].value.b && gd->groups)
-				damageScreen (s);
+			if (gs->opt[GROUP_SCREEN_OPTION_GLOW].value.b) {
+				groupRecomputeGlow (s);
+				if (gd->groups)
+					damageScreen (s);
+			}
 			return TRUE;
 		}
 		break;
 
 	case GROUP_SCREEN_OPTION_GLOW:
 		if (compSetBoolOption(o, value)) {
+			groupRecomputeGlow (s);
 			if (gd->groups)
 				damageScreen (s);
 			return TRUE;
Index: paint.c
===================================================================
--- paint.c	(Revision 1861)
+++ paint.c	(Arbeitskopie)
@@ -496,194 +496,209 @@
 	}
 }
 
-/*
- * groupDrawWindow
- *
- */
-Bool
-groupDrawWindow(CompWindow * w,
-		const WindowPaintAttrib * attrib,
-		Region region, unsigned int mask)
+void groupRecomputeGlow (CompScreen *s)
 {
-    Bool status;
-    GROUP_WINDOW(w);
-    GROUP_SCREEN(w->screen);
+	GROUP_SCREEN(s);
+	CompWindow *w;
 
-    if (!(mask & PAINT_WINDOW_SOLID_MASK) &&
-        gw->inGroup && gs->opt[GROUP_SCREEN_OPTION_GLOW].value.b) {
+	for (w = s->windows; w; w = w->next)
+		groupComputeGlowQuads (w, &gs->glowTexture.matrix);
+}
 
-		if (mask & PAINT_WINDOW_TRANSFORMED_MASK)
-			region = getInfiniteRegion();
+void
+groupComputeGlowQuads (CompWindow *w, CompMatrix *matrix)
+{
+	GROUP_WINDOW(w);
+	GROUP_SCREEN(w->screen);
 
-		if (region->numRects) {
-			REGION box;
-			CompMatrix matrix = gs->glowTexture.matrix;;
+	BoxRec *box;
+	CompMatrix *quadMatrix;
 
-			box.rects = &box.extents;
-			box.numRects = 1;
+	if (gs->opt[GROUP_SCREEN_OPTION_GLOW].value.b) {
+		if (!gw->glowQuads)
+			gw->glowQuads = malloc (NUM_GLOWQUADS * sizeof(GlowQuad));
+		if (!gw->glowQuads)
+			return;
+	} else {
+		if (gw->glowQuads) {
+			free (gw->glowQuads);
+			gw->glowQuads = NULL;
+		}
+		return;
+	}
 
-			w->vCount = 0;
+	int glowSize = gs->opt[GROUP_SCREEN_OPTION_GLOW_SIZE].value.i;
+	int glowOffset = (glowSize * glowTextureProperties[gs->glowType].glowOffset /
+		      glowTextureProperties[gs->glowType].textureSize) + 1; 
 
-			int glowSize = gs->opt[GROUP_SCREEN_OPTION_GLOW_SIZE].value.i;
-			int glowOffset = (glowSize * glowTextureProperties[gs->glowType].glowOffset /
-				glowTextureProperties[gs->glowType].textureSize) + 1; 
+	/* Top left corner */
+	box = &gw->glowQuads[GLOWQUAD_TOPLEFT].box;
+	gw->glowQuads[GLOWQUAD_TOPLEFT].matrix = *matrix;
+	quadMatrix = &gw->glowQuads[GLOWQUAD_TOPLEFT].matrix;
 
-			// Top left
-			box.extents.x1 = WIN_X(w) - w->input.left - glowSize + glowOffset;
-			box.extents.y1 = WIN_Y(w) - w->input.top - glowSize + glowOffset;
-			box.extents.x2 = WIN_X(w) - w->input.left + glowOffset;
-			box.extents.y2 = WIN_Y(w) - w->input.top + glowOffset;
+	box->x1 = WIN_X(w) - w->input.left - glowSize + glowOffset;
+	box->y1 = WIN_Y(w) - w->input.top - glowSize + glowOffset;
+	box->x2 = MIN(WIN_X(w) - w->input.left + glowOffset, 
+		WIN_X(w) - w->input.left + ((WIN_WIDTH(w) + w->input.left + w->input.right) / 2));
+	box->y2 = MIN(WIN_Y(w) - w->input.top + glowOffset,
+		WIN_Y(w) - w->input.top + ((WIN_HEIGHT(w) + w->input.top + w->input.bottom) / 2));
 
-			matrix.xx = 1.0f / glowSize;
-			matrix.yy = -1.0f / glowSize;
-			matrix.x0 = -(box.extents.x1 * matrix.xx);
-			matrix.y0 = 1.0 -(box.extents.y1 * matrix.yy);
+	quadMatrix->xx = 1.0f / glowSize;
+	quadMatrix->yy = -1.0f / glowSize;
+	quadMatrix->x0 = -(box->x1 * quadMatrix->xx);
+	quadMatrix->y0 = 1.0 -(box->y1 * quadMatrix->yy);
 
-			if (box.extents.x1 < box.extents.x2 &&
-				box.extents.y1 < box.extents.y2) {
-				(*w->screen->addWindowGeometry) (w, &matrix, 1, &box, region);
-			}
+	/* Top right corner */
+	box = &gw->glowQuads[GLOWQUAD_TOPRIGHT].box;
+	gw->glowQuads[GLOWQUAD_TOPRIGHT].matrix = *matrix;
+	quadMatrix = &gw->glowQuads[GLOWQUAD_TOPRIGHT].matrix;
 
-			if (attrib->opacity != gw->oldOpacity)
-				damageScreenRegion (w->screen, &box);
+	box->x1 = MAX(WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset,
+		WIN_X(w) - w->input.left + ((WIN_WIDTH(w) + w->input.left + w->input.right) / 2));
+	box->y1 = WIN_Y(w) - w->input.top - glowSize + glowOffset;
+	box->x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right + glowSize - glowOffset;
+	box->y2 = MIN(WIN_Y(w) - w->input.top + glowOffset,
+		WIN_Y(w) - w->input.top + ((WIN_HEIGHT(w) + w->input.top + w->input.bottom) / 2));
 
-			// Top right
-			box.extents.x1 = WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset;
-			box.extents.y1 = WIN_Y(w) - w->input.top - glowSize + glowOffset;
-			box.extents.x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right + glowSize - glowOffset;
-			box.extents.y2 = WIN_Y(w) - w->input.top + glowOffset;
+	quadMatrix->xx = -1.0f / glowSize;
+	quadMatrix->yy = -1.0f / glowSize;
+	quadMatrix->x0 = 1.0 - (box->x1 * quadMatrix->xx);
+	quadMatrix->y0 = 1.0 - (box->y1 * quadMatrix->yy);
 
-			matrix = gs->glowTexture.matrix;
-			matrix.xx = -1.0f / glowSize;
-			matrix.yy = -1.0f / glowSize;
-			matrix.x0 = 1.0 - (box.extents.x1 * matrix.xx);
-			matrix.y0 = 1.0 - (box.extents.y1 * matrix.yy);
+	/* Bottom left corner */
+	box = &gw->glowQuads[GLOWQUAD_BOTTOMLEFT].box;
+	gw->glowQuads[GLOWQUAD_BOTTOMLEFT].matrix = *matrix;
+	quadMatrix = &gw->glowQuads[GLOWQUAD_BOTTOMLEFT].matrix;
 
-			if (box.extents.x1 < box.extents.x2 &&
-				box.extents.y1 < box.extents.y2) {
-				(*w->screen->addWindowGeometry) (w, &matrix, 1, &box, region);
-			}
+	box->x1 = WIN_X(w) - w->input.left - glowSize + glowOffset;
+	box->y1 = MAX(WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset,
+		WIN_Y(w) - w->input.top + ((WIN_HEIGHT(w) + w->input.top + w->input.bottom) / 2));
+	box->x2 = MIN(WIN_X(w) - w->input.left + glowOffset, 
+		WIN_X(w) - w->input.left + ((WIN_WIDTH(w) + w->input.left + w->input.right) / 2));
+	box->y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom + glowSize - glowOffset;
 
-			if (attrib->opacity != gw->oldOpacity)
-				damageScreenRegion (w->screen, &box);
+	quadMatrix->xx = 1.0f / glowSize;
+	quadMatrix->yy = 1.0f / glowSize;
+	quadMatrix->x0 = -(box->x1 * quadMatrix->xx);
+	quadMatrix->y0 = -(box->y1 * quadMatrix->yy);
 
-			// Bottom left
-			box.extents.x1 = WIN_X(w) - w->input.left - glowSize + glowOffset;
-			box.extents.y1 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset;
-			box.extents.x2 = WIN_X(w) - w->input.left + glowOffset;
-			box.extents.y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom + glowSize - glowOffset;
+	/* Bottom right corner */
+	box = &gw->glowQuads[GLOWQUAD_BOTTOMRIGHT].box;
+	gw->glowQuads[GLOWQUAD_BOTTOMRIGHT].matrix = *matrix;
+	quadMatrix = &gw->glowQuads[GLOWQUAD_BOTTOMRIGHT].matrix;
 
-			matrix.xx = 1.0f / glowSize;
-			matrix.yy = 1.0f / glowSize;
-			matrix.x0 = -(box.extents.x1 * matrix.xx);
-			matrix.y0 = -(box.extents.y1 * matrix.yy);
+	box->x1 = MAX(WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset, 
+		WIN_X(w) - w->input.left + ((WIN_WIDTH(w) + w->input.left + w->input.right) / 2));
+	box->y1 = MAX(WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset,
+		WIN_Y(w) - w->input.top + ((WIN_HEIGHT(w) + w->input.top + w->input.bottom) / 2));
+	box->x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right + glowSize - glowOffset;
+	box->y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom + glowSize - glowOffset;
 
-			if (box.extents.x1 < box.extents.x2 &&
-				box.extents.y1 < box.extents.y2) {
-				(*w->screen->addWindowGeometry) (w, &matrix, 1, &box, region);
-			}
+	quadMatrix->xx = -1.0f / glowSize;
+	quadMatrix->yy = 1.0f / glowSize;
+	quadMatrix->x0 = 1.0 - (box->x1 * quadMatrix->xx);
+	quadMatrix->y0 = -(box->y1 * quadMatrix->yy);
 
-			if (attrib->opacity != gw->oldOpacity)
-				damageScreenRegion (w->screen, &box);
+	/* Top edge */
+	box = &gw->glowQuads[GLOWQUAD_TOP].box;
+	gw->glowQuads[GLOWQUAD_TOP].matrix = *matrix;
+	quadMatrix = &gw->glowQuads[GLOWQUAD_TOP].matrix;
 
-			// Bottom right
-			box.extents.x1 = WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset;
-			box.extents.y1 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset;
-			box.extents.x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right + glowSize - glowOffset;
-			box.extents.y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom + glowSize - glowOffset;
+	box->x1 = WIN_X(w) - w->input.left + glowOffset;
+	box->y1 = WIN_Y(w) - w->input.top - glowSize + glowOffset;
+	box->x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset;
+	box->y2 = WIN_Y(w) - w->input.top + glowOffset;
 
-			matrix = gs->glowTexture.matrix;
-			matrix.xx = -1.0f / glowSize;
-			matrix.yy = 1.0f / glowSize;
-			matrix.x0 = 1.0 - (box.extents.x1 * matrix.xx);
-			matrix.y0 = -(box.extents.y1 * matrix.yy);
+	quadMatrix->xx = 0.0f;
+	quadMatrix->yy = -1.0f / glowSize;
+	quadMatrix->x0 = 1.0;
+	quadMatrix->y0 = 1.0 - (box->y1 * quadMatrix->yy);
 
-			if (box.extents.x1 < box.extents.x2 &&
-				box.extents.y1 < box.extents.y2) {
-				(*w->screen->addWindowGeometry) (w, &matrix, 1, &box, region);
-			}
+	/* Bottom edge */
+	box = &gw->glowQuads[GLOWQUAD_BOTTOM].box;
+	gw->glowQuads[GLOWQUAD_BOTTOM].matrix = *matrix;
+	quadMatrix = &gw->glowQuads[GLOWQUAD_BOTTOM].matrix;
 
-			if (attrib->opacity != gw->oldOpacity)
-				damageScreenRegion (w->screen, &box);
+	box->x1 = WIN_X(w) - w->input.left + glowOffset;
+	box->y1 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset;
+	box->x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset;
+	box->y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom + glowSize - glowOffset;
 
-			// top
-			box.extents.x1 = WIN_X(w) - w->input.left + glowOffset;
-			box.extents.y1 = WIN_Y(w) - w->input.top - glowSize + glowOffset;
-			box.extents.x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset;
-			box.extents.y2 = WIN_Y(w) - w->input.top + glowOffset;
+	quadMatrix->xx = 0.0f;
+	quadMatrix->yy = 1.0f / glowSize;
+	quadMatrix->x0 = 1.0;
+	quadMatrix->y0 = -(box->y1 * quadMatrix->yy);
 
-			matrix = gs->glowTexture.matrix;
-			matrix.xx = 0.0f;
-			matrix.yy = -1.0f / glowSize;
-			matrix.x0 = 1.0;
-			matrix.y0 = 1.0 - (box.extents.y1 * matrix.yy);
+	/* Left edge */
+	box = &gw->glowQuads[GLOWQUAD_LEFT].box;
+	gw->glowQuads[GLOWQUAD_LEFT].matrix = *matrix;
+	quadMatrix = &gw->glowQuads[GLOWQUAD_LEFT].matrix;
 
-			if (box.extents.x1 < box.extents.x2 &&
-				box.extents.y1 < box.extents.y2) {
-				(*w->screen->addWindowGeometry) (w, &matrix, 1, &box, region);
-			}
+	box->x1 = WIN_X(w) - w->input.left - glowSize + glowOffset;
+	box->y1 = WIN_Y(w) - w->input.top + glowOffset;
+	box->x2 = WIN_X(w) - w->input.left + glowOffset;
+	box->y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset;
 
-			if (attrib->opacity != gw->oldOpacity)
-				damageScreenRegion (w->screen, &box);
+	quadMatrix->xx = 1.0f / glowSize;
+	quadMatrix->yy = 0.0f;
+	quadMatrix->x0 = -(box->x1 * quadMatrix->xx);
+	quadMatrix->y0 = 0.0;
 
-			// bottom
-			box.extents.x1 = WIN_X(w) - w->input.left + glowOffset;
-			box.extents.y1 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset;
-			box.extents.x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset;
-			box.extents.y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom + glowSize - glowOffset;
+	/* Right edge */
+	box = &gw->glowQuads[GLOWQUAD_RIGHT].box;
+	gw->glowQuads[GLOWQUAD_RIGHT].matrix = *matrix;
+	quadMatrix = &gw->glowQuads[GLOWQUAD_RIGHT].matrix;
 
-			matrix = gs->glowTexture.matrix;
-			matrix.xx = 0.0f;
-			matrix.yy = 1.0f / glowSize;
-			matrix.x0 = 1.0;
-			matrix.y0 = -(box.extents.y1 * matrix.yy);
+	box->x1 = WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset;
+	box->y1 = WIN_Y(w) - w->input.top + glowOffset;
+	box->x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right + glowSize - glowOffset;
+	box->y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset;
 
-			if (box.extents.x1 < box.extents.x2 &&
-				box.extents.y1 < box.extents.y2) {
-				(*w->screen->addWindowGeometry) (w, &matrix, 1, &box, region);
-			}
+	quadMatrix->xx = -1.0f / glowSize;
+	quadMatrix->yy = 0.0f;
+	quadMatrix->x0 = 1.0 - (box->x1 * quadMatrix->xx);
+	quadMatrix->y0 = 0.0;
+}
 
-			if (attrib->opacity != gw->oldOpacity)
-				damageScreenRegion (w->screen, &box);
+/*
+ * groupDrawWindow
+ *
+ */
+Bool
+groupDrawWindow(CompWindow * w,
+		const WindowPaintAttrib * attrib,
+		Region region, unsigned int mask)
+{
+    Bool status;
+    GROUP_WINDOW(w);
+    GROUP_SCREEN(w->screen);
 
-			// left
-			box.extents.x1 = WIN_X(w) - w->input.left - glowSize + glowOffset;
-			box.extents.y1 = WIN_Y(w) - w->input.top + glowOffset;
-			box.extents.x2 = WIN_X(w) - w->input.left + glowOffset;
-			box.extents.y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset;
+    if (!(mask & PAINT_WINDOW_SOLID_MASK) && gw->inGroup && gw->glowQuads) {
 
-			matrix.xx = 1.0f / glowSize;
-			matrix.yy = 0.0f;
-			matrix.x0 = -(box.extents.x1 * matrix.xx);
-			matrix.y0 = 0.0;
+		if (mask & PAINT_WINDOW_TRANSFORMED_MASK)
+			region = getInfiniteRegion();
 
-			if (box.extents.x1 < box.extents.x2 &&
-				box.extents.y1 < box.extents.y2) {
-				(*w->screen->addWindowGeometry) (w, &matrix, 1, &box, region);
-			}
+		if (region->numRects) {
+			REGION box;
+			int i;
 
-			if (attrib->opacity != gw->oldOpacity)
-				damageScreenRegion (w->screen, &box);
+			box.rects = &box.extents;
+			box.numRects = 1;
 
-			// right
-			box.extents.x1 = WIN_X(w) + WIN_WIDTH(w) + w->input.right - glowOffset;
-			box.extents.y1 = WIN_Y(w) - w->input.top + glowOffset;
-			box.extents.x2 = WIN_X(w) + WIN_WIDTH(w) + w->input.right + glowSize - glowOffset;
-			box.extents.y2 = WIN_Y(w) + WIN_HEIGHT(w) + w->input.bottom - glowOffset;
+			w->vCount = 0;
 
-			matrix.xx = -1.0f / glowSize;
-			matrix.yy = 0.0f;
-			matrix.x0 = 1.0 - (box.extents.x1 * matrix.xx);
-			matrix.y0 = 0.0;
+			for (i = 0; i < NUM_GLOWQUADS; i++) {
+				box.extents = gw->glowQuads[i].box;
 
-			if (box.extents.x1 < box.extents.x2 &&
-				box.extents.y1 < box.extents.y2) {
-				(*w->screen->addWindowGeometry) (w, &matrix, 1, &box, region);
+				if (box.extents.x1 < box.extents.x2 &&
+				    box.extents.y1 < box.extents.y2) {
+					(*w->screen->addWindowGeometry) (w, 
+						&gw->glowQuads[i].matrix, 1, &box, region);
+				}
+
+				if (attrib->opacity != gw->oldOpacity)
+					damageScreenRegion (w->screen, &box);
 			}
-
-			if (attrib->opacity != gw->oldOpacity)
-				damageScreenRegion (w->screen, &box);
-
 			gw->oldOpacity = attrib->opacity;
 
 			if (w->vCount) {
Index: group.c
===================================================================
--- group.c	(Revision 1861)
+++ group.c	(Arbeitskopie)
@@ -1004,6 +1004,9 @@
 	(*w->screen->windowResizeNotify) (w);
 	WRAP(gs, w->screen, windowResizeNotify, groupWindowResizeNotify);
 
+	if (gw->glowQuads)
+		groupComputeGlowQuads (w, &gs->glowTexture.matrix);
+
 	if (gw->inGroup && !gd->ignoreMode && !gs->queued &&
 	    gs->opt[GROUP_SCREEN_OPTION_RESIZE].value.b) {
 		int rw = WIN_WIDTH(w) - gw->oldWidth;
@@ -1069,6 +1072,8 @@
 	WRAP(gs, w->screen, windowMoveNotify, groupWindowMoveNotify);
 
 	groupUpdatePosBuffer(w, WIN_X(w) + dx, WIN_Y(w) + dy, WIN_WIDTH(w), WIN_HEIGHT(w));
+	if (gw->glowQuads)
+		groupComputeGlowQuads (w, &gs->glowTexture.matrix);
 	
 	if(gs->queued)
 	{