+ window->recreate_pixmap = 0;
+}
+
+void update_window_mask(Compositor *compositor, CompositedWindow *window)
+{
+ Bool bounding_shaped;
+ Bool clip_shaped;
+ int xi, yi;
+ XRectangle *rects;
+ int rect_count;
+ int rect_order;
+ unsigned width;
+ unsigned height;
+ unsigned char *data;
+ int i;
+ unsigned y;
+
+ XShapeQueryExtents(compositor->display, window->window, &bounding_shaped, &xi, &yi, &width, &height, &clip_shaped, &xi, &yi, &width, &height);
+ window->use_mask = bounding_shaped;
+ if(!window->use_mask)
+ return;
+
+ rects = XShapeGetRectangles(compositor->display, window->window, ShapeBounding, &rect_count, &rect_order);
+
+ width = window->width+2*window->border;
+ height = window->height+2*window->border;
+ data = (unsigned char *)malloc(width*height);
+ memset(data, 0, width*height);
+ for(i=0; i<rect_count; ++i)
+ {
+ rects[i].x += window->border;
+ rects[i].y += window->border;
+ if(rects[i].x>=(int)width || rects[i].y>=(int)height)
+ continue;
+
+ if(rects[i].x<0)
+ {
+ if(-rects[i].x>rects[i].width)
+ continue;
+ rects[i].width += rects[i].x;
+ rects[i].x = 0;
+ }
+
+ if(rects[i].y<0)
+ {
+ if(-rects[i].y>rects[i].height)
+ continue;
+ rects[i].height += rects[i].y;
+ rects[i].y = 0;
+ }
+
+ if(rects[i].x+rects[i].width>(int)width)
+ rects[i].width = width-rects[i].x;
+ if(rects[i].y+rects[i].height>(int)height)
+ rects[i].height = height-rects[i].y;
+
+ for(y=0; y<rects[i].height; ++y)
+ {
+ unsigned char *row = data+(rects[i].y+y)*width+rects[i].x;
+ memset(row, 255, rects[i].width);
+ }
+ }
+
+ XFree(rects);
+
+ glBindTexture(GL_TEXTURE_2D, window->mask_texture);
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, data);
+
+ free(data);
+
+ window->recreate_mask = 0;